Team Bath Racing Electric / Mbed 2 deprecated MBED_CAN

Dependencies:   mbed

Committer:
ahdyer
Date:
Tue Feb 19 10:02:29 2019 +0000
Revision:
0:f9b3d6a82c03
5-Axis accelerator

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ahdyer 0:f9b3d6a82c03 1 // CAN_MONITOR with filtering 2012/03/21 ym1784
ahdyer 0:f9b3d6a82c03 2
ahdyer 0:f9b3d6a82c03 3 #include "mbed.h"
ahdyer 0:f9b3d6a82c03 4 #include "CAN.h"
ahdyer 0:f9b3d6a82c03 5
ahdyer 0:f9b3d6a82c03 6 Serial pc(USBTX, USBRX); // tx, rx
ahdyer 0:f9b3d6a82c03 7 DigitalOut led2(LED2);
ahdyer 0:f9b3d6a82c03 8 DigitalOut led1(LED1);
ahdyer 0:f9b3d6a82c03 9 // Tiker for sending messges
ahdyer 0:f9b3d6a82c03 10 Ticker ticker;
ahdyer 0:f9b3d6a82c03 11
ahdyer 0:f9b3d6a82c03 12 int CAN_ID = 1;
ahdyer 0:f9b3d6a82c03 13 char counter = 1;
ahdyer 0:f9b3d6a82c03 14
ahdyer 0:f9b3d6a82c03 15 // CAN2 on mbed pins 29(CAN_TXD) and 30(CAN_RXD) using MCP2551.
ahdyer 0:f9b3d6a82c03 16 CAN can2(p30, p29);
ahdyer 0:f9b3d6a82c03 17 CAN can1(p9, p10);
ahdyer 0:f9b3d6a82c03 18 /*--------------------------------------------
ahdyer 0:f9b3d6a82c03 19 setup acceptance filter for CAN controller 2
ahdyer 0:f9b3d6a82c03 20 original http://www.dragonwake.com/download/LPC1768/Example/CAN/CAN.c
ahdyer 0:f9b3d6a82c03 21 simplified for CAN2 interface and std id (11 bit) only
ahdyer 0:f9b3d6a82c03 22 *--------------------------------------------*/
ahdyer 0:f9b3d6a82c03 23 void CAN2_wrFilter (uint32_t id) {
ahdyer 0:f9b3d6a82c03 24 static int CAN_std_cnt = 0;
ahdyer 0:f9b3d6a82c03 25 uint32_t buf0, buf1;
ahdyer 0:f9b3d6a82c03 26 int cnt1, cnt2, bound1;
ahdyer 0:f9b3d6a82c03 27
ahdyer 0:f9b3d6a82c03 28 /* Acceptance Filter Memory full */
ahdyer 0:f9b3d6a82c03 29 if (((CAN_std_cnt + 1) >> 1) >= 512)
ahdyer 0:f9b3d6a82c03 30 return; /* error: objects full */
ahdyer 0:f9b3d6a82c03 31
ahdyer 0:f9b3d6a82c03 32 /* Setup Acceptance Filter Configuration
ahdyer 0:f9b3d6a82c03 33 Acceptance Filter Mode Register = Off */
ahdyer 0:f9b3d6a82c03 34 LPC_CANAF->AFMR = 0x00000001;
ahdyer 0:f9b3d6a82c03 35
ahdyer 0:f9b3d6a82c03 36 id |= 1 << 13; /* Add controller number(2) */
ahdyer 0:f9b3d6a82c03 37 id &= 0x0000F7FF; /* Mask out 16-bits of ID */
ahdyer 0:f9b3d6a82c03 38
ahdyer 0:f9b3d6a82c03 39 if (CAN_std_cnt == 0) { /* For entering first ID */
ahdyer 0:f9b3d6a82c03 40 LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16);
ahdyer 0:f9b3d6a82c03 41 } else if (CAN_std_cnt == 1) { /* For entering second ID */
ahdyer 0:f9b3d6a82c03 42 if ((LPC_CANAF_RAM->mask[0] >> 16) > id)
ahdyer 0:f9b3d6a82c03 43 LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16);
ahdyer 0:f9b3d6a82c03 44 else
ahdyer 0:f9b3d6a82c03 45 LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id;
ahdyer 0:f9b3d6a82c03 46 } else {
ahdyer 0:f9b3d6a82c03 47 /* Find where to insert new ID */
ahdyer 0:f9b3d6a82c03 48 cnt1 = 0;
ahdyer 0:f9b3d6a82c03 49 cnt2 = CAN_std_cnt;
ahdyer 0:f9b3d6a82c03 50 bound1 = (CAN_std_cnt - 1) >> 1;
ahdyer 0:f9b3d6a82c03 51 while (cnt1 <= bound1) { /* Loop through standard existing IDs */
ahdyer 0:f9b3d6a82c03 52 if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) {
ahdyer 0:f9b3d6a82c03 53 cnt2 = cnt1 * 2;
ahdyer 0:f9b3d6a82c03 54 break;
ahdyer 0:f9b3d6a82c03 55 }
ahdyer 0:f9b3d6a82c03 56 if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) {
ahdyer 0:f9b3d6a82c03 57 cnt2 = cnt1 * 2 + 1;
ahdyer 0:f9b3d6a82c03 58 break;
ahdyer 0:f9b3d6a82c03 59 }
ahdyer 0:f9b3d6a82c03 60 cnt1++; /* cnt1 = U32 where to insert new ID */
ahdyer 0:f9b3d6a82c03 61 } /* cnt2 = U16 where to insert new ID */
ahdyer 0:f9b3d6a82c03 62
ahdyer 0:f9b3d6a82c03 63 if (cnt1 > bound1) { /* Adding ID as last entry */
ahdyer 0:f9b3d6a82c03 64 if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */
ahdyer 0:f9b3d6a82c03 65 LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16);
ahdyer 0:f9b3d6a82c03 66 else /* Odd number of IDs exists */
ahdyer 0:f9b3d6a82c03 67 LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id;
ahdyer 0:f9b3d6a82c03 68 } else {
ahdyer 0:f9b3d6a82c03 69 buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */
ahdyer 0:f9b3d6a82c03 70 if ((cnt2 & 0x0001) == 0) /* Insert new mask to even address */
ahdyer 0:f9b3d6a82c03 71 buf1 = (id << 16) | (buf0 >> 16);
ahdyer 0:f9b3d6a82c03 72 else /* Insert new mask to odd address */
ahdyer 0:f9b3d6a82c03 73 buf1 = (buf0 & 0xFFFF0000) | id;
ahdyer 0:f9b3d6a82c03 74
ahdyer 0:f9b3d6a82c03 75 LPC_CANAF_RAM->mask[cnt1] = buf1; /* Insert mask */
ahdyer 0:f9b3d6a82c03 76
ahdyer 0:f9b3d6a82c03 77 bound1 = CAN_std_cnt >> 1;
ahdyer 0:f9b3d6a82c03 78 /* Move all remaining standard mask entries one place up */
ahdyer 0:f9b3d6a82c03 79 while (cnt1 < bound1) {
ahdyer 0:f9b3d6a82c03 80 cnt1++;
ahdyer 0:f9b3d6a82c03 81 buf1 = LPC_CANAF_RAM->mask[cnt1];
ahdyer 0:f9b3d6a82c03 82 LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16);
ahdyer 0:f9b3d6a82c03 83 buf0 = buf1;
ahdyer 0:f9b3d6a82c03 84 }
ahdyer 0:f9b3d6a82c03 85
ahdyer 0:f9b3d6a82c03 86 if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */
ahdyer 0:f9b3d6a82c03 87 LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | (0x0000FFFF);
ahdyer 0:f9b3d6a82c03 88 }
ahdyer 0:f9b3d6a82c03 89 }
ahdyer 0:f9b3d6a82c03 90 CAN_std_cnt++;
ahdyer 0:f9b3d6a82c03 91
ahdyer 0:f9b3d6a82c03 92 /* Calculate std ID start address (buf0) and ext ID start address <- none (buf1) */
ahdyer 0:f9b3d6a82c03 93 buf0 = ((CAN_std_cnt + 1) >> 1) << 2;
ahdyer 0:f9b3d6a82c03 94 buf1 = buf0;
ahdyer 0:f9b3d6a82c03 95
ahdyer 0:f9b3d6a82c03 96 /* Setup acceptance filter pointers */
ahdyer 0:f9b3d6a82c03 97 LPC_CANAF->SFF_sa = 0;
ahdyer 0:f9b3d6a82c03 98 LPC_CANAF->SFF_GRP_sa = buf0;
ahdyer 0:f9b3d6a82c03 99 LPC_CANAF->EFF_sa = buf0;
ahdyer 0:f9b3d6a82c03 100 LPC_CANAF->EFF_GRP_sa = buf1;
ahdyer 0:f9b3d6a82c03 101 LPC_CANAF->ENDofTable = buf1;
ahdyer 0:f9b3d6a82c03 102
ahdyer 0:f9b3d6a82c03 103 LPC_CANAF->AFMR = 0x00000000; /* Use acceptance filter */
ahdyer 0:f9b3d6a82c03 104 } // CAN2_wrFilter
ahdyer 0:f9b3d6a82c03 105
ahdyer 0:f9b3d6a82c03 106 void send() {
ahdyer 0:f9b3d6a82c03 107 pc.printf("send()\n\r");
ahdyer 0:f9b3d6a82c03 108 if(can1.write(CANMessage(CAN_ID, &counter, 1))) {
ahdyer 0:f9b3d6a82c03 109 pc.printf("wloop()\n\r");
ahdyer 0:f9b3d6a82c03 110 pc.printf("Message sent: %d with can ID: %d \n\r", counter, CAN_ID);
ahdyer 0:f9b3d6a82c03 111 if (CAN_ID < 3)
ahdyer 0:f9b3d6a82c03 112 {
ahdyer 0:f9b3d6a82c03 113 CAN_ID ++;
ahdyer 0:f9b3d6a82c03 114 }
ahdyer 0:f9b3d6a82c03 115 else
ahdyer 0:f9b3d6a82c03 116 {
ahdyer 0:f9b3d6a82c03 117 CAN_ID = 1;
ahdyer 0:f9b3d6a82c03 118 }
ahdyer 0:f9b3d6a82c03 119 }
ahdyer 0:f9b3d6a82c03 120 led1 = !led1;
ahdyer 0:f9b3d6a82c03 121 }
ahdyer 0:f9b3d6a82c03 122
ahdyer 0:f9b3d6a82c03 123 int main() {
ahdyer 0:f9b3d6a82c03 124 pc.baud(921600);
ahdyer 0:f9b3d6a82c03 125 pc.printf("CAN_MONITOR 921600 bps\r\n");
ahdyer 0:f9b3d6a82c03 126
ahdyer 0:f9b3d6a82c03 127 // 500kbit/s
ahdyer 0:f9b3d6a82c03 128 can1.frequency(500000);
ahdyer 0:f9b3d6a82c03 129 can2.frequency(500000);
ahdyer 0:f9b3d6a82c03 130 CANMessage can_MsgRx;
ahdyer 0:f9b3d6a82c03 131
ahdyer 0:f9b3d6a82c03 132 CAN2_wrFilter(0x178);
ahdyer 0:f9b3d6a82c03 133 CAN2_wrFilter(0x1C4);
ahdyer 0:f9b3d6a82c03 134 CAN2_wrFilter(0x245);
ahdyer 0:f9b3d6a82c03 135 CAN2_wrFilter(0x3D3);
ahdyer 0:f9b3d6a82c03 136 CAN2_wrFilter(0x498);
ahdyer 0:f9b3d6a82c03 137 CAN2_wrFilter(0x4A6);
ahdyer 0:f9b3d6a82c03 138 //ticker.attach(&send, 1);
ahdyer 0:f9b3d6a82c03 139 int Yaw_Byte1, Yaw_Byte2, Yaw, Y_Acc_Byte1, Y_Acc_Byte2, Y_Acc, Roll_Byte1, Roll_Byte2, Roll, X_Acc_Byte1, X_Acc_Byte2, X_Acc, Z_Acc_Byte1, Z_Acc_Byte2, Z_Acc;
ahdyer 0:f9b3d6a82c03 140
ahdyer 0:f9b3d6a82c03 141 while (1) {
ahdyer 0:f9b3d6a82c03 142 // send received messages to the pc via serial line
ahdyer 0:f9b3d6a82c03 143 if (can2.read(can_MsgRx)) {
ahdyer 0:f9b3d6a82c03 144 pc.printf("Can ID: %d, Message Length: %d", can_MsgRx.id, can_MsgRx.len);
ahdyer 0:f9b3d6a82c03 145 if(can_MsgRx.id == 372)
ahdyer 0:f9b3d6a82c03 146 {
ahdyer 0:f9b3d6a82c03 147 Yaw_Byte1 = can_MsgRx.data[0];
ahdyer 0:f9b3d6a82c03 148 Yaw_Byte2 = can_MsgRx.data[1]<<8; // shift right to normailse the second byte of data, same with others
ahdyer 0:f9b3d6a82c03 149 Y_Acc_Byte1 = can_MsgRx.data[4];
ahdyer 0:f9b3d6a82c03 150 Y_Acc_Byte2 = can_MsgRx.data[5]<<8; //^
ahdyer 0:f9b3d6a82c03 151 }
ahdyer 0:f9b3d6a82c03 152 if(can_MsgRx.id == 376)
ahdyer 0:f9b3d6a82c03 153 {
ahdyer 0:f9b3d6a82c03 154 Roll_Byte1 = can_MsgRx.data[0];
ahdyer 0:f9b3d6a82c03 155 Roll_Byte2 = can_MsgRx.data[1]<<8; //^
ahdyer 0:f9b3d6a82c03 156 X_Acc_Byte1 = can_MsgRx.data[4];
ahdyer 0:f9b3d6a82c03 157 X_Acc_Byte2 = can_MsgRx.data[5]<<8; //^
ahdyer 0:f9b3d6a82c03 158 }
ahdyer 0:f9b3d6a82c03 159 if(can_MsgRx.id == 380)
ahdyer 0:f9b3d6a82c03 160 {
ahdyer 0:f9b3d6a82c03 161 Z_Acc_Byte1 = can_MsgRx.data[4];
ahdyer 0:f9b3d6a82c03 162 Z_Acc_Byte2 = can_MsgRx.data[5]<<8; //^
ahdyer 0:f9b3d6a82c03 163 }
ahdyer 0:f9b3d6a82c03 164 //Calculate actual data by adding both bytes and the offset anf then normalising
ahdyer 0:f9b3d6a82c03 165 Yaw = (Yaw_Byte1 + Yaw_Byte2 - 32768)*0.005;
ahdyer 0:f9b3d6a82c03 166 Y_Acc = (Y_Acc_Byte1 + Y_Acc_Byte2 - 32768)*0.0001274;
ahdyer 0:f9b3d6a82c03 167 Roll = (Roll_Byte1 + Roll_Byte2 - 32768)*0.005;
ahdyer 0:f9b3d6a82c03 168 X_Acc = (X_Acc_Byte1 + X_Acc_Byte2 - 32768)*0.0001274;
ahdyer 0:f9b3d6a82c03 169 Z_Acc = (Z_Acc_Byte1 + Z_Acc_Byte2 - 32768)*0.0001274;
ahdyer 0:f9b3d6a82c03 170
ahdyer 0:f9b3d6a82c03 171 // show the id of the messege being read
ahdyer 0:f9b3d6a82c03 172 // print all of the data to pc serial
ahdyer 0:f9b3d6a82c03 173 pc.printf("Yaw: %d\n\r", Yaw);
ahdyer 0:f9b3d6a82c03 174 pc.printf("Roll: %d\n\r", Roll);
ahdyer 0:f9b3d6a82c03 175 pc.printf("Y_Acc: %d\n\r", Y_Acc);
ahdyer 0:f9b3d6a82c03 176 pc.printf("X_Acc: %d\n\r", X_Acc);
ahdyer 0:f9b3d6a82c03 177 pc.printf("Z_Acc: %d\n\r", Z_Acc);
ahdyer 0:f9b3d6a82c03 178 pc.printf("\r\n");
ahdyer 0:f9b3d6a82c03 179 // toggle led2
ahdyer 0:f9b3d6a82c03 180 led2 = !led2;
ahdyer 0:f9b3d6a82c03 181 } // if
ahdyer 0:f9b3d6a82c03 182 } // while
ahdyer 0:f9b3d6a82c03 183 } // main