TLMoto

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

main.cpp

Committer:
hudakz
Date:
2016-07-29
Revision:
15:6449443e2207
Parent:
14:e12ebd1260b1
Child:
16:a86f339d1c25

File content as of revision 15:6449443e2207:

/*
 * An example of using CAN bus with NUCLEO boards:
 *
 * Two affordable (less than $3 on ebay) STM32F103C8T6 boards compatible with the NUCLEO-F103RB platform
 * 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 24
 *
 * 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 
 *
 * 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 
    const int OFF = 1;
    const int ON  = 0;
#else
    #define   LED_PIN   LED1
    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

DigitalOut      led(LED_PIN);
Timer           timer;
CAN             can(PA_11, PA_12);  // CAN RD pin name, CAN TD pin name
CANMessage      rxMsg;
char            counter = 0;

int main() {   
#if defined(BOARD1)
    led = ON;       // turn LED on
    timer.start();  // start timer
#else
    led = OFF;      // turn LED off
#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"); 
            else
                printf("Transmission error\r\n\r\n");
        }
        if(can.read(rxMsg)) {                               // check for new message
            printf("CAN message received:\r\n");            // print message details
            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");
           
            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
            }
        }
    }
}