CAN Receive with STM32 F469NI Discovery LCD display board
Dependencies: BSP_DISCO_F469NI LCD_DISCO_F469NI mbed
Diff: main.cpp
- Revision:
- 0:aa6b01316e93
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Apr 11 14:18:07 2018 +0000 @@ -0,0 +1,225 @@ +#include "mbed.h" +#include "LCD_DISCO_F469NI.h" + +// define all CAN IDs in the vehicle +// DTA ID are fixed and cannot be changed +#define DTA_1 0x2000 +#define DTA_2 0x2001 +#define DTA_3 0x2002 +#define DTA_4 0x2003 +#define DTA_5 0x2004 +#define DTA_6 0x2006 +// This IDs can be changed as they are our own IDs +#define LVDT_FRONT 0x1000 +#define LVDT_REAR 0x1001 +#define BRAKES 0x1002 +// If we add some other IDs in the vehicle add them here + +// Receive Flag +uint32_t rx_flag=0x00000000; + +// CAN Message variables, one variable for each ID +// If new IDs are added, add variables for them +CANMessage msgDTA1; // RPM, TPS %, Water temp C, Air temp C +uint8_t msgDTA2[8]; // MAP Kpa, Lambda x1000, KPH x10, Oil P Kpa +uint8_t msgDTA3[8]; // Fuel P Kpa, Oil temp C, Volts x10, Fuel Con. L/Hr x10 +uint8_t msgDTA4[8]; // Gear, Advance Deg x10, Injection ms x100, Fuel Con L/100km x10 +uint8_t msgDTA5[8]; // Ana1 mV, Ana2 mV, Ana3 mV, Cam Advance x10 +uint8_t msgDTA6[8]; // Cam Targ x10, Cam PWM x10, Crank Errors, Cam Errors +uint8_t msgLVDTFront[8]; // Left, Right, Steering Wheel +uint8_t msgLVDTRear[8]; // Left, Right +uint8_t msgBrakes[8]; // Brake system preassure, Braking On/Off + +// CAN Variables +uint16_t rpm,tps,waterTemp, airTemp, map, Lambda, Volts, oilTemp, KPH, oilPress, Gear, lvdtFL, lvdtFR, lvdtRL, lvdtRR, steeringWheel, brakePress, BrakeOn; + +// number of different IDs +int noID=9; + +// initialize LCD +LCD_DISCO_F469NI lcd; +// initialize internal LEDs +DigitalOut led1(LED1); +DigitalOut led2(LED2); +// initialize CAN object +CAN can1(PB_5, PB_13); + +// CAN RX Interrupt Function +void CAN_Msg_Receive(){ + CANMessage tmpMsg; + if (can1.read(tmpMsg)) { + pc.printf("%x\n",tmpMsg.id); + switch(tmpMsg.id){ + case(0): + rx_flag|=(1<<0); + //for(int k=0;k<8;k++){ + msgDTA1=tmpMsg; + //}; + break; + case(DTA_2): + rx_flag|=(1<<1); + for(int k=0;k<8;k++){ + msgDTA2[k]=tmpMsg.data[k]; + }; + break; + case(DTA_3): + rx_flag|=(1<<2); + for(int k=0;k<8;k++){ + msgDTA3[k]=tmpMsg.data[k]; + }; + break; + case(DTA_4): + rx_flag|=(1<<3); + for(int k=0;k<8;k++){ + msgDTA4[k]=tmpMsg.data[k]; + }; + break; + case(DTA_5): + rx_flag|=(1<<4); + for(int k=0;k<8;k++){ + msgDTA5[k]=tmpMsg.data[k]; + }; + break; + case(DTA_6): + rx_flag|=(1<<5); + for(int k=0;k<8;k++){ + msgDTA6[k]=tmpMsg.data[k]; + }; + break; + case(LVDT_FRONT): + rx_flag|=(1<<6); + for(int k=0;k<8;k++){ + msgLVDTFront[k]=tmpMsg.data[k]; + }; + break; + case(LVDT_REAR): + rx_flag|=(1<<7); + for(int k=0;k<8;k++){ + msgLVDTRear[k]=tmpMsg.data[k]; + }; + break; + case(BRAKES): + rx_flag|=(1<<8); + for(int k=0;k<8;k++){ + msgBrakes[k]=tmpMsg.data[k]; + }; + break; + }; + printf("%x\n",rx_flag); + }; +}; + +void parse_DTA1(); +void parse_DTA2(); +void parse_DTA3(); +void parse_DTA4(); +void parse_DTA5(); +void parse_DTA6(); +void parse_LVDTFRONT(); +void parse_LVDTREAR(); +void parse_BRAKES(); + +int main(){ + // attach interrupt function to CAN RX + can1.attach(&CAN_Msg_Receive,CAN::RxIrq); + lcd.DisplayStringAt(0,50,(uint8_t*)"Initialised",LEFT_MODE); + while(1){ + // the code which checks the CAN RX Flags, and call appropriate data handler function + for (int i=0;i<noID;i++){ + uint8_t flagBit; + flagBit = rx_flag & (1<<i); + //printf("i=%d\n",i); + if (flagBit==1) { + + switch(i){ + case(0): + parse_DTA1(); + rx_flag = rx_flag ^ (1<<0); + break; + case(1): + parse_DTA2(); + rx_flag = rx_flag ^ (1<<1); + break; + case(2): + parse_DTA3(); + rx_flag = rx_flag ^ (1<<2); + break; + case(3): + parse_DTA4(); + rx_flag = rx_flag ^ (1<<3); + break; + case(4): + parse_DTA5(); + rx_flag = rx_flag ^ (1<<4); + break; + case(5): + parse_DTA6(); + rx_flag = rx_flag ^ (1<<5); + break; + case(6): + parse_LVDTFRONT(); + rx_flag = rx_flag ^ (1<<6); + break; + case(7): + parse_LVDTREAR(); + rx_flag = rx_flag ^ (1<<7); + break; + case(8): + parse_BRAKES(); + rx_flag = rx_flag ^ (1<<8); + break; + // for each new id add new case statement + + } + } + } + + } +}; + +void parse_DTA1(){ + rpm=(msgDTA1.data[1]<<8) | msgDTA1.data[0]; + tps=(msgDTA1.data[3]<<8) | msgDTA1.data[2]; + waterTemp=(msgDTA1.data[5]<<8) | msgDTA1.data[4]; + airTemp=(msgDTA1.data[7]<<8) | msgDTA1.data[6]; + lcd.DisplayStringAt(0,0,(uint8_t*)"DTA1",LEFT_MODE); + 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]); +}; + +void parse_DTA2(){ + printf("DTA2\n"); +}; + +void parse_DTA3(){ + oilTemp=(msgDTA3[3]<<8) | msgDTA3[2]; + Volts=(msgDTA3[5]<<8) | msgDTA3[4]; + lcd.DisplayStringAt(0,0,(uint8_t*)"DTA3",LEFT_MODE); + printf("oilTemp=%d, Volts=%d\n",oilTemp,Volts); +}; + +void parse_DTA4(){ + printf("DTA4\n"); +}; + +void parse_DTA5(){ + printf("DTA5\n"); +}; + +void parse_DTA6(){ + printf("DTA6\n"); +}; + +void parse_LVDTFRONT(){ + // add function which parses the received data +}; + +void parse_LVDTREAR(){ + // add function which parses the received data +}; + +void parse_BRAKES(){ + // add function which parses the received data +}; + + +