TLMoto

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

Revision:
16:a86f339d1c25
Parent:
15:6449443e2207
Child:
17:18d4d0ff26a6
--- a/main.cpp	Fri Jul 29 10:24:45 2016 +0000
+++ b/main.cpp	Sun Jul 31 21:36:52 2016 +0000
@@ -1,35 +1,32 @@
 /*
- * An example of using CAN bus with NUCLEO boards:
+ * An example showing how to use the CANnucleo library:
  *
- * Two affordable (less than $3 on ebay) STM32F103C8T6 boards compatible with the NUCLEO-F103RB platform
+ * Two affordable (less than $4 on ebay) STM32F103C8T6 boards (20kB SRAM, 64kB Flash), 
+ * compatible with the NUCLEO-F103RB platform (20kB SRAM, 128kB Flash), 
  * 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.
  *
- * For more details see the wiki page [https://developer.mbed.org/users/hudakz/code/CANnucleo_Hello/]
+ * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CANnucleo_Hello/>
  *
- * NOTE: If you'd like to use the official NUCLEO boards comment out line 24
+ * NOTE: If you'd like to use the official NUCLEO boards comment out line 25
  *
  * The same code is used for both NUCLEO boards, but:
  *      For board #1 compile the example without any change.
- *      For board #2 comment out line 25 before compiling 
+ *      For board #2 comment out line 26 before compiling 
  *
  * Once the binaries have been downloaded to the boards reset board #1.
  *
  */ 
 
-
-#include "mbed.h"
-
 //#define TARGET_STM32F103C8T6  1     // comment out this line when using official NUCLEO boards!                                    
 #define BOARD1                1     // comment out this line when compiling for board #2
 
-#if defined(TARGET_STM32F103C8T6) 
-    #define   LED_PIN   PC_13 
+#if defined(TARGET_STM32F103C8T6)
+    #include "stm32f103c8t6.h"
     const int OFF = 1;
     const int ON  = 0;
 #else
-    #define   LED_PIN   LED1
     const int OFF = 0;
     const int ON  = 1;
 #endif
@@ -42,35 +39,71 @@
     const unsigned int TX_ID = 0x100;
 #endif
 
-DigitalOut      led(LED_PIN);
+#include "mbed.h"
+#include "CANnucleo.h"
+
+DigitalOut      led(LED1);
+int             ledState;
 Timer           timer;
-CAN             can(PA_11, PA_12);  // CAN RD pin name, CAN TD pin name
+CAN             can(PA_11, PA_12);  // CAN Rx pin name, CAN Tx pin name
 CANMessage      rxMsg;
-char            counter = 0;
+CANMessage      txMsg;
+int             counter = 0;
+volatile bool   msgAvailable = false;
 
-int main() {   
+/**
+ * @brief   'CAN receive-complete' interrup handler.
+ * @note    Called on arrival of new CAN message.
+ *          Keep it as short as possible.
+ * @param   
+ * @retval  
+ */
+void onMsgReceived() {
+    msgAvailable = true;
+}
+
+/**
+ * @brief   Main
+ * @note
+ * @param 
+ * @retval
+ */
+int main() {
+#if defined(TARGET_STM32F103C8T6)
+    confSysClock();
+#endif
+    can.frequency(1000000);                     // set bit rate to 1Mbps
+    can.attach(&onMsgReceived);                 // attach 'CAN receive-complete' interrupt handler
+    
 #if defined(BOARD1)
     led = ON;       // turn LED on
     timer.start();  // start timer
+    printf("CANnucleo_Hello board #1\r\n");
 #else
     led = OFF;      // turn LED off
+    printf("CANnucleo_Hello board #2\r\n");
 #endif
 
-    can.frequency(1000000);                                 // set bit rate to 1Mbps
-    
     while(1) {
-        if(timer.read_ms() >= 1000) {                       // check for timeout
-            timer.stop();                                   // stop timer
-            timer.reset();                                  // reset timer
-            counter++;                                      // increment counter
-            led = OFF;                                      // turn LED off
-            if(can.write(CANMessage(TX_ID, &counter, 1)))   // transmit message
-                printf("CAN message sent\r\n\r\n"); 
+        if(timer.read() >= 1.0) {               // check for timeout
+            timer.stop();                       // stop timer
+            timer.reset();                      // reset timer
+            counter++;                          // increment counter
+            ledState = led.read();              // get led state
+            txMsg.clear();                      // clear Tx message storage
+            txMsg.id = TX_ID;                   // set ID
+            txMsg << counter;                   // append first data item
+            txMsg << ledState;                  // append second data item (total data lenght must be <= 8 bytes!)
+            led = OFF;                          // turn LED off
+            if(can.write(txMsg))                // transmit message
+                printf("CAN message sent\r\n"); 
             else
-                printf("Transmission error\r\n\r\n");
+                printf("Transmission error\r\n");
         }
-        if(can.read(rxMsg)) {                               // check for new message
-            printf("CAN message received:\r\n");            // print message details
+        if(msgAvailable) {
+            msgAvailable = false;               // reset flag for next use
+            can.read(rxMsg);                    // read message into Rx message storage
+            printf("CAN message received:\r\n");
             printf("  ID     = 0x%.3x\r\n", rxMsg.id);
             printf("  Type   = %d\r\n", rxMsg.type);
             printf("  Format = %d\r\n", rxMsg.format);
@@ -79,12 +112,13 @@
             for(int i = 0; i < rxMsg.len; i++)
                 printf(" 0x%.2x", rxMsg.data[i]);
             printf("\r\n");
-           
-            if(rxMsg.id == RX_ID) {             
-                counter = rxMsg.data[0];                    // set counter
-                printf("counter = %d\r\n\r\n", counter);    // print counter
-                led = ON;                                   // turn LED on
-                timer.start();                              // transmission lag
+            // Filtering performed by software:           
+            if(rxMsg.id == RX_ID) {             // See comments in CAN.cpp for filtering performed by hardware
+                rxMsg >> counter;               // extract first data item
+                rxMsg >> ledState;              // extract second data item
+                printf("  counter = %d\r\n", counter);
+                led = ON;                       // turn LED on
+                timer.start();                  // transmission lag
             }
         }
     }