
Interior CAN bus monitoring of Dodge/Chrysler vehicles
main.cpp
- Committer:
- rtgree01
- Date:
- 2011-01-31
- Revision:
- 0:5f0cd7bd1389
- Child:
- 1:d8284a72815e
File content as of revision 0:5f0cd7bd1389:
#include "mbed.h" #include "CAN.h" Ticker ticker; DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); Serial pc(USBTX, USBRX); // tx, rx // CAN_RS pin at Philips PCA82C250 can bus controller. // activate transceiver by pulling this pin to GND. // (Rise and fall slope controlled by resistor R_s) // (+5V result in tranceiver standby mode) // For further information see datasheet page 4 DigitalOut can_Pca82c250SlopePin(p28); // second can controller on these pins. Not used here. // CAN can1(p9, p10); // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). CAN can2(p30, p29); CAN can1(p9, p10); char counter = 0; bool sendme = false; CANMessage can_MsgTx; CANMessage can_MsgRx; char msg[14]; int main() { pc.baud(115200); // pc.printf("Starting CAN Monitor\r\n"); can1.frequency(500000); LPC_CAN2->BTR = 0x52001C; // pc.printf("CAN Freq = 0x%08x\r\n", LPC_CAN2->BTR); // activate external can transceiver can_Pca82c250SlopePin = 0; // every 500ms // ticker.attach(&send, 0.5); /// create message object for message reception while (1) { // send received messages to the pc via serial line (9k6, 8n1) if (can2.read(can_MsgRx)) { // sync pc.putc(0xff); pc.putc(0x00); pc.putc(0xff); // data pc.putc((can_MsgRx.id & 0xff00) >> 8); pc.putc((can_MsgRx.id & 0x00ff)); pc.putc(can_MsgRx.len); for (int i = 0; i < can_MsgRx.len; i++) { pc.putc(can_MsgRx.data[i]); } // any incoming message: toggle led2 led2 = !led2; } if (can1.read(can_MsgRx)) { // sync pc.putc(0xff); pc.putc(0x00); pc.putc(0xff); // data pc.putc((can_MsgRx.id & 0xff00) >> 8); pc.putc((can_MsgRx.id & 0x00ff)); pc.putc(can_MsgRx.len); for (int i = 0; i < can_MsgRx.len; i++) { pc.putc(can_MsgRx.data[i]); } // any incoming message: toggle led2 led3 = !led3; } while (pc.readable()) { msg[counter] = pc.getc(); counter++; if (counter == 14) { break; } if (counter == 3) { if ((msg[0] != 0xff) || (msg[1] != 0x00) || (msg[2] != 0xff)) { counter = 0; msg[0] = msg[1]; msg[1] = msg[2]; } } } if (counter > 13) { counter = 0; sendme = false; if ((msg[0] == 0xff) && (msg[1] == 0x00) && (msg[2] == 0xff)) { char temp[14]; memcpy(temp, msg, 14); memset(msg, 0, 14); can_MsgTx.id = (((short)temp[3]) << 8) + temp[4]; can_MsgTx.len = temp[5]; for (int i = 0; i < 8; i++) { can_MsgTx.data[i] = temp[6 + i]; } //send the message led1 = !led1; can2.write(can_MsgTx); } } } }