Using CAN bus with (not just NUCLEO) mbed boards

Dependencies:   mbed CANMsg

Revision:
1:6f8ffb2c2dd7
Parent:
0:1b9561cd1c36
Child:
2:6546e4a2d593
--- a/main.cpp	Fri Mar 17 16:38:46 2017 +0000
+++ b/main.cpp	Sat Mar 18 18:37:21 2017 +0000
@@ -1,34 +1,26 @@
 /*
- * A demo showing how to use CAN bus and the CANMsg library's << (append) and the >> (extract) operators
+ * An example showing how to use the mbed CAN API:
  *
  * Two affordable (less than $3 on ebay) STM32F103C8T6 boards (20kB SRAM, 64kB Flash),
+ * (see [https://developer.mbed.org/users/hudakz/code/STM32F103C8T6_Hello/] for more details)
  * are connected to the same CAN bus via transceivers (MCP2551 or TJA1040, or etc.).
  * CAN transceivers are not part of NUCLEO boards, therefore must be added by you.
  * Remember also that CAN bus (even a short one) must be terminated with 120 Ohm resitors at both ends.
- * In this demo, the mbed board is transmitting two data items to the CAN bus.
- *   counter: uint_8 value (one byte).
- *   voltage: floating point value (four bytes).
- * So the total length of payload data is five bytes.
- * The "<<" (append) operator is used to add data to the CAN message.
- * If a CAN message is received its ID is checked. If there is match with the awaited ID
- * then data is extracted from the CAN message using the ">>" (extract) operator.
+ *
+ * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Hello/>
  *
- * The usage of "<<" and ">>" operators is similar to the C++ io-stream ones.
- * Data length of CAN message is automatically updated when using "<<" or ">>" operators.  
- *
- * For schematic see the wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Hello/>
+ * NOTE: If you'd like to use an STM32F103C8T6 board uncomment line 23
  *
- * NOTE: If you'd like to use an STM32F103C8T6 board uncomment line 28
- *
- * The same code is used for both NUCLEO boards, but:
+ * The same code is used for both mbed boards, but:
  *      For board #1 compile the example without any change.
- *      For board #2 comment out line 27 before compilation
+ *      For board #2 comment out line 23 before compiling
  *
  * Once the binaries have been downloaded to the boards reset board #1.
  *
  */
-#define BOARD1                  1   // comment out this line when compiling for board #2
-//#define TARGET_STM32F103C8T6    1   // uncomment this line when using STM32F103C8T6 boards!
+#define BOARD1                  1       // comment out this line when compiling for board #2
+
+//#define TARGET_STM32F103C8T6    1       // uncomment this line when using STM32F103C8T6 boards!
 
 #if defined(TARGET_STM32F103C8T6)
 #include "stm32f103c8t6.h"
@@ -47,12 +39,11 @@
 const unsigned int  RX_ID = 0x101;
 const unsigned int  TX_ID = 0x100;
 #endif
-
 #include "mbed.h"
 #include "CANMsg.h"
 
-Serial              pc(USBTX, USBRX);
-CAN                 can(PA_11, PA_12);    // CAN Rx pin name, CAN Tx pin name
+Serial              pc(PA_2, PA_3);
+CAN                 can(PA_11, PA_12);  // CAN Rx pin name, CAN Tx pin name
 CANMsg              rxMsg;
 CANMsg              txMsg;
 DigitalOut          led(LED_PIN);
@@ -64,10 +55,10 @@
 /**
  * @brief   Prints CAN msg to PC's serial terminal
  * @note}
- * @param   CANMess to print
+ * @param   CANMessage to print
  * @retval  none
  */
-void printMsg(CANMsg& msg) {
+void printMsg(CANMessage& msg) {
     pc.printf("  ID      = 0x%.3x\r\n", msg.id);
     pc.printf("  Type    = %d\r\n", msg.type);
     pc.printf("  Format  = %d\r\n", msg.format);
@@ -87,36 +78,29 @@
 int main(void)
 {
 #if defined(TARGET_STM32F103C8T6)
-    confSysClock(); //Configure system clock (72MHz HSE clock, 48MHz USB clock)
+    confSysClock();         //Configure system clock (72MHz HSE clock, 48MHz USB clock)
 #endif
-
-    pc.baud(9600);  // set Serial speed
-    can.frequency(1000000);        // set bit rate to 1Mbps
-    
+    pc.baud(9600);          // set Serial speed
+    can.frequency(1000000); // set bit rate to 1Mbps
 #if defined(BOARD1)
-    led = ON;       // turn LED on
-    timer.start();  // start timer
-    pc.printf("CANnucleo_Hello board #1\r\n");
+    led = ON;               // turn the LED on
+    timer.start();          // start timer
+    pc.printf("CAN_Hello board #1\r\n");
 #else
     led = OFF;      // turn LED off
-    pc.printf("CANnucleo_Hello board #2\r\n");
+    pc.printf("CAN_Hello board #2\r\n");
 #endif
-
     while(1) {
-        if(timer.read_ms() >= 1000) {
-
-            // check for timeout
-            timer.stop();   // stop timer
-            timer.reset();  // reset timer
-            counter++;      // increment counter
-            voltage = (analogIn * 3.3f) / 4096.0f;  // read the small drifting voltage from analog input
-            txMsg.clear();      // clear Tx message storage
-            txMsg.id = TX_ID;   // set ID
-            txMsg << counter << voltage;    // append data (total data length must be <= 8 bytes!)
-            if(can.write(txMsg)) {
-
-                // transmit message
-                led = OFF;          // turn LED off
+        if(timer.read_ms() >= 1000) {   // check for timeout
+            timer.stop();               // stop timer
+            timer.reset();              // reset timer
+            counter++;                  // increment counter
+            voltage = (analogIn * 3.3f) / 4096.0f;    // read the small drifting voltage from analog input
+            txMsg.clear();              // clear Tx message storage
+            txMsg.id = TX_ID;           // set ID
+            txMsg << counter << voltage;// append data (total data length must be <= 8 bytes!)
+            if(can.write(txMsg)) {      // transmit message
+                led = OFF;              // turn the LED off
                 pc.printf("-------------------------------------\r\n");
                 pc.printf("CAN message sent\r\n");
                 printMsg(txMsg);
@@ -128,7 +112,7 @@
         }
 
         if(can.read(rxMsg)) {
-            led = ON;   // turn LED on
+            led = ON;       // turn the LED on
             pc.printf("-------------------------------------\r\n");
             pc.printf("CAN message received\r\n");
             printMsg(rxMsg);
@@ -138,7 +122,7 @@
                 rxMsg >> counter >> voltage;    // extract data from the received CAN message
                 pc.printf("  counter = %d\r\n", counter);
                 pc.printf("  voltage = %e V\r\n", voltage);
-                timer.start();  // transmission lag
+                timer.start();                  // transmission lag
             }
         }
     }