comit to publish

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

main.cpp

Committer:
hudakz
Date:
2016-08-11
Revision:
18:22977a898fe9
Parent:
17:18d4d0ff26a6
Child:
19:872e304d7e17

File content as of revision 18:22977a898fe9:

/*
 * 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/CANnucleo_Hello/>
 *
 * NOTE: If you'd like to use the official NUCLEO boards comment out line 22
 *
 * 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 23 before compiling 
 *
 * Once the binaries have been downloaded to the boards reset board #1.
 *
 */ 

#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)
    #include "stm32f103c8t6.h"
    const int OFF = 1;
    const int ON  = 0;
#else
    const int OFF = 0;
    const int ON  = 1;
#endif

#if defined(BOARD1)
    const unsigned int RX_ID = 0x100;
    const unsigned int TX_ID = 0x101;
#else
    const unsigned int RX_ID = 0x101;
    const unsigned int TX_ID = 0x100;
#endif

#include "mbed.h"
#include "CANnucleo.h"

/* 
 * To avaoid name collision with the CAN and CANMessage classes built into the mbed library
 * the CANnucleo's CAN and CANMessage classes have been moved into the CANnucleo namespace.
 * So remember to qualify them with the CANnucleo namespace.
 */
CANnucleo::CAN          can(PA_11, PA_12);  // CAN Rx pin name, CAN Tx pin name
CANnucleo::CANMessage   rxMsg;
CANnucleo::CANMessage   txMsg;
DigitalOut              led(LED1);
int                     ledState;
Timer                   timer;
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() {
#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

    while(1) {
        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");
        }
        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);
            printf("  Length = %d\r\n", rxMsg.len);
            printf("  Data   =");            
            for(int i = 0; i < rxMsg.len; i++)
                printf(" 0x%.2x", rxMsg.data[i]);
            printf("\r\n");
            // 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
            }
        }
    }
}