Luis Silvio Cordova Rivadeneira
/
CAN_SPI_modulo
CAN_SPI_modulo_Seed_Studio
main.cpp@1:d31ce42d53a1, 2013-11-06 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Wed Nov 06 20:24:49 2013 +0000
- Revision:
- 1:d31ce42d53a1
- Parent:
- 0:d3e39839c3e3
- Child:
- 2:7e78ba1e5921
Simple Demo for my Seeed Studios' CAN-BUS Shield library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Just4pLeisure | 0:d3e39839c3e3 | 1 | #include "mbed.h" |
Just4pLeisure | 0:d3e39839c3e3 | 2 | #include "seeed_can.h" |
Just4pLeisure | 0:d3e39839c3e3 | 3 | |
Just4pLeisure | 1:d31ce42d53a1 | 4 | SEEED_CAN CAN; // No parameters needed when Seeed Studios' CAN-BUS Shield is plugged into a FRDM-KL25Z mbed |
Just4pLeisure | 1:d31ce42d53a1 | 5 | Serial pc(USBTX, USBRX); // USB serial port TTYACM0 (or COMn in a Windows environment - use device manager to find 'n') |
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 | 1:d31ce42d53a1 | 18 | char VIN[18] = {NULL}; // VIN code is 17 characters long + 1 for string terminator character (NULL or \0) |
Just4pLeisure | 1:d31ce42d53a1 | 19 | char reqvin[] = {0x02,0x1A,0x90,0x00,0x00,0x00,0x00,0x00}; // CAN message to request VIN code |
Just4pLeisure | 1:d31ce42d53a1 | 20 | 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 | 21 | |
Just4pLeisure | 0:d3e39839c3e3 | 22 | printf("Seeed Studios CAN-BUS Shield 'Hello World' program :-)\r\n"); |
Just4pLeisure | 0:d3e39839c3e3 | 23 | timestamp.start(); |
Just4pLeisure | 0:d3e39839c3e3 | 24 | minute.attach(&resetTimestamp, 60.0); // Reset the 'Timestamp' timer every minute |
Just4pLeisure | 1:d31ce42d53a1 | 25 | CAN.open(500000); // Initialise Seeed Studios' CAN-BUS shield with a baudrate of 500 kbps (P-bus) |
Just4pLeisure | 1:d31ce42d53a1 | 26 | CAN.mask(0, 0x7FF); // Configure Mask 0 to check all bits of a Standard CAN message Id |
Just4pLeisure | 1:d31ce42d53a1 | 27 | CAN.mask(1, 0x7FF, CANStandard); // Configure Mask 1 to check all bits of a Standard CAN message Id |
Just4pLeisure | 1:d31ce42d53a1 | 28 | CAN.filter(0, 0x7E8); // Configure Filter 0 - 0x7E8 is the id used by ECUs on GMLAN |
Just4pLeisure | 0:d3e39839c3e3 | 29 | while (CAN.read(canMsg)); // Empty any unfiltered messages in the receive buffers |
Just4pLeisure | 0:d3e39839c3e3 | 30 | // Read and Display the VIN code stored in a GMLAN ECU |
Just4pLeisure | 1:d31ce42d53a1 | 31 | // |
Just4pLeisure | 1:d31ce42d53a1 | 32 | // ***!!! NOTE: Using while(...) as I am here is not a good idea because !!!*** |
Just4pLeisure | 1:d31ce42d53a1 | 33 | // ***!!! this 'Hello World' will get stuck if the message never arrives !!!*** |
Just4pLeisure | 1:d31ce42d53a1 | 34 | // ***!!! I should really perform checking and include a timeout. !!!*** |
Just4pLeisure | 1:d31ce42d53a1 | 35 | // ***!!! It's sort of OK for a quick demo (Just don't show Nigel Jones) !!!*** |
Just4pLeisure | 1:d31ce42d53a1 | 36 | // |
Just4pLeisure | 1:d31ce42d53a1 | 37 | CAN.write(SEEED_CANMessage(0x7E0, reqvin)); // Request VIN using ReadDataByIdentifier method (GMLAN_DID) |
Just4pLeisure | 1:d31ce42d53a1 | 38 | while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8))); // Wait for the response |
Just4pLeisure | 1:d31ce42d53a1 | 39 | 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 | 1:d31ce42d53a1 | 40 | CAN.write(SEEED_CANMessage(0x7E0, floctl)); // Send Trionic8 a "Flow Control Message to get the rest of the VIN |
Just4pLeisure | 1:d31ce42d53a1 | 41 | while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8))); // Wait for the 1st continuation message |
Just4pLeisure | 1:d31ce42d53a1 | 42 | memcpy(VIN+4, canMsg.data+1, 7); // 1st Byte is message continuation sequence number, last 7 bytes are next 7 characters of VIN |
Just4pLeisure | 1:d31ce42d53a1 | 43 | while (!(CAN.read(canMsg) && (canMsg.id == 0x7E8))); // Wait for the last message |
Just4pLeisure | 1:d31ce42d53a1 | 44 | 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 | 45 | printf("VIN code: %s\r\n",VIN); |
Just4pLeisure | 0:d3e39839c3e3 | 46 | // Display all messages on the CAN-BUS |
Just4pLeisure | 1:d31ce42d53a1 | 47 | CAN.monitor(1); // Select Moniter mode to listen only (do not ack messages on the CAN bus) |
Just4pLeisure | 1:d31ce42d53a1 | 48 | CAN.mask(0, NULL); // Clear acceptance mask 0 (i.e. accept all meassages) |
Just4pLeisure | 0:d3e39839c3e3 | 49 | while (1) { |
Just4pLeisure | 0:d3e39839c3e3 | 50 | if (CAN.read(canMsg)) { |
Just4pLeisure | 0:d3e39839c3e3 | 51 | printf("*** T%05dI%03xL%dD", timestamp.read_ms(), canMsg.id, canMsg.len); |
Just4pLeisure | 0:d3e39839c3e3 | 52 | for (uint32_t i=0; i<canMsg.len; i++) |
Just4pLeisure | 0:d3e39839c3e3 | 53 | printf("%02x", canMsg.data[i]); |
Just4pLeisure | 0:d3e39839c3e3 | 54 | printf(" ***\r"); |
Just4pLeisure | 0:d3e39839c3e3 | 55 | } |
Just4pLeisure | 0:d3e39839c3e3 | 56 | } |
Just4pLeisure | 0:d3e39839c3e3 | 57 | } |