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 12 21:06:15 2013 +0000
Revision:
2:7e78ba1e5921
Parent:
1:d31ce42d53a1
Updated 12-11-2013 to make use of newly working interrupt 'attach' functions/methods

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 2:7e78ba1e5921 4 SEEED_CAN can; // No parameters needed when Seeed Studios' CAN-BUS Shield is plugged into a FRDM-KL25Z mbed
Just4pLeisure 2:7e78ba1e5921 5 // or an LPC1768b and using pins p9, p10, p11, p12 and p13.
Just4pLeisure 1:d31ce42d53a1 6 Serial pc(USBTX, USBRX); // USB serial port TTYACM0 (or COMn in a Windows environment - use device manager to find 'n')
Just4pLeisure 0:d3e39839c3e3 7
Just4pLeisure 0:d3e39839c3e3 8 Ticker minute;
Just4pLeisure 0:d3e39839c3e3 9 Timer timestamp;
Just4pLeisure 0:d3e39839c3e3 10
Just4pLeisure 2:7e78ba1e5921 11 bool msgRxFlag = 0;
Just4pLeisure 2:7e78ba1e5921 12
Just4pLeisure 2:7e78ba1e5921 13 void canInterrupt()
Just4pLeisure 2:7e78ba1e5921 14 {
Just4pLeisure 2:7e78ba1e5921 15 can.attach(NULL); // Disable the interrupt - the application must re-anable the interrupt after it has acted upon it
Just4pLeisure 2:7e78ba1e5921 16 msgRxFlag = 1; // Set a 'Flag' to say that there is an interrupt that needs to be processed
Just4pLeisure 2:7e78ba1e5921 17 }
Just4pLeisure 2:7e78ba1e5921 18
Just4pLeisure 2:7e78ba1e5921 19 void resetTimestamp() // Resets the 'timestamp' Timer (attached to the 'minute' Ticker)
Just4pLeisure 0:d3e39839c3e3 20 {
Just4pLeisure 0:d3e39839c3e3 21 timestamp.reset();
Just4pLeisure 0:d3e39839c3e3 22 }
Just4pLeisure 0:d3e39839c3e3 23
Just4pLeisure 2:7e78ba1e5921 24 void displayMessage() // Display a CAN message if there is one in a receive buffer
Just4pLeisure 2:7e78ba1e5921 25 {
Just4pLeisure 2:7e78ba1e5921 26 SEEED_CANMessage canMsg;
Just4pLeisure 2:7e78ba1e5921 27
Just4pLeisure 2:7e78ba1e5921 28 if (can.read(canMsg)) {
Just4pLeisure 2:7e78ba1e5921 29 printf("*** T%05dI%03xL%dD", timestamp.read_ms(), canMsg.id, canMsg.len); // Show a Timestamp in ms, message Id and message Length
Just4pLeisure 2:7e78ba1e5921 30 for (uint32_t i = 0; i < canMsg.len; i++)
Just4pLeisure 2:7e78ba1e5921 31 printf("%02x", canMsg.data[i]); // Show the message's data bytes in Hex representation
Just4pLeisure 2:7e78ba1e5921 32 printf(" ***\r");
Just4pLeisure 2:7e78ba1e5921 33 }
Just4pLeisure 2:7e78ba1e5921 34 }
Just4pLeisure 2:7e78ba1e5921 35
Just4pLeisure 0:d3e39839c3e3 36 int main()
Just4pLeisure 0:d3e39839c3e3 37 {
Just4pLeisure 0:d3e39839c3e3 38 SEEED_CANMessage canMsg;
Just4pLeisure 1:d31ce42d53a1 39 char VIN[18] = {NULL}; // VIN code is 17 characters long + 1 for string terminator character (NULL or \0)
Just4pLeisure 1:d31ce42d53a1 40 char reqvin[] = {0x02,0x1A,0x90,0x00,0x00,0x00,0x00,0x00}; // CAN message to request VIN code
Just4pLeisure 1:d31ce42d53a1 41 char floctl[] = {0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; // CAN message to request all remaining frames in a multi-frame message
Just4pLeisure 0:d3e39839c3e3 42
Just4pLeisure 0:d3e39839c3e3 43 printf("Seeed Studios CAN-BUS Shield 'Hello World' program :-)\r\n");
Just4pLeisure 0:d3e39839c3e3 44 timestamp.start();
Just4pLeisure 0:d3e39839c3e3 45 minute.attach(&resetTimestamp, 60.0); // Reset the 'Timestamp' timer every minute
Just4pLeisure 2:7e78ba1e5921 46 can.open(500000, SEEED_CAN::Config); // Initialise Seeed Studios' CAN-BUS shield with a baudrate of 500 kbps (P-bus)
Just4pLeisure 2:7e78ba1e5921 47 can.mask(0, 0x7FF); // Configure Mask 0 to check all bits of a Standard CAN message Id
Just4pLeisure 2:7e78ba1e5921 48 can.mask(1, 0x7FF, CANStandard); // Configure Mask 1 to check all bits of a Standard CAN message Id
Just4pLeisure 2:7e78ba1e5921 49 can.filter(0, 0x7E8); // Configure Filter 0 - 0x7E8 is the id used by ECUs on GMLAN
Just4pLeisure 0:d3e39839c3e3 50 // Read and Display the VIN code stored in a GMLAN ECU
Just4pLeisure 2:7e78ba1e5921 51 //
Just4pLeisure 1:d31ce42d53a1 52 // ***!!! NOTE: Using while(...) as I am here is not a good idea because !!!***
Just4pLeisure 1:d31ce42d53a1 53 // ***!!! this 'Hello World' will get stuck if the message never arrives !!!***
Just4pLeisure 1:d31ce42d53a1 54 // ***!!! I should really perform checking and include a timeout. !!!***
Just4pLeisure 1:d31ce42d53a1 55 // ***!!! It's sort of OK for a quick demo (Just don't show Nigel Jones) !!!***
Just4pLeisure 2:7e78ba1e5921 56 //
Just4pLeisure 2:7e78ba1e5921 57 can.write(SEEED_CANMessage(0x7E0, reqvin)); // Request VIN using ReadDataByIdentifier method (GMLAN_DID)
Just4pLeisure 2:7e78ba1e5921 58 while (!(can.read(canMsg) && (canMsg.id == 0x7E8))); // Wait for the response
Just4pLeisure 1:d31ce42d53a1 59 memcpy(VIN+0, canMsg.data+4, 4); // 1st 4 Bytes are part of message protocol, last 4 bytes are 1st 4 characters of VIN
Just4pLeisure 2:7e78ba1e5921 60 can.write(SEEED_CANMessage(0x7E0, floctl)); // Send Trionic8 a "Flow Control Message to get the rest of the VIN
Just4pLeisure 2:7e78ba1e5921 61 while (!(can.read(canMsg) && (canMsg.id == 0x7E8))); // Wait for the 1st continuation message
Just4pLeisure 1:d31ce42d53a1 62 memcpy(VIN+4, canMsg.data+1, 7); // 1st Byte is message continuation sequence number, last 7 bytes are next 7 characters of VIN
Just4pLeisure 2:7e78ba1e5921 63 while (!(can.read(canMsg) && (canMsg.id == 0x7E8))); // Wait for the last message
Just4pLeisure 1:d31ce42d53a1 64 memcpy(VIN+11, canMsg.data+1, 6); // 1st Byte is message continuation sequence number, last 6 bytes are remaining characters of VIN
Just4pLeisure 0:d3e39839c3e3 65 printf("VIN code: %s\r\n",VIN);
Just4pLeisure 0:d3e39839c3e3 66 // Display all messages on the CAN-BUS
Just4pLeisure 2:7e78ba1e5921 67 can.monitor(1); // Select Moniter mode to listen only (do not ack messages on the CAN bus)
Just4pLeisure 2:7e78ba1e5921 68 can.mask(0, NULL); // Clear acceptance mask 0 (i.e. accept all meassages)
Just4pLeisure 2:7e78ba1e5921 69 can.attach(&canInterrupt, SEEED_CAN::RxAny);
Just4pLeisure 0:d3e39839c3e3 70 while (1) {
Just4pLeisure 2:7e78ba1e5921 71 if (msgRxFlag) {
Just4pLeisure 2:7e78ba1e5921 72 displayMessage();
Just4pLeisure 2:7e78ba1e5921 73 if (can.interrupts(SEEED_CAN::RxAny)) {
Just4pLeisure 2:7e78ba1e5921 74 msgRxFlag = 0;
Just4pLeisure 2:7e78ba1e5921 75 can.attach(&canInterrupt, SEEED_CAN::RxAny);
Just4pLeisure 2:7e78ba1e5921 76 }
Just4pLeisure 0:d3e39839c3e3 77 }
Just4pLeisure 0:d3e39839c3e3 78 }
Just4pLeisure 0:d3e39839c3e3 79 }