Alfred Lind-Anderton
/
CAN_Hello_XAVIER
Using CAN bus with (not just NUCLEO) mbed boards
Diff: main.cpp
- 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 - } - } } }