CAN Receive with STM32 F469NI Discovery LCD display board
Dependencies: mbed LCD_DISCO_F469NI BSP_DISCO_F469NI
main.cpp@0:aa6b01316e93, 2018-04-11 (annotated)
- Committer:
- formulas
- Date:
- Wed Apr 11 14:18:07 2018 +0000
- Revision:
- 0:aa6b01316e93
- Child:
- 1:e5a8ef21e0db
CAN Receive with STM32 F469NI Discovery LCD display board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
formulas | 0:aa6b01316e93 | 1 | #include "mbed.h" |
formulas | 0:aa6b01316e93 | 2 | #include "LCD_DISCO_F469NI.h" |
formulas | 0:aa6b01316e93 | 3 | |
formulas | 0:aa6b01316e93 | 4 | // define all CAN IDs in the vehicle |
formulas | 0:aa6b01316e93 | 5 | // DTA ID are fixed and cannot be changed |
formulas | 0:aa6b01316e93 | 6 | #define DTA_1 0x2000 |
formulas | 0:aa6b01316e93 | 7 | #define DTA_2 0x2001 |
formulas | 0:aa6b01316e93 | 8 | #define DTA_3 0x2002 |
formulas | 0:aa6b01316e93 | 9 | #define DTA_4 0x2003 |
formulas | 0:aa6b01316e93 | 10 | #define DTA_5 0x2004 |
formulas | 0:aa6b01316e93 | 11 | #define DTA_6 0x2006 |
formulas | 0:aa6b01316e93 | 12 | // This IDs can be changed as they are our own IDs |
formulas | 0:aa6b01316e93 | 13 | #define LVDT_FRONT 0x1000 |
formulas | 0:aa6b01316e93 | 14 | #define LVDT_REAR 0x1001 |
formulas | 0:aa6b01316e93 | 15 | #define BRAKES 0x1002 |
formulas | 0:aa6b01316e93 | 16 | // If we add some other IDs in the vehicle add them here |
formulas | 0:aa6b01316e93 | 17 | |
formulas | 0:aa6b01316e93 | 18 | // Receive Flag |
formulas | 0:aa6b01316e93 | 19 | uint32_t rx_flag=0x00000000; |
formulas | 0:aa6b01316e93 | 20 | |
formulas | 0:aa6b01316e93 | 21 | // CAN Message variables, one variable for each ID |
formulas | 0:aa6b01316e93 | 22 | // If new IDs are added, add variables for them |
formulas | 0:aa6b01316e93 | 23 | CANMessage msgDTA1; // RPM, TPS %, Water temp C, Air temp C |
formulas | 0:aa6b01316e93 | 24 | uint8_t msgDTA2[8]; // MAP Kpa, Lambda x1000, KPH x10, Oil P Kpa |
formulas | 0:aa6b01316e93 | 25 | uint8_t msgDTA3[8]; // Fuel P Kpa, Oil temp C, Volts x10, Fuel Con. L/Hr x10 |
formulas | 0:aa6b01316e93 | 26 | uint8_t msgDTA4[8]; // Gear, Advance Deg x10, Injection ms x100, Fuel Con L/100km x10 |
formulas | 0:aa6b01316e93 | 27 | uint8_t msgDTA5[8]; // Ana1 mV, Ana2 mV, Ana3 mV, Cam Advance x10 |
formulas | 0:aa6b01316e93 | 28 | uint8_t msgDTA6[8]; // Cam Targ x10, Cam PWM x10, Crank Errors, Cam Errors |
formulas | 0:aa6b01316e93 | 29 | uint8_t msgLVDTFront[8]; // Left, Right, Steering Wheel |
formulas | 0:aa6b01316e93 | 30 | uint8_t msgLVDTRear[8]; // Left, Right |
formulas | 0:aa6b01316e93 | 31 | uint8_t msgBrakes[8]; // Brake system preassure, Braking On/Off |
formulas | 0:aa6b01316e93 | 32 | |
formulas | 0:aa6b01316e93 | 33 | // CAN Variables |
formulas | 0:aa6b01316e93 | 34 | uint16_t rpm,tps,waterTemp, airTemp, map, Lambda, Volts, oilTemp, KPH, oilPress, Gear, lvdtFL, lvdtFR, lvdtRL, lvdtRR, steeringWheel, brakePress, BrakeOn; |
formulas | 0:aa6b01316e93 | 35 | |
formulas | 0:aa6b01316e93 | 36 | // number of different IDs |
formulas | 0:aa6b01316e93 | 37 | int noID=9; |
formulas | 0:aa6b01316e93 | 38 | |
formulas | 0:aa6b01316e93 | 39 | // initialize LCD |
formulas | 0:aa6b01316e93 | 40 | LCD_DISCO_F469NI lcd; |
formulas | 0:aa6b01316e93 | 41 | // initialize internal LEDs |
formulas | 0:aa6b01316e93 | 42 | DigitalOut led1(LED1); |
formulas | 0:aa6b01316e93 | 43 | DigitalOut led2(LED2); |
formulas | 0:aa6b01316e93 | 44 | // initialize CAN object |
formulas | 0:aa6b01316e93 | 45 | CAN can1(PB_5, PB_13); |
formulas | 0:aa6b01316e93 | 46 | |
formulas | 0:aa6b01316e93 | 47 | // CAN RX Interrupt Function |
formulas | 0:aa6b01316e93 | 48 | void CAN_Msg_Receive(){ |
formulas | 0:aa6b01316e93 | 49 | CANMessage tmpMsg; |
formulas | 0:aa6b01316e93 | 50 | if (can1.read(tmpMsg)) { |
formulas | 0:aa6b01316e93 | 51 | pc.printf("%x\n",tmpMsg.id); |
formulas | 0:aa6b01316e93 | 52 | switch(tmpMsg.id){ |
formulas | 0:aa6b01316e93 | 53 | case(0): |
formulas | 0:aa6b01316e93 | 54 | rx_flag|=(1<<0); |
formulas | 0:aa6b01316e93 | 55 | //for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 56 | msgDTA1=tmpMsg; |
formulas | 0:aa6b01316e93 | 57 | //}; |
formulas | 0:aa6b01316e93 | 58 | break; |
formulas | 0:aa6b01316e93 | 59 | case(DTA_2): |
formulas | 0:aa6b01316e93 | 60 | rx_flag|=(1<<1); |
formulas | 0:aa6b01316e93 | 61 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 62 | msgDTA2[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 63 | }; |
formulas | 0:aa6b01316e93 | 64 | break; |
formulas | 0:aa6b01316e93 | 65 | case(DTA_3): |
formulas | 0:aa6b01316e93 | 66 | rx_flag|=(1<<2); |
formulas | 0:aa6b01316e93 | 67 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 68 | msgDTA3[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 69 | }; |
formulas | 0:aa6b01316e93 | 70 | break; |
formulas | 0:aa6b01316e93 | 71 | case(DTA_4): |
formulas | 0:aa6b01316e93 | 72 | rx_flag|=(1<<3); |
formulas | 0:aa6b01316e93 | 73 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 74 | msgDTA4[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 75 | }; |
formulas | 0:aa6b01316e93 | 76 | break; |
formulas | 0:aa6b01316e93 | 77 | case(DTA_5): |
formulas | 0:aa6b01316e93 | 78 | rx_flag|=(1<<4); |
formulas | 0:aa6b01316e93 | 79 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 80 | msgDTA5[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 81 | }; |
formulas | 0:aa6b01316e93 | 82 | break; |
formulas | 0:aa6b01316e93 | 83 | case(DTA_6): |
formulas | 0:aa6b01316e93 | 84 | rx_flag|=(1<<5); |
formulas | 0:aa6b01316e93 | 85 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 86 | msgDTA6[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 87 | }; |
formulas | 0:aa6b01316e93 | 88 | break; |
formulas | 0:aa6b01316e93 | 89 | case(LVDT_FRONT): |
formulas | 0:aa6b01316e93 | 90 | rx_flag|=(1<<6); |
formulas | 0:aa6b01316e93 | 91 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 92 | msgLVDTFront[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 93 | }; |
formulas | 0:aa6b01316e93 | 94 | break; |
formulas | 0:aa6b01316e93 | 95 | case(LVDT_REAR): |
formulas | 0:aa6b01316e93 | 96 | rx_flag|=(1<<7); |
formulas | 0:aa6b01316e93 | 97 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 98 | msgLVDTRear[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 99 | }; |
formulas | 0:aa6b01316e93 | 100 | break; |
formulas | 0:aa6b01316e93 | 101 | case(BRAKES): |
formulas | 0:aa6b01316e93 | 102 | rx_flag|=(1<<8); |
formulas | 0:aa6b01316e93 | 103 | for(int k=0;k<8;k++){ |
formulas | 0:aa6b01316e93 | 104 | msgBrakes[k]=tmpMsg.data[k]; |
formulas | 0:aa6b01316e93 | 105 | }; |
formulas | 0:aa6b01316e93 | 106 | break; |
formulas | 0:aa6b01316e93 | 107 | }; |
formulas | 0:aa6b01316e93 | 108 | printf("%x\n",rx_flag); |
formulas | 0:aa6b01316e93 | 109 | }; |
formulas | 0:aa6b01316e93 | 110 | }; |
formulas | 0:aa6b01316e93 | 111 | |
formulas | 0:aa6b01316e93 | 112 | void parse_DTA1(); |
formulas | 0:aa6b01316e93 | 113 | void parse_DTA2(); |
formulas | 0:aa6b01316e93 | 114 | void parse_DTA3(); |
formulas | 0:aa6b01316e93 | 115 | void parse_DTA4(); |
formulas | 0:aa6b01316e93 | 116 | void parse_DTA5(); |
formulas | 0:aa6b01316e93 | 117 | void parse_DTA6(); |
formulas | 0:aa6b01316e93 | 118 | void parse_LVDTFRONT(); |
formulas | 0:aa6b01316e93 | 119 | void parse_LVDTREAR(); |
formulas | 0:aa6b01316e93 | 120 | void parse_BRAKES(); |
formulas | 0:aa6b01316e93 | 121 | |
formulas | 0:aa6b01316e93 | 122 | int main(){ |
formulas | 0:aa6b01316e93 | 123 | // attach interrupt function to CAN RX |
formulas | 0:aa6b01316e93 | 124 | can1.attach(&CAN_Msg_Receive,CAN::RxIrq); |
formulas | 0:aa6b01316e93 | 125 | lcd.DisplayStringAt(0,50,(uint8_t*)"Initialised",LEFT_MODE); |
formulas | 0:aa6b01316e93 | 126 | while(1){ |
formulas | 0:aa6b01316e93 | 127 | // the code which checks the CAN RX Flags, and call appropriate data handler function |
formulas | 0:aa6b01316e93 | 128 | for (int i=0;i<noID;i++){ |
formulas | 0:aa6b01316e93 | 129 | uint8_t flagBit; |
formulas | 0:aa6b01316e93 | 130 | flagBit = rx_flag & (1<<i); |
formulas | 0:aa6b01316e93 | 131 | //printf("i=%d\n",i); |
formulas | 0:aa6b01316e93 | 132 | if (flagBit==1) { |
formulas | 0:aa6b01316e93 | 133 | |
formulas | 0:aa6b01316e93 | 134 | switch(i){ |
formulas | 0:aa6b01316e93 | 135 | case(0): |
formulas | 0:aa6b01316e93 | 136 | parse_DTA1(); |
formulas | 0:aa6b01316e93 | 137 | rx_flag = rx_flag ^ (1<<0); |
formulas | 0:aa6b01316e93 | 138 | break; |
formulas | 0:aa6b01316e93 | 139 | case(1): |
formulas | 0:aa6b01316e93 | 140 | parse_DTA2(); |
formulas | 0:aa6b01316e93 | 141 | rx_flag = rx_flag ^ (1<<1); |
formulas | 0:aa6b01316e93 | 142 | break; |
formulas | 0:aa6b01316e93 | 143 | case(2): |
formulas | 0:aa6b01316e93 | 144 | parse_DTA3(); |
formulas | 0:aa6b01316e93 | 145 | rx_flag = rx_flag ^ (1<<2); |
formulas | 0:aa6b01316e93 | 146 | break; |
formulas | 0:aa6b01316e93 | 147 | case(3): |
formulas | 0:aa6b01316e93 | 148 | parse_DTA4(); |
formulas | 0:aa6b01316e93 | 149 | rx_flag = rx_flag ^ (1<<3); |
formulas | 0:aa6b01316e93 | 150 | break; |
formulas | 0:aa6b01316e93 | 151 | case(4): |
formulas | 0:aa6b01316e93 | 152 | parse_DTA5(); |
formulas | 0:aa6b01316e93 | 153 | rx_flag = rx_flag ^ (1<<4); |
formulas | 0:aa6b01316e93 | 154 | break; |
formulas | 0:aa6b01316e93 | 155 | case(5): |
formulas | 0:aa6b01316e93 | 156 | parse_DTA6(); |
formulas | 0:aa6b01316e93 | 157 | rx_flag = rx_flag ^ (1<<5); |
formulas | 0:aa6b01316e93 | 158 | break; |
formulas | 0:aa6b01316e93 | 159 | case(6): |
formulas | 0:aa6b01316e93 | 160 | parse_LVDTFRONT(); |
formulas | 0:aa6b01316e93 | 161 | rx_flag = rx_flag ^ (1<<6); |
formulas | 0:aa6b01316e93 | 162 | break; |
formulas | 0:aa6b01316e93 | 163 | case(7): |
formulas | 0:aa6b01316e93 | 164 | parse_LVDTREAR(); |
formulas | 0:aa6b01316e93 | 165 | rx_flag = rx_flag ^ (1<<7); |
formulas | 0:aa6b01316e93 | 166 | break; |
formulas | 0:aa6b01316e93 | 167 | case(8): |
formulas | 0:aa6b01316e93 | 168 | parse_BRAKES(); |
formulas | 0:aa6b01316e93 | 169 | rx_flag = rx_flag ^ (1<<8); |
formulas | 0:aa6b01316e93 | 170 | break; |
formulas | 0:aa6b01316e93 | 171 | // for each new id add new case statement |
formulas | 0:aa6b01316e93 | 172 | |
formulas | 0:aa6b01316e93 | 173 | } |
formulas | 0:aa6b01316e93 | 174 | } |
formulas | 0:aa6b01316e93 | 175 | } |
formulas | 0:aa6b01316e93 | 176 | |
formulas | 0:aa6b01316e93 | 177 | } |
formulas | 0:aa6b01316e93 | 178 | }; |
formulas | 0:aa6b01316e93 | 179 | |
formulas | 0:aa6b01316e93 | 180 | void parse_DTA1(){ |
formulas | 0:aa6b01316e93 | 181 | rpm=(msgDTA1.data[1]<<8) | msgDTA1.data[0]; |
formulas | 0:aa6b01316e93 | 182 | tps=(msgDTA1.data[3]<<8) | msgDTA1.data[2]; |
formulas | 0:aa6b01316e93 | 183 | waterTemp=(msgDTA1.data[5]<<8) | msgDTA1.data[4]; |
formulas | 0:aa6b01316e93 | 184 | airTemp=(msgDTA1.data[7]<<8) | msgDTA1.data[6]; |
formulas | 0:aa6b01316e93 | 185 | lcd.DisplayStringAt(0,0,(uint8_t*)"DTA1",LEFT_MODE); |
formulas | 0:aa6b01316e93 | 186 | printf("rpm=%x%x, tps=%x%x, waterTemp=%x%x, airTemp=%x%x\n",msgDTA1.data[1],msgDTA1.data[0],msgDTA1.data[3],msgDTA1.data[2],msgDTA1.data[5],msgDTA1.data[4],msgDTA1.data[7],msgDTA1.data[6]); |
formulas | 0:aa6b01316e93 | 187 | }; |
formulas | 0:aa6b01316e93 | 188 | |
formulas | 0:aa6b01316e93 | 189 | void parse_DTA2(){ |
formulas | 0:aa6b01316e93 | 190 | printf("DTA2\n"); |
formulas | 0:aa6b01316e93 | 191 | }; |
formulas | 0:aa6b01316e93 | 192 | |
formulas | 0:aa6b01316e93 | 193 | void parse_DTA3(){ |
formulas | 0:aa6b01316e93 | 194 | oilTemp=(msgDTA3[3]<<8) | msgDTA3[2]; |
formulas | 0:aa6b01316e93 | 195 | Volts=(msgDTA3[5]<<8) | msgDTA3[4]; |
formulas | 0:aa6b01316e93 | 196 | lcd.DisplayStringAt(0,0,(uint8_t*)"DTA3",LEFT_MODE); |
formulas | 0:aa6b01316e93 | 197 | printf("oilTemp=%d, Volts=%d\n",oilTemp,Volts); |
formulas | 0:aa6b01316e93 | 198 | }; |
formulas | 0:aa6b01316e93 | 199 | |
formulas | 0:aa6b01316e93 | 200 | void parse_DTA4(){ |
formulas | 0:aa6b01316e93 | 201 | printf("DTA4\n"); |
formulas | 0:aa6b01316e93 | 202 | }; |
formulas | 0:aa6b01316e93 | 203 | |
formulas | 0:aa6b01316e93 | 204 | void parse_DTA5(){ |
formulas | 0:aa6b01316e93 | 205 | printf("DTA5\n"); |
formulas | 0:aa6b01316e93 | 206 | }; |
formulas | 0:aa6b01316e93 | 207 | |
formulas | 0:aa6b01316e93 | 208 | void parse_DTA6(){ |
formulas | 0:aa6b01316e93 | 209 | printf("DTA6\n"); |
formulas | 0:aa6b01316e93 | 210 | }; |
formulas | 0:aa6b01316e93 | 211 | |
formulas | 0:aa6b01316e93 | 212 | void parse_LVDTFRONT(){ |
formulas | 0:aa6b01316e93 | 213 | // add function which parses the received data |
formulas | 0:aa6b01316e93 | 214 | }; |
formulas | 0:aa6b01316e93 | 215 | |
formulas | 0:aa6b01316e93 | 216 | void parse_LVDTREAR(){ |
formulas | 0:aa6b01316e93 | 217 | // add function which parses the received data |
formulas | 0:aa6b01316e93 | 218 | }; |
formulas | 0:aa6b01316e93 | 219 | |
formulas | 0:aa6b01316e93 | 220 | void parse_BRAKES(){ |
formulas | 0:aa6b01316e93 | 221 | // add function which parses the received data |
formulas | 0:aa6b01316e93 | 222 | }; |
formulas | 0:aa6b01316e93 | 223 | |
formulas | 0:aa6b01316e93 | 224 | |
formulas | 0:aa6b01316e93 | 225 |