TLMoto

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

Committer:
hudakz
Date:
Sun Jul 19 09:09:42 2015 +0000
Revision:
0:c5e5d0df6f2a
Child:
1:267d6288df33
rev 00

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:c5e5d0df6f2a 1 /*
hudakz 0:c5e5d0df6f2a 2 * An example showing how to use the CANnucleo library:
hudakz 0:c5e5d0df6f2a 3 *
hudakz 0:c5e5d0df6f2a 4 * Two NUCLEO boards are connected to the same CAN bus via CAN transceivers (MPC2551 or TJA1040, or etc.).
hudakz 0:c5e5d0df6f2a 5 * Transceivers are not part of the NUCLEO boards, therefore must be added by you.
hudakz 0:c5e5d0df6f2a 6 * Remember also that CAN bus must be terminated with 120 Ohm resitors on both ends.
hudakz 0:c5e5d0df6f2a 7 * See <https://developer.mbed.org/users/WiredHome/notebook/can---getting-started/>
hudakz 0:c5e5d0df6f2a 8 * The same source code is used for both NUCLEO boards, but:
hudakz 0:c5e5d0df6f2a 9 * For board #1 compile the example without any change.
hudakz 0:c5e5d0df6f2a 10 * For board #2 set BOARD1 to 0
hudakz 0:c5e5d0df6f2a 11 *
hudakz 0:c5e5d0df6f2a 12 * Note:
hudakz 0:c5e5d0df6f2a 13 * To simplify adding/getting data to/from a CAN message
hudakz 0:c5e5d0df6f2a 14 * inserter "<<" and extractor ">>" operators have been defined.
hudakz 0:c5e5d0df6f2a 15 * Please be aware that CAN message maximum data length is limited to eight bytes.
hudakz 0:c5e5d0df6f2a 16 * To make sure this limitation is not violated I recommend to first compile
hudakz 0:c5e5d0df6f2a 17 * your application with DEBUG enabled in "CAN.h" file.
hudakz 0:c5e5d0df6f2a 18 * Then run it and check for error messages.
hudakz 0:c5e5d0df6f2a 19 */
hudakz 0:c5e5d0df6f2a 20
hudakz 0:c5e5d0df6f2a 21 #include "mbed.h"
hudakz 0:c5e5d0df6f2a 22 #include "CAN.h"
hudakz 0:c5e5d0df6f2a 23
hudakz 0:c5e5d0df6f2a 24 #define BOARD1 1 // please change to 0 when compiling for board #2
hudakz 0:c5e5d0df6f2a 25
hudakz 0:c5e5d0df6f2a 26 #if defined(BOARD1)
hudakz 0:c5e5d0df6f2a 27 #define RX_ID 0x100
hudakz 0:c5e5d0df6f2a 28 #define TX_ID 0x101
hudakz 0:c5e5d0df6f2a 29 #else
hudakz 0:c5e5d0df6f2a 30 #define RX_ID 0x101
hudakz 0:c5e5d0df6f2a 31 #define TX_ID 0x100
hudakz 0:c5e5d0df6f2a 32 #endif
hudakz 0:c5e5d0df6f2a 33
hudakz 0:c5e5d0df6f2a 34 DigitalOut led(LED1);
hudakz 0:c5e5d0df6f2a 35 Timer timer;
hudakz 0:c5e5d0df6f2a 36 CAN can(PA_11, PA_12); // rx, tx
hudakz 0:c5e5d0df6f2a 37 CANMessage rxMsg;
hudakz 0:c5e5d0df6f2a 38 CANMessage txMsg;
hudakz 0:c5e5d0df6f2a 39 long int counter;
hudakz 0:c5e5d0df6f2a 40 volatile bool msgAvailable = false;
hudakz 0:c5e5d0df6f2a 41
hudakz 0:c5e5d0df6f2a 42 /**
hudakz 0:c5e5d0df6f2a 43 * @brief 'CAN receive-complete' interrup handler.
hudakz 0:c5e5d0df6f2a 44 * @note Called on arrival of new CAN message.
hudakz 0:c5e5d0df6f2a 45 * Keep it as short as possible.
hudakz 0:c5e5d0df6f2a 46 * @param
hudakz 0:c5e5d0df6f2a 47 * @retval
hudakz 0:c5e5d0df6f2a 48 */
hudakz 0:c5e5d0df6f2a 49 void onMsgReceived() {
hudakz 0:c5e5d0df6f2a 50 msgAvailable = true;
hudakz 0:c5e5d0df6f2a 51 }
hudakz 0:c5e5d0df6f2a 52
hudakz 0:c5e5d0df6f2a 53 /**
hudakz 0:c5e5d0df6f2a 54 * @brief Main
hudakz 0:c5e5d0df6f2a 55 * @note
hudakz 0:c5e5d0df6f2a 56 * @param
hudakz 0:c5e5d0df6f2a 57 * @retval
hudakz 0:c5e5d0df6f2a 58 */
hudakz 0:c5e5d0df6f2a 59 int main() {
hudakz 0:c5e5d0df6f2a 60 can.frequency(500000); // Initialize CAN and set bit rate to 500kbs
hudakz 0:c5e5d0df6f2a 61 can.attach(&onMsgReceived, CAN::RxIrq); // attach 'CAN receive complete' interrupt handler
hudakz 0:c5e5d0df6f2a 62 timer.reset();
hudakz 0:c5e5d0df6f2a 63 #if defined(BOARD1)
hudakz 0:c5e5d0df6f2a 64 led = 1;
hudakz 0:c5e5d0df6f2a 65 timer.start();
hudakz 0:c5e5d0df6f2a 66 #else
hudakz 0:c5e5d0df6f2a 67 led = 0;
hudakz 0:c5e5d0df6f2a 68 #endif
hudakz 0:c5e5d0df6f2a 69
hudakz 0:c5e5d0df6f2a 70 while(1) {
hudakz 0:c5e5d0df6f2a 71 if(timer.read() >= 2.0) { // check for timeout
hudakz 0:c5e5d0df6f2a 72 timer.stop(); // stop timer
hudakz 0:c5e5d0df6f2a 73 timer.reset(); // reset timer (to avaoid repeated send)
hudakz 0:c5e5d0df6f2a 74 counter++; // increment counter
hudakz 0:c5e5d0df6f2a 75 txMsg.clear(); // clear Tx message storage
hudakz 0:c5e5d0df6f2a 76 txMsg.id = TX_ID; // set ID
hudakz 0:c5e5d0df6f2a 77 txMsg << counter; // append first data item (always make sure that CAN message total data lenght <= 8 bytes!)
hudakz 0:c5e5d0df6f2a 78 txMsg << led.read(); // append second data item (always make sure that CAN message total data lenght <= 8 bytes!)
hudakz 0:c5e5d0df6f2a 79 can.write(txMsg); // transmit message
hudakz 0:c5e5d0df6f2a 80 printf("CAN message sent\r\n");
hudakz 0:c5e5d0df6f2a 81 led = 0; // turn off led
hudakz 0:c5e5d0df6f2a 82 }
hudakz 0:c5e5d0df6f2a 83 if(msgAvailable) {
hudakz 0:c5e5d0df6f2a 84 msgAvailable = false; // reset flag for next use
hudakz 0:c5e5d0df6f2a 85 can.read(rxMsg); // read message into Rx message storage
hudakz 0:c5e5d0df6f2a 86 printf("CAN message with ID = %x received\r\n", rxMsg.id);
hudakz 0:c5e5d0df6f2a 87 if(rxMsg.id == RX_ID) { // if ID matches
hudakz 0:c5e5d0df6f2a 88 rxMsg >> counter; // extract first data item
hudakz 0:c5e5d0df6f2a 89 rxMsg >> led; // extract second data item (and set led status)
hudakz 0:c5e5d0df6f2a 90 printf("counter = %d", counter);
hudakz 0:c5e5d0df6f2a 91 timer.start();
hudakz 0:c5e5d0df6f2a 92 }
hudakz 0:c5e5d0df6f2a 93 }
hudakz 0:c5e5d0df6f2a 94 }
hudakz 0:c5e5d0df6f2a 95 }
hudakz 0:c5e5d0df6f2a 96
hudakz 0:c5e5d0df6f2a 97