Browse Source

【V3.0.0.1】 金茂科易CAN接收优化

CHENJIE-PC\QiXiang_CHENJIE 3 years ago
parent
commit
119422799e
3 changed files with 575 additions and 585 deletions
  1. 95 95
      inc/AppConfig.h
  2. 361 364
      src/AppFunc.c
  3. 119 126
      src/AppTaskCan.c

+ 95 - 95
inc/AppConfig.h

@@ -6,138 +6,138 @@
  * History:      Rev3.0   2021-07-06
  *
  ****************************************************************************/
-#ifndef  APPCONFIG_H
-#define  APPCONFIG_H
-#define BMS_MANUFACTURE             (3)                 //BMS制造商表示1-超力源,2-美顺,3-金茂卡车项目
-#define BMS_INFO                    (1)                 //1-1表示超力源4830,1-2表示超力源6060,2-1表示美顺6455
-#define DATA_MODULE_TYPE            (1)                 //1表示NB模块,2表示4G cat1
-#define EOLSTATE                    (0)                 //1表示下线检测跳过,使用默认值,0表示使用下线检测
-#define DEFAULT_SN                  "JMTEST00000000001" //默认上传的SN编码
-#define	APPSWVERSION		        0x03000000          //数据模块软件版本号
+#ifndef APPCONFIG_H
+#define APPCONFIG_H
+#define BMS_MANUFACTURE (3)            //BMS制造商表示1-超力源,2-美顺,3-金茂卡车项目
+#define BMS_INFO (1)                   //1-1表示超力源4830,1-2表示超力源6060,2-1表示美顺6455
+#define DATA_MODULE_TYPE (1)           //1表示NB模块,2表示4G cat1
+#define EOLSTATE (0)                   //1表示下线检测跳过,使用默认值,0表示使用下线检测
+#define DEFAULT_SN "JMTEST00000000001" //默认上传的SN编码
+#define APPSWVERSION 0x03000001        //数据模块软件版本号
 
-#define TCP_ADD                     "iotp.fast-fun.cn"  //数据上传的地址
-#define TCP_PORT					8712                //数据上传的端口
+#define TCP_ADD "iotp.fast-fun.cn" //数据上传的地址
+#define TCP_PORT 8712              //数据上传的端口
 
-#define NB_OTHER_TEMP_NUM           (4)                 //NB采集的温度个数
-#define HWVERSION		            0x0102              //硬件主版本,现为V1.2板
-#define	BLSWVERSION		            0x01020000          //BootLoader版本号V1.2.0.0
-#define	DRVSWVERSION		        0x01050000          //驱动层版本号V1.4.0.0  驱动层1.5.0.0,增加了三轴
+#define NB_OTHER_TEMP_NUM (4)   //NB采集的温度个数
+#define HWVERSION 0x0102        //硬件主版本,现为V1.2板
+#define BLSWVERSION 0x01020000  //BootLoader版本号V1.2.0.0
+#define DRVSWVERSION 0x01050000 //驱动层版本号V1.4.0.0  驱动层1.5.0.0,增加了三轴
 
-#define APP_CONFIG_FILE_NAME                "qxappconfig.nvm"
-#define APP_DATAINFO_FILE_NAME              "qxappDataInfo3.nvm"
-#define BATT_SN_LEN                17
-#define BMS_OTHER_TEMP              2
-#define CELL_NUM              384
-#define CELL_TEMP_NUM           64
-#define BATT_IDLE_SYM           0x00    //静置
-#define BATT_CHARGE_SYM 		0x02    //充电
-#define BATT_DISCHARGE_SYM      0x01    //放电
-#define BATT_MOVE_SYM	        0x01    //移动
-#define BATT_NO_MOVE_SYM 		0x00    //静止
+#define APP_CONFIG_FILE_NAME "qxappconfig.nvm"
+#define APP_DATAINFO_FILE_NAME "qxappDataInfo3.nvm"
+#define BATT_SN_LEN 17
+#define BMS_OTHER_TEMP 2
+#define CELL_NUM 384
+#define CELL_TEMP_NUM 64
+#define BATT_IDLE_SYM 0x00      //静置
+#define BATT_CHARGE_SYM 0x02    //充电
+#define BATT_DISCHARGE_SYM 0x01 //放电
+#define BATT_MOVE_SYM 0x01      //移动
+#define BATT_NO_MOVE_SYM 0x00   //静止
 
-#define TCP_START_SYM1			0x23
-#define TCP_START_SYM2			0x23
-#define TCP_CMD_SYM				0x02	//实时信息上报是0x02
-#define TCP_HEART_SYM           0x07    //心跳包标志
-#define TCP_ANS_SYM 			0xFE
+#define TCP_START_SYM1 0x23
+#define TCP_START_SYM2 0x23
+#define TCP_CMD_SYM 0x02   //实时信息上报是0x02
+#define TCP_HEART_SYM 0x07 //心跳包标志
+#define TCP_ANS_SYM 0xFE
 /*-------以下为下行指令定义区----------*/
-#define TCP_QUERY_SYM				0x80
-#define TCP_SETCMD_SYM				0x81
-#define TCP_CONCMD_SYM				0x82
+#define TCP_QUERY_SYM 0x80
+#define TCP_SETCMD_SYM 0x81
+#define TCP_CONCMD_SYM 0x82
 /*----------------end----------------*/
 
 //encrypt methord
-#define TCP_ENCPT_ENABLE		0x00
-#define TCP_ENCPT_DISABLE		0x01
+#define TCP_ENCPT_ENABLE 0x00
+#define TCP_ENCPT_DISABLE 0x01
 
 //message type mark 0x02上报数据单元定义区
-#define BATTMSG				0x80
-#define GPSMSG				0x82
-#define STATESMSG			0x85
-#define VERSIONMSG			0x86
-#define DEBUGMSG			0x8C
+#define BATTMSG 0x80
+#define GPSMSG 0x82
+#define STATESMSG 0x85
+#define VERSIONMSG 0x86
+#define DEBUGMSG 0x8C
 
 //BMS升级区定义
-#define FLASH_BMS_FOTA_START_ADDR         0x2E6000          //BMS升级文件存储起始地址
-#define FLASH_BMS_FOTA_LEN                0x32000           //BMS升级文件存储长度 = =200k
-#define FLASH_BMS_FOTA_END_ADDR           0x318000          //BMS升级文件存储结束地址
+#define FLASH_BMS_FOTA_START_ADDR 0x2E6000 //BMS升级文件存储起始地址
+#define FLASH_BMS_FOTA_LEN 0x32000         //BMS升级文件存储长度 = =200k
+#define FLASH_BMS_FOTA_END_ADDR 0x318000   //BMS升级文件存储结束地址
 //declear struct vars   结构体变量定义
 
 typedef struct _AppConfigDataType
-{	
-    BOOL   appDataModify;		//数据更改标志位
-	UINT8  battSN[BATT_SN_LEN]; //电池SN号码
-   	BOOL   isBattLocked;		//0:not locked;	1:locked
-    UINT8  chargEndWorkTime;     //
-    UINT8  BattTempCount;       //电池温度个数
-    UINT16  BattCellCount;       //电池电压串数
-    UINT8  BmsHwVersion;
-    UINT8  BmsSwVersion;
+{
+    BOOL appDataModify;        //数据更改标志位
+    UINT8 battSN[BATT_SN_LEN]; //电池SN号码
+    BOOL isBattLocked;         //0:not locked;	1:locked
+    UINT8 chargEndWorkTime;    //
+    UINT8 BattTempCount;       //电池温度个数
+    UINT16 BattCellCount;      //电池电压串数
+    UINT8 BmsHwVersion;
+    UINT8 BmsSwVersion;
     UINT32 BLSwVersion;
     UINT32 DrvSwVersion;
-    UINT32 AppSwVersion;        //APP软件版本
-	UINT8  EOLState;
-}AppConfigDataType;
+    UINT32 AppSwVersion; //APP软件版本
+    UINT8 EOLState;
+} AppConfigDataType;
 
 typedef struct _AppConfigDataHeader
 {
     UINT16 fileBodySize; //file body size, not include size of header;
-    UINT8  checkSum;
-}AppConfigDataHeader;
+    UINT8 checkSum;
+} AppConfigDataHeader;
 
 typedef struct _AppDataType
-{	
-    BOOL   appDataModify;		        //数据更改标志位
-    UINT8  BattInfoSendFreqHigh;        //电池信息发送间隔高频,单位s
-    UINT8  BattInfoSendFreqNomal;       //电池信息发送间隔正常,单位s     
-    UINT8  BattInfoSendFreqLow;         //电池信息发送间隔低频,单位s
-    UINT8  PosInfoSendFreqHigh;         //定位信息发送间隔高频,单位s
-    UINT8  PosInfoSendFreqNormal;       //定位信息发送间隔正常,单位s
-    UINT8  PosInfoSendFreqLow;          //定位信息发送间隔低频,单位s
-    UINT32 AccMileage;                  //累计里程,单位m
-    UINT16 SysReStartCount;             //系统重启次数
-    UINT8  RelayControl;                //继电器控制
-    UINT8  BattLock;                    //电池锁定状态
-    UINT8  BattStolenFlag;              //电池被盗状态
-    UINT32 blcv_Q_totalCpE[28];         //累计均衡容量 读取量 数组最大28
-    UINT16 blcv_Q_reqCpE[28];           //均衡需求容量 读取量 数组最大28
-    UINT16 socd_pct_bcuSocE;            //电池显示SOC 读取量;
-    UINT16 socd_pct_battSocE;           //电池真实SOC 读取量;
-    UINT16 sohd_tm_chrgStartStatE;      //充电前静置时间读取量;
-    UINT8  sohd_flg_chrgEndE;           //充电结束标志位读取量;
-    UINT16 sohv_V_chrgStartStatE[28];   //充电开始时刻的单体电压(数组)读取量;
-    UINT16 sohd_Q_chrgE;                //充入容量读取量;
-    UINT16 sohv_Q_packCapArrE[10];     //10次整包容量(数组)读取量;
-    UINT8  VIN[17];                     //电池SN号码
-}AppDataBody;
+{
+    BOOL appDataModify;               //数据更改标志位
+    UINT8 BattInfoSendFreqHigh;       //电池信息发送间隔高频,单位s
+    UINT8 BattInfoSendFreqNomal;      //电池信息发送间隔正常,单位s
+    UINT8 BattInfoSendFreqLow;        //电池信息发送间隔低频,单位s
+    UINT8 PosInfoSendFreqHigh;        //定位信息发送间隔高频,单位s
+    UINT8 PosInfoSendFreqNormal;      //定位信息发送间隔正常,单位s
+    UINT8 PosInfoSendFreqLow;         //定位信息发送间隔低频,单位s
+    UINT32 AccMileage;                //累计里程,单位m
+    UINT16 SysReStartCount;           //系统重启次数
+    UINT8 RelayControl;               //继电器控制
+    UINT8 BattLock;                   //电池锁定状态
+    UINT8 BattStolenFlag;             //电池被盗状态
+    UINT32 blcv_Q_totalCpE[28];       //累计均衡容量 读取量 数组最大28
+    UINT16 blcv_Q_reqCpE[28];         //均衡需求容量 读取量 数组最大28
+    UINT16 socd_pct_bcuSocE;          //电池显示SOC 读取量;
+    UINT16 socd_pct_battSocE;         //电池真实SOC 读取量;
+    UINT16 sohd_tm_chrgStartStatE;    //充电前静置时间读取量;
+    UINT8 sohd_flg_chrgEndE;          //充电结束标志位读取量;
+    UINT16 sohv_V_chrgStartStatE[28]; //充电开始时刻的单体电压(数组)读取量;
+    UINT16 sohd_Q_chrgE;              //充入容量读取量;
+    UINT16 sohv_Q_packCapArrE[10];    //10次整包容量(数组)读取量;
+    UINT8 VIN[17];                    //电池SN号码
+} AppDataBody;
 typedef struct _AppDataHeader
 {
     UINT16 fileBodySize; //file body size, not include size of header;
-    UINT8  checkSum;
-}AppDataHeader;
+    UINT8 checkSum;
+} AppDataHeader;
 
 typedef struct AppSocketConnectionContext_Tag
 {
     INT32 id;
     INT32 status;
-}AppSocketConnectionContext;
+} AppSocketConnectionContext;
 
 typedef enum
 {
     IDLE = 0,
     WORK,
     LISTEN
-}process_app;
+} process_app;
 typedef struct _GPSInfo
 {
-	UINT8	locateMark;
-	UINT8	satelliteNum;
-	UINT8	direction[2];
-	UINT8	speed[2];
-	UINT8	altitude[2];
-	UINT8	latitude[4];
-	UINT8	longitude[4];
-	UINT8   AccMileage[4];
-	//若此处新增gps信息,需要同步修改tcp线程的定义
-}GPSInfo;
+    UINT8 locateMark;
+    UINT8 satelliteNum;
+    UINT8 direction[2];
+    UINT8 speed[2];
+    UINT8 altitude[2];
+    UINT8 latitude[4];
+    UINT8 longitude[4];
+    UINT8 AccMileage[4];
+    //若此处新增gps信息,需要同步修改tcp线程的定义
+} GPSInfo;
 #endif

File diff suppressed because it is too large
+ 361 - 364
src/AppFunc.c


+ 119 - 126
src/AppTaskCan.c

@@ -10,167 +10,160 @@
 
 static void CanTask(void);
 
-
 static StaticTask_t gProcess_Can_Rx_Task_t;
-static UINT8 		gProcess_Can_Rx_TaskStack[PROC_CAN_RX_TASK_STACK_SIZE];
-static process_CAN	gProcess_CAN_Task = PROCESS_CAN_STATE_IDLE;
-#define 			PROC_CAN_STATE_SWITCH(a)  (gProcess_CAN_Task = a)
+static UINT8 gProcess_Can_Rx_TaskStack[PROC_CAN_RX_TASK_STACK_SIZE];
+static process_CAN gProcess_CAN_Task = PROCESS_CAN_STATE_IDLE;
+#define PROC_CAN_STATE_SWITCH(a) (gProcess_CAN_Task = a)
 
-void AppTaskCanInit(void* arg)
+void AppTaskCanInit(void *arg)
 {
-    osThreadAttr_t task_rx_attr;
-    memset(&task_rx_attr,0,sizeof(task_rx_attr));
-    memset(gProcess_Can_Rx_TaskStack, 0, PROC_CAN_RX_TASK_STACK_SIZE);
-    task_rx_attr.name = "Can_Task";
-    task_rx_attr.stack_mem = gProcess_Can_Rx_TaskStack;
-    task_rx_attr.stack_size = PROC_CAN_RX_TASK_STACK_SIZE;
-    task_rx_attr.priority = osPriorityBelowNormal7;
-    task_rx_attr.cb_mem = &gProcess_Can_Rx_Task_t;
-    task_rx_attr.cb_size = sizeof(StaticTask_t);
-    osDelay(1000);
-    osThreadNew(CanTask, NULL, &task_rx_attr);
+	osThreadAttr_t task_rx_attr;
+	memset(&task_rx_attr, 0, sizeof(task_rx_attr));
+	memset(gProcess_Can_Rx_TaskStack, 0, PROC_CAN_RX_TASK_STACK_SIZE);
+	task_rx_attr.name = "Can_Task";
+	task_rx_attr.stack_mem = gProcess_Can_Rx_TaskStack;
+	task_rx_attr.stack_size = PROC_CAN_RX_TASK_STACK_SIZE;
+	task_rx_attr.priority = osPriorityBelowNormal7;
+	task_rx_attr.cb_mem = &gProcess_Can_Rx_Task_t;
+	task_rx_attr.cb_size = sizeof(StaticTask_t);
+	osDelay(1000);
+	osThreadNew(CanTask, NULL, &task_rx_attr);
 }
 
 static void CanTask()
-{    
+{
 	Can_InitType param;
-    UINT8 udsFlag,msgFlag=0;
+	UINT8 udsFlag, msgFlag = 0;
 	UINT8 i = 0;
-	UINT16 delayconuter = 0;	
+	UINT16 delayconuter = 0;
 	CAN_Msg_Type CanRxMsg[2];
-	UINT8  ConvertCounter = 0;
+	UINT8 ConvertCounter = 0;
 
 	PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_INIT);
-	
-    while(TRUE)
-    {	
-    	memset(CanRxMsg, 0, sizeof(CanRxMsg));
-		switch(gProcess_CAN_Task)
+
+	while (TRUE)
+	{
+		memset(CanRxMsg, 0, sizeof(CanRxMsg));
+		switch (gProcess_CAN_Task)
 		{
-			case PROCESS_CAN_STATE_INIT:
-			{
-				param.baudrate = CAN_500Kbps;
-				param.mode = REQOP_NORMAL;	
-				param.packType = EXT_PACK;
-				HAL_Can_Init(param);
-				osDelay(100);
-				PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_WORK);
-				break;
-			}
-			case PROCESS_CAN_STATE_IDLE:
+		case PROCESS_CAN_STATE_INIT:
+		{
+			param.baudrate = CAN_500Kbps;
+			param.mode = REQOP_NORMAL;
+			param.packType = EXT_PACK;
+			HAL_Can_Init(param);
+			osDelay(100);
+			PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_WORK);
+			break;
+		}
+		case PROCESS_CAN_STATE_IDLE:
+		{
+			ConvertCounter = 0;
+			while (TRUE)
 			{
-				ConvertCounter = 0;
-				while(TRUE)
+				osDelay(10);
+				ConvertCounter++;
+				if (gProcess_app != WORK)
 				{
-					osDelay(10);
-					ConvertCounter++;
-					if(gProcess_app!=WORK)
-					{
-						PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_SLEEP);
-						break;
-					}
-					if(getbit(PadInterrupt,0)==1||ConvertCounter>=10)
-					{
-						PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_WORK);
-						break;
-					}
-				}    
-				break;				
+					PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_SLEEP);
+					break;
+				}
+				if (getbit(PadInterrupt, 0) == 1 || ConvertCounter >= 10)
+				{
+					PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_WORK);
+					break;
+				}
 			}
-			case PROCESS_CAN_STATE_WORK:
+			break;
+		}
+		case PROCESS_CAN_STATE_WORK:
+		{
+			//printf("can task work\n");
+			memset(CanRxMsg, 0, sizeof(CanRxMsg));
+			if (HAL_Can_Receive(CanRxMsg) > 0)
 			{
-				//printf("can task work\n");
-				memset(CanRxMsg,0,sizeof(CanRxMsg));
-				if(HAL_Can_Receive(CanRxMsg)>0)					
+				//printf("can receive message\n");
+				delayconuter = 0;
+				for (int i = 0; i < 2; i++)
 				{
-					//printf("can receive message\n");
-					delayconuter=0;						
-					for(int i=0;i<2;i++)
+					if (CanRxMsg[i].Id != 0x00 && CanRxMsg[i].DLC == 0x08)
 					{
-						if(CanRxMsg[i].Id != 0x00 && CanRxMsg[i].DLC == 0x08)
+						if (CanRxMsg[i].Id == 0x7A0)
 						{
-							if(CanRxMsg[i].Id == 0x7A0)
-							{	
-								udsFlag = 1;
-								UDSService[i] =  CanRxMsg[i].Data[0];
-								UDSSubService[i] = CanRxMsg[i].Data[1];
-								UDSSubServiceActionCode[i] = CanRxMsg[i].Data[2];
-								if(UDSService[i] == 0x10)
+							udsFlag = 1;
+							UDSService[i] = CanRxMsg[i].Data[0];
+							UDSSubService[i] = CanRxMsg[i].Data[1];
+							UDSSubServiceActionCode[i] = CanRxMsg[i].Data[2];
+							if (UDSService[i] == 0x10)
+							{
+								if (UDSSubService[i] == 0x02)
 								{
-									if(UDSSubService[i] == 0x02)
-									{
-										UDSSwitch = 1;
-									}								
+									UDSSwitch = 1;
 								}
 							}
-							else if(CanRxMsg[i].Id == 0x7A1)
+						}
+						else if (CanRxMsg[i].Id == 0x7A1)
+						{
+							UINT8 nvmTemp[100];
+							memset(nvmTemp, 0, 100);
+							for (int ii = 0; ii < 200; ii++)
 							{
-								UINT8 nvmTemp[100];
-								memset(nvmTemp, 0, 100);
-								for(int ii=0;ii<200;ii++)
+								BSP_QSPI_Read_Safe(nvmTemp, FLASH_FOTA_REGION_START + ii * 100, 100);
+								for (int jj = 0; jj < 100; jj++)
 								{
-									BSP_QSPI_Read_Safe(nvmTemp, FLASH_FOTA_REGION_START+ii*100, 100);
-									for(int jj=0;jj<100;jj++)
-									{
-										printf("%02X ",nvmTemp[jj]);
-									}	
-									printf("\n");
+									printf("%02X ", nvmTemp[jj]);
 								}
+								printf("\n");
 							}
-							else
-							{
-								DecodeFunction(CanRxMsg[i].Id,CanRxMsg[i].Data);
-								canRxFlag[canCOMInTableIndexFind(CanRxMsg[i].Id)] = 1;
-							}
-							
 						}
 						else
 						{
-							continue;
+							DecodeFunction(CanRxMsg[i].Id, CanRxMsg[i].Data);
+							//canRxFlag[canCOMInTableIndexFind(CanRxMsg[i].Id)] = 1;
 						}
 					}
-
-					for(i=0; i<2; i++)
-					{								
-						
-					}	
-					if(udsFlag==1)
-					{	
-						UDS_Service(CanRxMsg);
-						udsFlag = 0;
+					else
+					{
+						continue;
 					}
 				}
-				else
+
+				for (i = 0; i < 2; i++)
 				{
-					delayconuter++;
-					osDelay(2);			
-				}					
-				if(delayconuter>=1000)
+				}
+				if (udsFlag == 1)
 				{
-					delayconuter=0;
-					clrbit(PadInterrupt,0);
-					PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
-				}				
-				break;
-			}	
-	        case PROCESS_CAN_STATE_SLEEP:
-	        {	            
-	            HAL_Can_Sleep();   
-				while (TRUE)
+					UDS_Service(CanRxMsg);
+					udsFlag = 0;
+				}
+			}
+			else
+			{
+				delayconuter++;
+				osDelay(2);
+			}
+			if (delayconuter >= 1000)
+			{
+				delayconuter = 0;
+				clrbit(PadInterrupt, 0);
+				PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_IDLE);
+			}
+			break;
+		}
+		case PROCESS_CAN_STATE_SLEEP:
+		{
+			HAL_Can_Sleep();
+			while (TRUE)
+			{
+				if (getbit(PadInterrupt, 0) == 1 || (slpManGetWakeupPinValue() & 0x1) == 0x00) //判断是否产生中断,产生中断则退出延时
 				{
-					if (getbit(PadInterrupt,0)==1||(slpManGetWakeupPinValue() & 0x1)==0x00)//判断是否产生中断,产生中断则退出延时
-					{
-						PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_INIT);
-						break;
-					}
-					osDelay(2000);
+					PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_INIT);
+					break;
 				}
-	            break;
-	       	}
-	   }
-	}      
+				osDelay(2000);
+			}
+			break;
+		}
+		}
+	}
 }
-
-
-
-

Some files were not shown because too many files changed in this diff