CAN Receive with STM32 F469NI Discovery LCD display board

Dependencies:   BSP_DISCO_F469NI LCD_DISCO_F469NI mbed

Committer:
formulas
Date:
Wed Apr 11 14:18:07 2018 +0000
Revision:
0:aa6b01316e93
CAN Receive with STM32 F469NI Discovery LCD display board

Who changed what in which revision?

UserRevisionLine numberNew 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