NUMAKER CAN sample

Committer:
cyliang
Date:
Tue Oct 18 12:18:01 2016 +0000
Revision:
0:df0aeb0c8f2c
Child:
5:499978915868
CAN sample with RX and TX on NuMaker_PFM platform

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cyliang 0:df0aeb0c8f2c 1 #include "cmsis_os.h"
cyliang 0:df0aeb0c8f2c 2 #include "mbed.h"
cyliang 0:df0aeb0c8f2c 3 #include "CAN.h"
cyliang 0:df0aeb0c8f2c 4
cyliang 0:df0aeb0c8f2c 5
cyliang 0:df0aeb0c8f2c 6 DigitalOut led1(LED1, 1); //LED R OFF
cyliang 0:df0aeb0c8f2c 7 DigitalOut led2(LED2, 1); //LED G OFF
cyliang 0:df0aeb0c8f2c 8 DigitalOut led3(LED3, 1); //LED B OFF
cyliang 0:df0aeb0c8f2c 9
cyliang 0:df0aeb0c8f2c 10 #define CAN_TX_MODE_TEST 0
cyliang 0:df0aeb0c8f2c 11 #define CAN_RX_MODE_TEST 1
cyliang 0:df0aeb0c8f2c 12 #define CAN_RX_IRQ_EN 1
cyliang 0:df0aeb0c8f2c 13 #define LED_ALL_OFF led1=led2=led3=1
cyliang 0:df0aeb0c8f2c 14
cyliang 0:df0aeb0c8f2c 15 #define MSG_NUM_INDEX 5 // 0 ~ 31
cyliang 0:df0aeb0c8f2c 16 #define CAN_DEV_ID 0x1AC
cyliang 0:df0aeb0c8f2c 17
cyliang 0:df0aeb0c8f2c 18 #if defined(TARGET_NUMAKER_PFM_NUC472)
cyliang 0:df0aeb0c8f2c 19 CAN canObj(PA_0, PA_1);
cyliang 0:df0aeb0c8f2c 20 #elif defined(TARGET_NUMAKER_PFM_M453)
cyliang 0:df0aeb0c8f2c 21 CAN canObj(PA_13,PA_12);
cyliang 0:df0aeb0c8f2c 22 #endif
cyliang 0:df0aeb0c8f2c 23
cyliang 0:df0aeb0c8f2c 24 CANMessage canMsg;
cyliang 0:df0aeb0c8f2c 25
cyliang 0:df0aeb0c8f2c 26 osThreadId mainThreadID;
cyliang 0:df0aeb0c8f2c 27
cyliang 0:df0aeb0c8f2c 28 static int read_MsgObj()
cyliang 0:df0aeb0c8f2c 29 {
cyliang 0:df0aeb0c8f2c 30 int i=0;
cyliang 0:df0aeb0c8f2c 31
cyliang 0:df0aeb0c8f2c 32 i = canObj.read(canMsg, MSG_NUM_INDEX);
cyliang 0:df0aeb0c8f2c 33
cyliang 0:df0aeb0c8f2c 34 switch (canMsg.data[0])
cyliang 0:df0aeb0c8f2c 35 {
cyliang 0:df0aeb0c8f2c 36 case 0:
cyliang 0:df0aeb0c8f2c 37 LED_ALL_OFF;
cyliang 0:df0aeb0c8f2c 38 led1=0;
cyliang 0:df0aeb0c8f2c 39 break;
cyliang 0:df0aeb0c8f2c 40
cyliang 0:df0aeb0c8f2c 41 case 1:
cyliang 0:df0aeb0c8f2c 42 LED_ALL_OFF;
cyliang 0:df0aeb0c8f2c 43 led2=0;
cyliang 0:df0aeb0c8f2c 44 break;
cyliang 0:df0aeb0c8f2c 45
cyliang 0:df0aeb0c8f2c 46 case 2:
cyliang 0:df0aeb0c8f2c 47 LED_ALL_OFF;
cyliang 0:df0aeb0c8f2c 48 led3=0;
cyliang 0:df0aeb0c8f2c 49 break;
cyliang 0:df0aeb0c8f2c 50
cyliang 0:df0aeb0c8f2c 51 default:
cyliang 0:df0aeb0c8f2c 52 LED_ALL_OFF;
cyliang 0:df0aeb0c8f2c 53 break;
cyliang 0:df0aeb0c8f2c 54 }
cyliang 0:df0aeb0c8f2c 55
cyliang 0:df0aeb0c8f2c 56 return i;
cyliang 0:df0aeb0c8f2c 57 }
cyliang 0:df0aeb0c8f2c 58
cyliang 0:df0aeb0c8f2c 59 void irq_callback(void)
cyliang 0:df0aeb0c8f2c 60 {
cyliang 0:df0aeb0c8f2c 61 if(read_MsgObj() )
cyliang 0:df0aeb0c8f2c 62 osSignalSet(mainThreadID, 0x06);
cyliang 0:df0aeb0c8f2c 63 }
cyliang 0:df0aeb0c8f2c 64
cyliang 0:df0aeb0c8f2c 65 int main() {
cyliang 0:df0aeb0c8f2c 66 int i=0;
cyliang 0:df0aeb0c8f2c 67 char data[8]={0};
cyliang 0:df0aeb0c8f2c 68
cyliang 0:df0aeb0c8f2c 69 mainThreadID = osThreadGetId();
cyliang 0:df0aeb0c8f2c 70
cyliang 0:df0aeb0c8f2c 71 /* Set Frequency 1khz~1000khz */
cyliang 0:df0aeb0c8f2c 72 canObj.frequency(1000000);
cyliang 0:df0aeb0c8f2c 73
cyliang 0:df0aeb0c8f2c 74 #if CAN_RX_MODE_TEST
cyliang 0:df0aeb0c8f2c 75
cyliang 0:df0aeb0c8f2c 76 #if CAN_RX_IRQ_EN
cyliang 0:df0aeb0c8f2c 77 /* Attach irq function */
cyliang 0:df0aeb0c8f2c 78 canObj.attach(irq_callback, CAN::RxIrq);
cyliang 0:df0aeb0c8f2c 79 #endif
cyliang 0:df0aeb0c8f2c 80
cyliang 0:df0aeb0c8f2c 81 canObj.filter(CAN_DEV_ID, 0, CANStandard, MSG_NUM_INDEX);
cyliang 0:df0aeb0c8f2c 82
cyliang 0:df0aeb0c8f2c 83 #endif
cyliang 0:df0aeb0c8f2c 84
cyliang 0:df0aeb0c8f2c 85 while (true)
cyliang 0:df0aeb0c8f2c 86 {
cyliang 0:df0aeb0c8f2c 87
cyliang 0:df0aeb0c8f2c 88
cyliang 0:df0aeb0c8f2c 89 #if CAN_TX_MODE_TEST
cyliang 0:df0aeb0c8f2c 90
cyliang 0:df0aeb0c8f2c 91 canObj.write(CANMessage(CAN_DEV_ID, data));
cyliang 0:df0aeb0c8f2c 92
cyliang 0:df0aeb0c8f2c 93 if(data[0] == 2)
cyliang 0:df0aeb0c8f2c 94 data[0]=0;
cyliang 0:df0aeb0c8f2c 95 else
cyliang 0:df0aeb0c8f2c 96 data[0]++;
cyliang 0:df0aeb0c8f2c 97
cyliang 0:df0aeb0c8f2c 98 memset(&data[1], data[0], 7);
cyliang 0:df0aeb0c8f2c 99 wait(1);
cyliang 0:df0aeb0c8f2c 100
cyliang 0:df0aeb0c8f2c 101 #endif
cyliang 0:df0aeb0c8f2c 102
cyliang 0:df0aeb0c8f2c 103 #if CAN_RX_MODE_TEST
cyliang 0:df0aeb0c8f2c 104
cyliang 0:df0aeb0c8f2c 105 #if (CAN_RX_IRQ_EN) // interrupt mode
cyliang 0:df0aeb0c8f2c 106 /* Wait for receive task to wakeup */
cyliang 0:df0aeb0c8f2c 107 osSignalWait(0x06, osWaitForever);
cyliang 0:df0aeb0c8f2c 108 #else // pooling mode
cyliang 0:df0aeb0c8f2c 109 if( !read_MsgObj() ) continue;
cyliang 0:df0aeb0c8f2c 110 #endif
cyliang 0:df0aeb0c8f2c 111
cyliang 0:df0aeb0c8f2c 112 printf("Read ID=%8X, Type=%s, DLC=%d,Data=",canMsg.id,canMsg.format?"EXT":"STD",canMsg.len);
cyliang 0:df0aeb0c8f2c 113 for(i=0; i<canMsg.len; i++)
cyliang 0:df0aeb0c8f2c 114 printf("%02X,",canMsg.data[i]);
cyliang 0:df0aeb0c8f2c 115 printf("\r\n");
cyliang 0:df0aeb0c8f2c 116 #endif
cyliang 0:df0aeb0c8f2c 117 }
cyliang 0:df0aeb0c8f2c 118
cyliang 0:df0aeb0c8f2c 119 }