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.

Dependencies:   SEEED_CAN mbed

Fork of Seeed_CAN_Hello_World by Sophie Dexter

Committer:
Just4pLeisure
Date:
Tue Nov 05 23:00:35 2013 +0000
Revision:
0:d3e39839c3e3
Child:
1:d31ce42d53a1
Simple Demo for my Seeed Studios' CAN-BUS Shield library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 0:d3e39839c3e3 1 #include "mbed.h"
Just4pLeisure 0:d3e39839c3e3 2 #include "seeed_can.h"
Just4pLeisure 0:d3e39839c3e3 3
Just4pLeisure 0:d3e39839c3e3 4 SEEED_CAN CAN(SEEED_CAN_CS); // Seeed Studios' CAN-BUS Shield
Just4pLeisure 0:d3e39839c3e3 5 Serial pc(USBTX, USBRX); // USB serial port TTYACM0
Just4pLeisure 0:d3e39839c3e3 6
Just4pLeisure 0:d3e39839c3e3 7 Ticker minute;
Just4pLeisure 0:d3e39839c3e3 8 Timer timestamp;
Just4pLeisure 0:d3e39839c3e3 9
Just4pLeisure 0:d3e39839c3e3 10 void resetTimestamp()
Just4pLeisure 0:d3e39839c3e3 11 {
Just4pLeisure 0:d3e39839c3e3 12 timestamp.reset();
Just4pLeisure 0:d3e39839c3e3 13 }
Just4pLeisure 0:d3e39839c3e3 14
Just4pLeisure 0:d3e39839c3e3 15 int main()
Just4pLeisure 0:d3e39839c3e3 16 {
Just4pLeisure 0:d3e39839c3e3 17 SEEED_CANMessage canMsg;
Just4pLeisure 0:d3e39839c3e3 18
Just4pLeisure 0:d3e39839c3e3 19 printf("Seeed Studios CAN-BUS Shield 'Hello World' program :-)\r\n");
Just4pLeisure 0:d3e39839c3e3 20 timestamp.start();
Just4pLeisure 0:d3e39839c3e3 21 minute.attach(&resetTimestamp, 60.0); // Reset the 'Timestamp' timer every minute
Just4pLeisure 0:d3e39839c3e3 22 CAN.frequency(500000); // init can bus, baudrate: 500k
Just4pLeisure 0:d3e39839c3e3 23 CAN.Mask(0, 0x7FF); // init Masks
Just4pLeisure 0:d3e39839c3e3 24 CAN.Mask(1, 0x7FF, CANStandard); // init Masks
Just4pLeisure 0:d3e39839c3e3 25 CAN.Filter(0, 0x7E8); // init filters - 0x7E8 T8 ECU id
Just4pLeisure 0:d3e39839c3e3 26 while (CAN.read(canMsg)); // Empty any unfiltered messages in the receive buffers
Just4pLeisure 0:d3e39839c3e3 27 // Read and Display the VIN code stored in a GMLAN ECU
Just4pLeisure 0:d3e39839c3e3 28 char VIN[18] = {NULL};
Just4pLeisure 0:d3e39839c3e3 29 // Request VIN using ReadDataByIdentifier method using DID
Just4pLeisure 0:d3e39839c3e3 30 char reqvin[] = {0x02,0x1A,0x90,0x00,0x00,0x00,0x00,0x00};
Just4pLeisure 0:d3e39839c3e3 31 CAN.write(SEEED_CANMessage(0x7E0, reqvin));
Just4pLeisure 0:d3e39839c3e3 32 while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8)));
Just4pLeisure 0:d3e39839c3e3 33 memcpy(VIN+0, canMsg.data+4, 4);
Just4pLeisure 0:d3e39839c3e3 34 // Send Trionic8 a "Flow Control Message to get the rest of the VIN
Just4pLeisure 0:d3e39839c3e3 35 char floctl[] = {0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Just4pLeisure 0:d3e39839c3e3 36 CAN.write(SEEED_CANMessage(0x7E0, floctl));
Just4pLeisure 0:d3e39839c3e3 37 while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8)));
Just4pLeisure 0:d3e39839c3e3 38 memcpy(VIN+4, canMsg.data+1, 7);
Just4pLeisure 0:d3e39839c3e3 39 while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8)));
Just4pLeisure 0:d3e39839c3e3 40 memcpy(VIN+11, canMsg.data+1, 6);
Just4pLeisure 0:d3e39839c3e3 41 printf("VIN code: %s\r\n",VIN);
Just4pLeisure 0:d3e39839c3e3 42 // Display all messages on the CAN-BUS
Just4pLeisure 0:d3e39839c3e3 43 CAN.Mask(0, NULL); // Clear the mask to accept all meassages
Just4pLeisure 0:d3e39839c3e3 44 while (1) {
Just4pLeisure 0:d3e39839c3e3 45 if (CAN.read(canMsg)) {
Just4pLeisure 0:d3e39839c3e3 46 printf("*** T%05dI%03xL%dD", timestamp.read_ms(), canMsg.id, canMsg.len);
Just4pLeisure 0:d3e39839c3e3 47 for (uint32_t i=0; i<canMsg.len; i++)
Just4pLeisure 0:d3e39839c3e3 48 printf("%02x", canMsg.data[i]);
Just4pLeisure 0:d3e39839c3e3 49 printf(" ***\r");
Just4pLeisure 0:d3e39839c3e3 50 }
Just4pLeisure 0:d3e39839c3e3 51 }
Just4pLeisure 0:d3e39839c3e3 52 }