
Interior CAN bus monitoring of Dodge/Chrysler vehicles
Diff: main.cpp
- Revision:
- 0:5f0cd7bd1389
- Child:
- 1:d8284a72815e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jan 31 05:10:57 2011 +0000 @@ -0,0 +1,137 @@ +#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); + } + } + } +} \ No newline at end of file