![](/media/cache/group/logo_thTzkVQ.jpg.50x50_q85.jpg)
NUMAKER CAN sample
Diff: main.cpp
- Revision:
- 0:df0aeb0c8f2c
- Child:
- 5:499978915868
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Oct 18 12:18:01 2016 +0000 @@ -0,0 +1,119 @@ +#include "cmsis_os.h" +#include "mbed.h" +#include "CAN.h" + + +DigitalOut led1(LED1, 1); //LED R OFF +DigitalOut led2(LED2, 1); //LED G OFF +DigitalOut led3(LED3, 1); //LED B OFF + +#define CAN_TX_MODE_TEST 0 +#define CAN_RX_MODE_TEST 1 +#define CAN_RX_IRQ_EN 1 +#define LED_ALL_OFF led1=led2=led3=1 + +#define MSG_NUM_INDEX 5 // 0 ~ 31 +#define CAN_DEV_ID 0x1AC + +#if defined(TARGET_NUMAKER_PFM_NUC472) +CAN canObj(PA_0, PA_1); +#elif defined(TARGET_NUMAKER_PFM_M453) +CAN canObj(PA_13,PA_12); +#endif + +CANMessage canMsg; + +osThreadId mainThreadID; + +static int read_MsgObj() +{ +int i=0; + + i = canObj.read(canMsg, MSG_NUM_INDEX); + + switch (canMsg.data[0]) + { + case 0: + LED_ALL_OFF; + led1=0; + break; + + case 1: + LED_ALL_OFF; + led2=0; + break; + + case 2: + LED_ALL_OFF; + led3=0; + break; + + default: + LED_ALL_OFF; + break; + } + + return i; +} + +void irq_callback(void) +{ + if(read_MsgObj() ) + osSignalSet(mainThreadID, 0x06); +} + +int main() { + int i=0; + char data[8]={0}; + + mainThreadID = osThreadGetId(); + + /* Set Frequency 1khz~1000khz */ + canObj.frequency(1000000); + +#if CAN_RX_MODE_TEST + +#if CAN_RX_IRQ_EN + /* Attach irq function */ + canObj.attach(irq_callback, CAN::RxIrq); +#endif + + canObj.filter(CAN_DEV_ID, 0, CANStandard, MSG_NUM_INDEX); + +#endif + + while (true) + { + + +#if CAN_TX_MODE_TEST + + canObj.write(CANMessage(CAN_DEV_ID, data)); + + if(data[0] == 2) + data[0]=0; + else + data[0]++; + + memset(&data[1], data[0], 7); + wait(1); + +#endif + +#if CAN_RX_MODE_TEST + +#if (CAN_RX_IRQ_EN) // interrupt mode + /* Wait for receive task to wakeup */ + osSignalWait(0x06, osWaitForever); +#else // pooling mode + if( !read_MsgObj() ) continue; +#endif + + printf("Read ID=%8X, Type=%s, DLC=%d,Data=",canMsg.id,canMsg.format?"EXT":"STD",canMsg.len); + for(i=0; i<canMsg.len; i++) + printf("%02X,",canMsg.data[i]); + printf("\r\n"); +#endif + } + +}