Interior CAN bus monitoring of Dodge/Chrysler vehicles

Dependencies:   mbed

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