This 'Hello World' program uses many of the SEEED_CAN library functions to display the VIN number stored in a GMLAN ECU then display all CAN messages on the CAN-BUS.
Fork of Seeed_CAN_Hello_World by
Diff: main.cpp
- Revision:
- 0:d3e39839c3e3
- Child:
- 1:d31ce42d53a1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Nov 05 23:00:35 2013 +0000 @@ -0,0 +1,52 @@ +#include "mbed.h" +#include "seeed_can.h" + +SEEED_CAN CAN(SEEED_CAN_CS); // Seeed Studios' CAN-BUS Shield +Serial pc(USBTX, USBRX); // USB serial port TTYACM0 + +Ticker minute; +Timer timestamp; + +void resetTimestamp() +{ + timestamp.reset(); +} + +int main() +{ + SEEED_CANMessage canMsg; + + printf("Seeed Studios CAN-BUS Shield 'Hello World' program :-)\r\n"); + timestamp.start(); + minute.attach(&resetTimestamp, 60.0); // Reset the 'Timestamp' timer every minute + CAN.frequency(500000); // init can bus, baudrate: 500k + CAN.Mask(0, 0x7FF); // init Masks + CAN.Mask(1, 0x7FF, CANStandard); // init Masks + CAN.Filter(0, 0x7E8); // init filters - 0x7E8 T8 ECU id + while (CAN.read(canMsg)); // Empty any unfiltered messages in the receive buffers +// Read and Display the VIN code stored in a GMLAN ECU + char VIN[18] = {NULL}; +// Request VIN using ReadDataByIdentifier method using DID + char reqvin[] = {0x02,0x1A,0x90,0x00,0x00,0x00,0x00,0x00}; + CAN.write(SEEED_CANMessage(0x7E0, reqvin)); + while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8))); + memcpy(VIN+0, canMsg.data+4, 4); +// Send Trionic8 a "Flow Control Message to get the rest of the VIN + char floctl[] = {0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + CAN.write(SEEED_CANMessage(0x7E0, floctl)); + while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8))); + memcpy(VIN+4, canMsg.data+1, 7); + while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8))); + memcpy(VIN+11, canMsg.data+1, 6); + printf("VIN code: %s\r\n",VIN); +// Display all messages on the CAN-BUS + CAN.Mask(0, NULL); // Clear the mask to accept all meassages + while (1) { + if (CAN.read(canMsg)) { + printf("*** T%05dI%03xL%dD", timestamp.read_ms(), canMsg.id, canMsg.len); + for (uint32_t i=0; i<canMsg.len; i++) + printf("%02x", canMsg.data[i]); + printf(" ***\r"); + } + } +}