Interior CAN bus monitoring of Dodge/Chrysler vehicles

Dependencies:   mbed

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);
            }
        }
    }
}