Using CAN bus with (not just NUCLEO) mbed boards

Dependencies:   mbed CANMsg

Revision:
5:37ab4112d547
Parent:
4:09d564da0e24
Child:
6:c893b98fc2b5
--- a/main.cpp	Wed Apr 25 12:00:10 2018 +0000
+++ b/main.cpp	Tue Feb 05 14:51:20 2019 +0000
@@ -19,17 +19,16 @@
  *
  */
 
-//#define TARGET_STM32F103C8T6    1       // uncomment this line and import the mbed-STM32F103C8T6 library when using STM32F103C8T6 boards!
+//#define TARGET_STM32F103C8T6    1       // uncomment this line when using STM32F103C8T6 boards!
 
 #define BOARD1                  1       // comment out this line when compiling for board #2
 
 #if defined(TARGET_STM32F103C8T6)
-#include "stm32f103c8t6.h"
-#define LED_PIN PC_13
+#define LED_PIN     PC_13
 const int           OFF = 1;
 const int           ON = 0;
 #else
-#define LED_PIN LED1
+#define LED_PIN     LED1
 const int           OFF = 0;
 const int           ON = 1;
 #endif
@@ -59,7 +58,8 @@
  * @param   CANMessage to print
  * @retval
  */
-void printMsg(CANMessage& 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);
@@ -71,6 +71,29 @@
 }
 
 /**
+ * @brief   Handles received CAN messages
+ * @note    Called on CAN msg received interrupt.
+ * @param
+ * @retval
+ */
+void onCanReceived(void)
+{
+    can.read(rxMsg);
+    printMsg(rxMsg);
+
+    if (rxMsg.id == RX_ID) {
+        // extract data from the received CAN message 
+        // in the same order as was added on the transmitter side
+        rxMsg >> counter;
+        rxMsg >> voltage;    
+        pc.printf("  counter = %d\r\n", counter);
+        pc.printf("  voltage = %e V\r\n", voltage);
+    }
+    timer.start(); // to transmit next message
+}
+
+
+/**
  * @brief   Main
  * @note
  * @param
@@ -78,11 +101,11 @@
  */
 int main(void)
 {
-#if defined(TARGET_STM32F103C8T6)
-    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
+    can.filter(RX_ID, 0xFFF, CANStandard, 0); // set filter #0 to accept only standard messages with ID == RX_ID
+    can.attach(onCanReceived);                // attach ISP
+
 #if defined(BOARD1)
     led = ON;               // turn the LED on
     timer.start();          // start timer
@@ -96,10 +119,13 @@
             timer.stop();                // stop timer
             timer.reset();               // reset timer
             counter++;                   // increment counter
-            voltage = analogIn * 3.3f;   // read the small drifting voltage from analog input
+            voltage = analogIn * 3.3f;   // read the small drift 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 not exceed 8 bytes!)
+            // append data (total data length must not exceed 8 bytes!)
+            txMsg << counter;   // one byte
+            txMsg << voltage;   // four bytes
+             
             if(can.write(txMsg)) {       // transmit message
                 led = OFF;               // turn the LED off
                 pc.printf("-------------------------------------\r\n");
@@ -111,20 +137,5 @@
             else
                 pc.printf("Transmission error\r\n");
         }
-
-        if(can.read(rxMsg)) {
-            led = ON;       // turn the LED on
-            pc.printf("-------------------------------------\r\n");
-            pc.printf("CAN message received\r\n");
-            printMsg(rxMsg);
-
-            // Filtering performed by software:
-            if(rxMsg.id == RX_ID) {
-                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
-            }
-        }
     }
 }