I am no longer actively working on the ppCANOpen library, however, I want to publish this project so that anyone who wants to pick up any of the pieces can have a good example. This is a a project I was working on using the ppCANOpen library. It has a pretty in deep use of the object dictionary structure. And a number of functions to control high voltage pinball drivers, if you're into that sort of thing.
Dependencies: CANnucleo mbed ppCANOpen
Diff: main.cpp
- Revision:
- 10:ec59d628ebdc
- Parent:
- 9:8352cfe17ab1
--- a/main.cpp Wed Dec 23 10:38:02 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ -/* - * An example showing how to use the CANnucleo library: - * - * 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/CAN_Nucleo_Hello/> - * - * NOTE: If you'd like to use the official NUCLEO-F103RB boards - * comment out the line #define TARGET_STM32F103C8T6 1 - * - * The same code is used for both NUCLEO boards, but: - * For board #1 compile the example without any change. - * For board #2 comment out the line #define BOARD1 1 before compiling - * - * Once the binaries have been downloaded to the boards reset board #1. - * - */ - -#include "mbed.h" -#include "CAN.h" - -#define BOARD1 1 // comment out this line when compiling for board #2 - -#if defined(BOARD1) - #define RX_ID 0x100 - #define TX_ID 0x101 -#else - #define RX_ID 0x101 - #define TX_ID 0x100 -#endif - -// See wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/> -//#define TARGET_STM32F103C8T6 1 // comment out this line if you'd like to use the official NUCLEO-F103RB boards - -#if defined(TARGET_STM32F103C8T6) - DigitalOut led(PC_13); -#else - DigitalOut led(LED1); -#endif - -int ledReceived; -Timer timer; -CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name, Automatic recovery from bus-off state enabled by default -CANMessage rxMsg; -CANMessage txMsg; -int counter = 0; -volatile bool msgAvailable = false; - -/** - * @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() { - can.frequency(1000000); // set bit rate to 1Mbps - can.attach(&onMsgReceived, CAN::RxIrq); // attach 'CAN receive-complete' interrupt handler - -#if defined(BOARD1) - #if defined(TARGET_STM32F103C8T6) - led = 0; // turn LED on - #else - led = 1; // turn LED on - #endif - timer.start(); -#else - #if defined(TARGET_STM32F103C8T6) - led = 1; // turn LED off - #else - led = 0; // turn LED off - #endif -#endif - - while(1) { - if(timer.read() >= 1.0) { // check for timeout - timer.stop(); // stop timer - timer.reset(); // reset timer (to avaoid repeated send) - counter++; // increment counter - txMsg.clear(); // clear Tx message storage - txMsg.id = TX_ID; // set ID - txMsg << counter; // append first data item (make sure that CAN message total data lenght <= 8 bytes!) - txMsg << led.read(); // append second data item (make sure that CAN message total data lenght <= 8 bytes!) - can.write(txMsg); // transmit message - printf("CAN message sent\r\n"); - - #if defined(TARGET_STM32F103C8T6) - led = 1; // turn LED off - #else - led = 0; // turn LED off - #endif - } - 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 = %#x\r\n", rxMsg.id); - printf(" Type = %d\r\n", rxMsg.type); - printf(" Format = %d\r\n", rxMsg.format); - printf(" Length = %d\r\n", rxMsg.len); - printf(" Data ="); - for(int i = 0; i < rxMsg.len; i++) - printf(" %x", rxMsg.data[i]); - printf("\r\n"); - if(rxMsg.id == RX_ID) { // if ID matches - rxMsg >> counter; // extract first data item - rxMsg >> ledReceived; // extract second data item - led = ledReceived; // set LED - printf("counter = %d\r\n", counter); - timer.start(); - } - } - } -} -