NUMAKER CAN sample

Committer:
ccli8
Date:
Thu Apr 19 11:22:45 2018 +0800
Revision:
5:499978915868
Parent:
0:df0aeb0c8f2c
Child:
6:b9714e564dee
Update to NuMaker-PFM-M487 V3.0 and Mbed OS 5.8.2

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