Ver Fonte

1、修改过滤器设置,可接收仪表和上位机发送给电池的数据;
2、增加仪表和上位机发送给电池数据缓冲区和解析。

Dail há 1 ano atrás
pai
commit
ef28209b83

+ 4 - 2
Core/Inc/can.h

@@ -84,8 +84,8 @@ extern CAN_HandleTypeDef hcan;
 #define ID_CDL_TO_PBU         0x753	
 #define ID_CDL_TO_HMI         0x754	 
 
-#define ID_TO_MC_FILTER      (uint16_t)(0x701 & 0x605)
-#define ID_TO_MC_MASK        (uint16_t)(0x78F & 0x68F)
+#define ID_TO_MC_FILTER      (uint16_t)(0x731 & 0x741 & 0x751 & 0x651 & 0x732)
+#define ID_TO_MC_MASK        (uint16_t)(0x78C & 0x68C)
 
 #define ID_BC_FILTER          (uint16_t)(0x700 & 0x700)
 #define ID_BC_MASK            (uint16_t)(0x70F & 0x60F)
@@ -130,6 +130,8 @@ extern uint8_t CAN_RxBuf_HMI[255];
 extern CAN_Buf_TypeDef CAN_RxBuf_Struct_HMI;
 extern uint8_t CAN_RxBuf_CDL[255];
 extern CAN_Buf_TypeDef CAN_RxBuf_Struct_CDL;
+extern uint8_t CAN_RxBuf_To_BMS[255];
+extern CAN_Buf_TypeDef CAN_RxBuf_Struct_To_BMS;
 
 extern void CAN_SendData(uint16_t ID, uint8_t *Data, uint16_t Length);
 extern void CANFilterConfig_Scale32_IdMask_StandardIdOnly(void);

+ 8 - 0
Core/Src/can.c

@@ -64,6 +64,8 @@ uint8_t CAN_RxBuf_HMI[255];
 CAN_Buf_TypeDef CAN_RxBuf_Struct_HMI = {0,255,0,0,0,0,CAN_RxBuf_HMI,0,FALSE};
 uint8_t CAN_RxBuf_CDL[255];
 CAN_Buf_TypeDef CAN_RxBuf_Struct_CDL = {0,255,0,0,0,0,CAN_RxBuf_CDL,0,FALSE};
+uint8_t CAN_RxBuf_To_BMS[255];
+CAN_Buf_TypeDef CAN_RxBuf_Struct_To_BMS = {0,255,0,0,0,0,CAN_RxBuf_To_BMS,0,FALSE};
 
 /* USER CODE END 0 */
 
@@ -212,6 +214,12 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 			CAN_Rx_ISR(&CAN_RxBuf_Struct_CDL,CanHandle->pRxMsg->DLC);
 			break;
 		}
+		case ID_PBU_TO_BMS: case ID_CDL_TO_BMS://接收仪表和CDL发送BMS的数据
+		{
+		  CAN_RxBuf_Struct_To_BMS.ucBufID = CanHandle->pRxMsg->StdId;
+			CAN_Rx_ISR(&CAN_RxBuf_Struct_To_BMS,CanHandle->pRxMsg->DLC);
+			break;
+		}
 		default:break;
 	}
 	__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断

+ 3 - 2
Core/Src/main.c

@@ -232,6 +232,7 @@ int main(void)
 			
 			//无码表模式初始化处理
 			NoPBUMode_Ini();	
+			
 			//CAN数据解析及处理
 			CanRx_Process();
 			
@@ -358,9 +359,9 @@ int main(void)
 			SpdProportion_calculate();
 			
 			//BMS处理主循环 
-     		BMS_Magene_Loop();    
+     	BMS_Magene_Loop();    
 
-      		//MCU自检
+      //MCU自检
 			STU_TimeBase();
 			STU_DoRunTimeChecks();
 			

Diff do ficheiro suprimidas por serem muito extensas
+ 2527 - 2527
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 2 - 2
User/Inc/bms_magene.h

@@ -206,14 +206,14 @@ typedef struct
 //BMS在线状态
 typedef struct 
 {
-    uint8_t OnLineFlag; //0-在线,1-离线
+    uint8_t OnLineFlag; //0-离线,1-在线
     uint32_t TimeCnt;
 }BMS_Magene_OnLineCheck_Struct;
 
 //BMS报文数据
 typedef struct
 {
-	uint8_t RefreshFlag; //0-更新,1-更新
+	uint8_t RefreshFlag; //0-更新,1-更新
 	uint8_t RS;
 	uint16_t ID;
 	uint8_t Data[8];

+ 13 - 7
User/Src/bms_magene.c

@@ -1,4 +1,5 @@
 #include "bms_magene.h"
+#include "remain_distance.h"
 
 //全局变量
 BMS_Magene_TPDOInfo_Struct BMS_Magene_TPDOInfo_Main, BMS_Magene_TPDOInfo_Back;  //电池主动上报数据
@@ -146,14 +147,14 @@ void BMS_SwitchCtl(void)
 void BMS_OnLineCheck(void)
 {
     //主电池检测
-    if((HAL_GetTick() - BMS_Magene_OnLineCheck_Main.TimeCnt) > 1000)
+    if((HAL_GetTick() - BMS_Magene_OnLineCheck_Main.TimeCnt) > 3000)
     {
-        BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
+        BMS_Magene_OnLineCheck_Main.OnLineFlag = 0;
     }
     //备电池检测
-    if((HAL_GetTick() - BMS_Magene_OnLineCheck_Back.TimeCnt) > 1000)
+    if((HAL_GetTick() - BMS_Magene_OnLineCheck_Back.TimeCnt) > 3000)
     {
-        BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
+        BMS_Magene_OnLineCheck_Back.OnLineFlag = 0;
     }
 }
 
@@ -168,7 +169,7 @@ void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
             {
                 memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Main.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
             }
-            BMS_Magene_OnLineCheck_Main.OnLineFlag = 0;
+            BMS_Magene_OnLineCheck_Main.OnLineFlag = 1;
             BMS_Magene_OnLineCheck_Main.TimeCnt = HAL_GetTick();
         }
         else if(CanData->ID == (BMS_MAGENE_BASE_TPDO + BMS_MAGENE_ADDRESS_BACK)) //备电池
@@ -177,10 +178,15 @@ void BMS_CanProcess(BMS_Magene_CanData_Struct_t* CanData)
             {
                 memcpy((uint8_t*)CanData->Data + 2, (uint8_t*)&BMS_Magene_TPDOInfo_Back.BaseInfo.PageID + (CanData->Data[1] - 9) * 8 + 2, 6);
             }
-            BMS_Magene_OnLineCheck_Back.OnLineFlag = 0;
+            BMS_Magene_OnLineCheck_Back.OnLineFlag = 1;
             BMS_Magene_OnLineCheck_Back.TimeCnt = HAL_GetTick();
         }
-
+				//电池通信正常标志置位,用于续航计算
+				RemainDis.IsBMS_ComOK_Flag = TRUE;              
+				RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
+				//BMS通信正常标志置位
+			  IsComOK_BMS.IsOK_Flag = TRUE;
+			  IsComOK_BMS.OK_TrigTime = HAL_GetTick();
         CanData->RefreshFlag = 0;
     }
 }

+ 237 - 172
User/Src/can_process.c

@@ -10,6 +10,7 @@
 #include "log_save.h"
 #include "speed_sensor.h"
 #include "enviolo_can.h"
+#include "bms_magene.h"
 
 /**********局部函数定义**********/
 uint8_t cd_ReadChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)	 
@@ -18,17 +19,17 @@ uint8_t cd_ReadChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
 	uint16_t  i;
 	i = ucNum;
 	if ((*ptCANRx).ucBufCnt >= ucNum)
-	 {
+	{
 		i += (*ptCANRx).ucBufRdInde;
 		if (i >= (*ptCANRx).ucBufSize)
 		{	
 			i -=((*ptCANRx).ucBufSize);
 		}
-	 }
+	}
 	else
-	 {
-	  i=0;
-	 }
+	{
+	    i=0;
+	}
 	ucData = *((*ptCANRx).pcBufAddr + i);
 	return ucData;
 }
@@ -45,7 +46,7 @@ void cd_DelChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
 		i += (*ptCANRx).ucBufRdInde;
 		if (i >= (*ptCANRx).ucBufSize)
 		{
-		  i -= (*ptCANRx).ucBufSize;
+		    i -= (*ptCANRx).ucBufSize;
 		}
 		(*ptCANRx).ucBufRdInde = i;
 	}
@@ -58,7 +59,7 @@ void cd_DelChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
         i += (*ptCANRx).ucBufRdInde;
 		if (i >= (*ptCANRx).ucBufSize)
 		{
-		  i -= (*ptCANRx).ucBufSize;
+		    i -= (*ptCANRx).ucBufSize;
 		}
 		(*ptCANRx).ucBufRdInde = i;
 	 }
@@ -67,8 +68,7 @@ void cd_DelChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
 //数据解析处理
 void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 {
-  uint8_t DataLength;
-	
+    uint8_t DataLength;	
 	DataLength = (uint8_t)(Cmd &0x00FF);
 	
 	switch(ID)
@@ -78,7 +78,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 		{
 			switch(Cmd)			
 			{
-		  	//BMS广播的指令
+		  	    //BMS广播的指令
 				case 0x1010://BMS运行信息
 				{
 					//更新电池运行信息
@@ -88,8 +88,8 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					RemainDis.IsBMS_ComOK_Flag = TRUE;              
 					RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
 					//BMS通信正常标志置位
-			    IsComOK_BMS.IsOK_Flag = TRUE;
-			    IsComOK_BMS.OK_TrigTime = HAL_GetTick();
+					IsComOK_BMS.IsOK_Flag = TRUE;
+					IsComOK_BMS.OK_TrigTime = HAL_GetTick();
 					break;
 				}
 				case 0x1308://关机指令
@@ -104,42 +104,108 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x160C://电池物理ID
 				{
-				  memcpy(BMS_CheckInfo.MAC_ID, Data, DataLength);
+				  	memcpy(BMS_CheckInfo.MAC_ID, Data, DataLength);
 					break;
 				}
 				case 0x170C://电池存储的校验码
 				{
-				  memcpy(BMS_CheckInfo.CheckCode, Data, DataLength);
+				  	memcpy(BMS_CheckInfo.CheckCode, Data, DataLength);
 					break;
 				}
 				//BMS发送给MC的指令
 				case 0x3005://电池在线检测反馈
 				{
-				  if(strncmp("READY", (char*)Data, DataLength) == 0)
+				  	if(strncmp("READY", (char*)Data, DataLength) == 0)
 					{
-					  DeviceOnLine_Status.Status_Bit.BMS_OffLine = 0;
+					  	DeviceOnLine_Status.Status_Bit.BMS_OffLine = 0;
 					}
-				  break;
+				  	break;
 				}
 				default:break;
 			}
 			
 			break;
 		}
+		
+		//处理仪表发送BMS的指令
+		case ID_PBU_TO_BMS: case ID_CDL_TO_BMS:
+		{
+			if((BMS_Magene_OnLineCheck_Main.OnLineFlag == 1) && (BMS_Magene_OnLineCheck_Back.OnLineFlag == 1))
+			{
+				switch(Cmd)
+				{
+					//仪表指令
+					case 0x5000: //读取运行信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1010, (uint8_t*)&BMS_RunInfo.Voltage);
+						break;
+					}
+					case 0x5100: //读取版本信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1540, (uint8_t*)&BMS_VerInfo.Mode);
+						break;
+					}
+					case 0x5200: //读取设计信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1410, (uint8_t*)&BMS_DesignInfo.Capacity);
+						break;
+					}
+					case 0x5300: //读取电芯电压
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1120, (uint8_t*)&BMS_CellVol.Cell1);
+						break;
+					}
+					case 0x5400: //读取电池使用记录
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1810, (uint8_t*)&BMS_UsrLog.Max_Tmp);
+						break;
+					}
+					//CDL指令
+					case 0x3300: //读取版本信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1540, (uint8_t*)&BMS_VerInfo.Mode);
+						break;
+					}
+					case 0x3400: //读取运行信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1010, (uint8_t*)&BMS_RunInfo.Voltage);
+						break;
+					}
+					case 0x3500: //读取电芯电压
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1120, (uint8_t*)&BMS_CellVol.Cell1);
+						break;
+					}
+					case 0x3600: //读取设计信息
+					{
+						SendData(ID_BMS_BC, MODE_REPORT, 0x1410, (uint8_t*)&BMS_DesignInfo.Capacity);
+						break;
+					}
+					case 0x3700: //读取生产信息
+					{
+						SendData(ID_BMS_TO_CDL, MODE_REPORT, 0x5120, (uint8_t*)&BMS_MacInfo.Manufacturer);
+						break;
+					}							
+					default:break;
+				}
+			}		  
+			break;
+		}
+		
 		//处理PBU发送的指令
 		case ID_PBU_BC: case ID_PBU_TO_MC:
 		{	  		
 			switch(Cmd)
 			{
 				//PBU广播的指令
-        case 0x1008://PBU关机指令
+        		case 0x1008://PBU关机指令
 				{
 					PowerOff_Process(FALSE);
 					break;
 				}
 				case 0x120C://PBU物理ID
 				{
-				  memcpy(PBU_CheckInfo.MAC_ID, Data, DataLength);
+				  	memcpy(PBU_CheckInfo.MAC_ID, Data, DataLength);
 					break;
 				}
 				case 0x130C://PBU存储的校验码
@@ -151,36 +217,36 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				#if 1  // PBU/OBC发送给MC的指令
 				case 0x3002://控制电机指令
 				{
-				  if(MC_WorkMode != MC_WorkMode_Config)
+				  	if(MC_WorkMode != MC_WorkMode_Config)
 					{
-					  memcpy(&MC_ControlCode.GearSt, Data, DataLength);
-					  Update_MC_ControlCode_Back();
+						memcpy(&MC_ControlCode.GearSt, Data, DataLength);
+						Update_MC_ControlCode_Back();
 					}			
-		      MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
+		      		MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
 					MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
 					SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
 					//PBU通信正常标志置位
-			    IsComOK_PBU.IsOK_Flag = TRUE;
-			    IsComOK_PBU.OK_TrigTime = HAL_GetTick();
+					IsComOK_PBU.IsOK_Flag = TRUE;
+					IsComOK_PBU.OK_TrigTime = HAL_GetTick();
 					break;
 				}
 				case 0x3105://PBU在线检测反馈
 				{
-				  if(strncmp("READY", (char*)Data, DataLength) == 0)
+					if(strncmp("READY", (char*)Data, DataLength) == 0)
 					{
-					  DeviceOnLine_Status.Status_Bit.PBU_OffLine = 0;
+						DeviceOnLine_Status.Status_Bit.PBU_OffLine = 0;
 					}
-					break;
+					break;	
 				}
 				case 0x3208://PBU控制参数配置
 				{
-				  memcpy(&PBU_ConfigParam.GearsNum, Data, DataLength);
+				  	memcpy(&PBU_ConfigParam.GearsNum, Data, DataLength);
 					SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x3300://OBC查询用户参数
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));					
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));					
 					memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, sizeof(MC_ConfigParam1_Struct_t));					
 					Data[0] = MC_ConfigParam1.WheelSize;   //轮胎默认周长
 					Data[1] = MC_ConfigParam1.StarModel;   //启动模式
@@ -197,7 +263,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3408://OBC设置用户参数
 				{
-				  MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
+				  	MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
 					if(MC_ConfigParam1.WheelSizeAdj > 10)
 					{
 						MC_ConfigParam1.WheelSizeAdj = 10;
@@ -210,11 +276,11 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					MC_ConfigParam2.SpeedLimitAdj = (int8_t)Data[4];
 					if(MC_ConfigParam2.SpeedLimitAdj > 0)
 					{
-					  MC_ConfigParam2.SpeedLimitAdj = 0;
+					  	MC_ConfigParam2.SpeedLimitAdj = 0;
 					}
 					else if(MC_ConfigParam2.SpeedLimitAdj < -20)
 					{
-					  MC_ConfigParam2.SpeedLimitAdj = -20;
+					  	MC_ConfigParam2.SpeedLimitAdj = -20;
 					}
 					IsFlashSaveDataUpdate = TRUE;
 					//变速器参数初始化
@@ -224,21 +290,21 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3500://OBC查询骑行历史
 				{
-				  SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
+				  	SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
 					break;
 				}
 				case 0x3605://OBC清除TRIP信息
 				{
-			  	if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
+			  		if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
 					{
-					  MC_RideLog.TRIP_Km = 0;
+					  	MC_RideLog.TRIP_Km = 0;
 						MC_RideLog.TRIP_Time = 0;
 						if(strncmp("CLEAR_ODO", (char*)UserString1, 9) != 0)//利用UserString1作为是否允许清除ODO的标志
 						{
-						  if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
+						  	if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
 							{
-						  	MC_RideLog.ODO_Km = 0;
-					  		MC_RideLog.ODO_Time = 0;
+								MC_RideLog.ODO_Km = 0;
+								MC_RideLog.ODO_Time = 0;
 							}
 							strncpy((char*)UserString1, (char*)"CLEAR_ODO", 9);
 							IsFlashSaveDataUpdate = TRUE;
@@ -253,7 +319,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				#else //ECU的指令
 				case 0x3300://ECU查询用户参数
 				{
-				  GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);					
+				  	GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);					
 					Data[0] = MC_ConfigParam1.WheelSize;   //轮胎默认周长
 					Data[1] = MC_ConfigParam1.SpeedLimit;  //限速值
 					Data[2] = 0x18;                        //低压保护阈值 31000mV
@@ -263,10 +329,10 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3708://ECU控制指令
 				{
-				if(MC_WorkMode != MC_WorkMode_Config)
+					if(MC_WorkMode != MC_WorkMode_Config)
 					{
-					  memcpy(&MC_ControlCode.GearSt, Data, 2);
-					  Update_MC_ControlCode_Back();
+						memcpy(&MC_ControlCode.GearSt, Data, 2);
+						Update_MC_ControlCode_Back();
 						//更新轮速,仅配置为通过通信获取车轮周期时更新
 						if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION)
 						{
@@ -274,24 +340,24 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 							MC_SpeedSensorData.IsTrigFlag = TRUE;
 						}
 					}			
-		      MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
+		      		MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
 					MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
 					SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
 					//PBU通信正常标志置位
-			    IsComOK_PBU.IsOK_Flag = TRUE;
-			    IsComOK_PBU.OK_TrigTime = HAL_GetTick();
+					IsComOK_PBU.IsOK_Flag = TRUE;
+					IsComOK_PBU.OK_TrigTime = HAL_GetTick();
 					break;
 				}
 				case 0x3810://ECU设置用户参数
 				{
-			  	MC_ConfigParam1.WheelSize = Data[0];
+			  		MC_ConfigParam1.WheelSize = Data[0];
 					if(MC_ConfigParam1.WheelSize > 250)
 					{
-					  MC_ConfigParam1.WheelSize = 250;
+					  	MC_ConfigParam1.WheelSize = 250;
 					}
 					if(MC_ConfigParam1.WheelSize < 120)
 					{
-					  MC_ConfigParam1.WheelSize = 120;
+					  	MC_ConfigParam1.WheelSize = 120;
 					}
 					MC_ConfigParam1.SpeedLimit = Data[1];
 					if(MC_ConfigParam1.SpeedLimit > 99)
@@ -346,7 +412,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x4300://OBC设置OBC查询骑行参数
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));					
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));					
 					memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, sizeof(MC_ConfigParam1_Struct_t));					
 					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM2, Data, sizeof(MC_ConfigParam2_Struct_t));
 					memcpy((uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch, Data, sizeof(MC_ConfigParam2_Struct_t));
@@ -357,7 +423,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x4420://OBC设置骑行参数
 				{
-				  memcpy((uint8_t*)&MC_ConfigParam1.UserAdjParam1_ECO.Assist_K_GAIN, Data, 10);
+				  	memcpy((uint8_t*)&MC_ConfigParam1.UserAdjParam1_ECO.Assist_K_GAIN, Data, 10);
 					memcpy((uint8_t*)&MC_ConfigParam2.UserAdjParam2_ECO.MaxCurrent_K_GAIN, Data + 10, 10);					
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
@@ -370,24 +436,24 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 		//处理HMI发送的指令
 		case ID_HMI_BC: case ID_HMI_TO_MC:
 		{
-		  switch(Cmd)
+		  	switch(Cmd)
 			{
-			  //HMI广播的指令
+			  	//HMI广播的指令
 				case 0x110C://HMI物理ID
 				{
-				  memcpy(HMI_CheckInfo.MAC_ID, Data, DataLength);
+				  	memcpy(HMI_CheckInfo.MAC_ID, Data, DataLength);
 					break;
 				}
 				case 0x120C://HMI存储的校验码
 				{
-				  memcpy(HMI_CheckInfo.CheckCode, Data, DataLength);
+				  	memcpy(HMI_CheckInfo.CheckCode, Data, DataLength);
 					break;
 				}
 				case 0x1508://HMI运行信息
 				{
 				  //HMI通信正常标志置位
-			    IsComOK_HMI.IsOK_Flag = TRUE;
-			    IsComOK_HMI.OK_TrigTime = HAL_GetTick();
+					IsComOK_HMI.IsOK_Flag = TRUE;
+					IsComOK_HMI.OK_TrigTime = HAL_GetTick();
 					break;
 				}
 				//HMI发送MC的指令
@@ -407,7 +473,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3100://查询电机配置参数
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
 					memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, sizeof(MC_ConfigParam1_Struct_t));
 					Data[0] = MC_ConfigParam1.WheelSize;   //轮胎默认周长
 					Data[1] = MC_ConfigParam1.StarModel;   //启动模式
@@ -436,9 +502,9 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3305://HMI在线检测反馈
 				{
-				  if(strncmp("READY", (char*)Data, DataLength) == 0)
+				  	if(strncmp("READY", (char*)Data, DataLength) == 0)
 					{
-					  DeviceOnLine_Status.Status_Bit.HMI_OffLine = 0;
+					  	DeviceOnLine_Status.Status_Bit.HMI_OffLine = 0;
 					}
 					break;
 				}
@@ -449,16 +515,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3505://清除TRIP信息
 				{
-				  if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
+				  	if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
 					{
-					  MC_RideLog.TRIP_Km = 0;
+					  	MC_RideLog.TRIP_Km = 0;
 						MC_RideLog.TRIP_Time = 0;
 						if(strncmp("CLEAR_ODO", (char*)UserString1, 9) != 0)//利用UserString1作为是否允许清除ODO的标志
 						{
-						  if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
+						  	if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
 							{
-						  	MC_RideLog.ODO_Km = 0;
-					  		MC_RideLog.ODO_Time = 0;
+								MC_RideLog.ODO_Km = 0;
+								MC_RideLog.ODO_Time = 0;
 							}
 							strncpy((char*)UserString1, (char*)"CLEAR_ODO", 9);
 							IsFlashSaveDataUpdate = TRUE;
@@ -478,15 +544,15 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 		{
 			switch(Cmd)
 			{
-			  case 0x1000://查询校验密钥
+			  	case 0x1000://查询校验密钥
 				{
-				  GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
+				  	GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA408, Secret_Key);
 					break;
 				}
 				case 0x1108://写入校验密钥
 				{
-				  memcpy(Secret_Key, Data, DataLength);
+				  	memcpy(Secret_Key, Data, DataLength);
 					SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					//写入密钥后时,重新对电机授权码计算和存储
@@ -509,51 +575,51 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1300://查询自定义字符串1
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO1, UserString1, 16);
+					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO1, UserString1, 16);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA610, UserString1);
 					break;
 				}
 				case 0x1410://写入自定义字符串1
 				{
-				  memcpy(UserString1, Data, DataLength);
+				  	memcpy(UserString1, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x1500://查询自定义字符串2
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO2, UserString2, 16);
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO2, UserString2, 16);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA710, UserString2);
 					break;
 				}
 				case 0x1610://写入自定义字符串2
 				{
-				  memcpy(UserString2, Data, DataLength);
+				  	memcpy(UserString2, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x1700://查询自定义字符串3
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO3, UserString3, 16);
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO3, UserString3, 16);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA810, UserString3);
 					break;
 				}
 				case 0x1810://写入自定义字符串3
 				{
-				  memcpy(UserString3, Data, DataLength);
+				  	memcpy(UserString3, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x1901://写入电机工作模式
 				{
-				  MC_WorkMode = (MC_WorkMode_Struct_t)*Data;
+				  	MC_WorkMode = (MC_WorkMode_Struct_t)*Data;
 					MC_WorkMode_Back = (MC_WorkMode_Struct_t)~MC_WorkMode;
 					//配置模式时,清除设备校验失败故障码
 					if(MC_WorkMode != MC_WorkMode_Run)
 					{
-					  MC_ErrorCode.ERROR_Bit.Fault_BMS_Check = 0;
+					  	MC_ErrorCode.ERROR_Bit.Fault_BMS_Check = 0;
 						MC_ErrorCode.ERROR_Bit.Fault_PBU_Check = 0;
 						MC_ErrorCode.ERROR_Bit.Fault_HMI_Check = 0;
 					}
@@ -561,13 +627,13 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1A00://查询电机控制参数1
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA020, Data);
 					break;
 				}
 				case 0x1B20://写入电机控制参数1
 				{
-				  memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, DataLength);
+				  	memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, DataLength);
 					MC_GasMode_Param.Mode = MC_ConfigParam1.GasCtrlMode_Param;
 					IsFlashSaveDataUpdate = TRUE;
 					//助力参数初始化
@@ -579,13 +645,13 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1C00://查询马达参数
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MOTOR_PARAM, Data, sizeof(MC_MotorParam_Struct_t));			
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MOTOR_PARAM, Data, sizeof(MC_MotorParam_Struct_t));			
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA110, Data);
 					break;
 				}
 				case 0x1D10://写入马达参数
 				{
-				  memcpy((uint8_t*)&MC_MotorParam.Rate_Power, Data, DataLength);
+				  	memcpy((uint8_t*)&MC_MotorParam.Rate_Power, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
@@ -600,23 +666,23 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1F00://查询电机生产信息
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MAC_INFO, (uint8_t*)MC_MacInfo.Manufacturer, 32);
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MAC_INFO, (uint8_t*)MC_MacInfo.Manufacturer, 32);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA520, (uint8_t*)MC_MacInfo.Manufacturer);
 					break;
 				}
 				case 0x2000://查询力矩传感器零偏数据
 				{
-				  //...三力矩传感器,不用该命令
+				  	//...三力矩传感器,不用该命令
 					break;
 				}
 				case 0x2100://查询设备在线结果
 				{
-				  SendData(ID_MC_BC, MODE_REPORT, 0x1401, &DeviceOnLine_Status.Status);
+				  	SendData(ID_MC_BC, MODE_REPORT, 0x1401, &DeviceOnLine_Status.Status);
 					break;
 				}
 				case 0x2210://写入电机Mode
 				{
-				  memcpy(MC_VerInfo.Mode, Data, DataLength);
+				  	memcpy(MC_VerInfo.Mode, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					//写入型号时,完成电机授权码计算和存储
@@ -625,41 +691,41 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x2310://写入电机SN
 				{
-				  memcpy(MC_VerInfo.SN_Num, Data, DataLength);
+				  	memcpy(MC_VerInfo.SN_Num, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x2420://写入电机生产信息
 				{
-				  memcpy(MC_MacInfo.Manufacturer, Data, DataLength);
+				  	memcpy(MC_MacInfo.Manufacturer, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x2505://复位指令
 				{
-				  if(strncmp("RESET", (char*)Data, DataLength) == 0)
+				  	if(strncmp("RESET", (char*)Data, DataLength) == 0)
 					{
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 						PowerOff_Process(TRUE);
-		    	  HAL_Delay(100);
-			      __set_FAULTMASK(1);//关闭所有中断
-			      HAL_NVIC_SystemReset();
+						HAL_Delay(100);
+						__set_FAULTMASK(1);//关闭所有中断
+						HAL_NVIC_SystemReset();
 					}
 					break;
 				}
 				case 0x2605://系统清除
 				{
-				  if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
+				  	if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
 					{
-					  EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_FLAG + 4, 0xFF);//清除标志位
+					  	EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_FLAG + 4, 0xFF);//清除标志位
 						EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, EEPROM_24C02_ADDR_RUN_LOG1 + 4, 0xFF);//清除开机次数
 						EEPROM_Flash_Erase(EEPROM_FLASH_BEGIN_ADDRESS, EEPROM_FLASH_END_ADDRESS);
 						EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN, LOG_ADDRESS_END);
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
-				  	__set_FAULTMASK(1);//关闭所有中断
-			      HAL_NVIC_SystemReset();
+						__set_FAULTMASK(1);//关闭所有中断
+						HAL_NVIC_SystemReset();
 					}
 					break;
 				}
@@ -667,23 +733,22 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				{
 					if(strncmp("RECOVERY", (char*)Data, DataLength) == 0)
 					{
-					  Var_SetToDefaultParam();
+					  	Var_SetToDefaultParam();
 						EEPROM_24C02_ParamReset(&I2C_Handle_EEPROM);
 						CopyDataToEEPROM_Flash();
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
-				  	__set_FAULTMASK(1);//关闭所有中断
-			      HAL_NVIC_SystemReset();
+				  		__set_FAULTMASK(1);//关闭所有中断
+			      		HAL_NVIC_SystemReset();
 					}
 					break;
 				}
 				case 0x2802://控制指令
 				{
 			 		memcpy(&MC_ControlCode.GearSt, Data, DataLength);
-					Update_MC_ControlCode_Back();
-					
+					Update_MC_ControlCode_Back();					
 					//PBU通信正常标志置位,避免上位機測試時認爲PBU失聯而關閉助力
-		    	IsComOK_PBU.IsOK_Flag = TRUE;
-			    IsComOK_PBU.OK_TrigTime = HAL_GetTick();
+					IsComOK_PBU.IsOK_Flag = TRUE;
+					IsComOK_PBU.OK_TrigTime = HAL_GetTick();
 					//運行信息助力档位更新
 					MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
 					MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
@@ -692,29 +757,29 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x2900://查询力矩传感器校正信息
 				{
-				  //...三力矩传感器,不用该命令
+				  	//...三力矩传感器,不用该命令
 					break;
 				}
 				case 0x2A01://写入力矩传感器标定系数
 				{
-				  //...三力矩传感器,不用该命令
+				  	//...三力矩传感器,不用该命令
 					break;
 				}
 				case 0x2B02://写入力矩传感器启动值
 				{
-				  memcpy((uint8_t*)&TorqueSensorStartData, Data, DataLength);
+				  	memcpy((uint8_t*)&TorqueSensorStartData, Data, DataLength);
 					SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), (uint8_t*)&TorqueSensorStartData);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x2C01://设置推行模式最高转速百分比
 				{
-				  MC_WalkMode_Persent = Data[0];
+				  	MC_WalkMode_Persent = Data[0];
 					break;
 				}
-        case 0x2D08://读取RAM或FLASH存储器指定地址数据
+        		case 0x2D08://读取RAM或FLASH存储器指定地址数据
 				{
-				  do
+				  	do
 					{
 						uint32_t DataLength;
 						DataLength = (uint32_t)((Data[4] << 24) + (Data[5] << 16) + (Data[6] << 8) + (Data[7])) - (uint32_t)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])) + 1;
@@ -727,7 +792,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				{
 					do
 					{
-					  uint32_t AddrBegin, AddrEnd;
+					  	uint32_t AddrBegin, AddrEnd;
 						uint32_t DataLength;
 						//取起止地址
 						AddrBegin = (uint32_t)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3]));
@@ -737,13 +802,13 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 						//RAM数据
 						if(AddrBegin > 0x20000000)
 						{
-						  memcpy((uint8_t*)(AddrBegin), (uint8_t*)(Data + 8), DataLength);
+						  	memcpy((uint8_t*)(AddrBegin), (uint8_t*)(Data + 8), DataLength);
 							SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 						}
 						//FLASH数据,该功能慎用,FLASH只能按页擦除,地址需要谨慎计算,首地址必须为页首
 						else if(AddrBegin  > 0x08003000)
 						{
-						  EEPROM_Flash_Erase(AddrBegin, AddrBegin + 0x3FF);//擦除首地址对应的页
+						  	EEPROM_Flash_Erase(AddrBegin, AddrBegin + 0x3FF);//擦除首地址对应的页
 							SaveDataToEEPROM_Flash(AddrBegin, Data + 8, DataLength);
 							SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 						}												
@@ -756,70 +821,70 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x2F00://读取姿态传感器数值
 				{
-				  SendData(ID_MC_BC, MODE_REPORT, 0x1608, (uint8_t*)&MC_AttitudeAngle.Angle_Pitch_Absolute);
+				  	SendData(ID_MC_BC, MODE_REPORT, 0x1608, (uint8_t*)&MC_AttitudeAngle.Angle_Pitch_Absolute);
 					break;
 				}
 				case 0x3000://查询电机控制参数2
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM2, Data, sizeof(MC_ConfigParam2_Struct_t));
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM2, Data, sizeof(MC_ConfigParam2_Struct_t));
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAD20, Data);
 					break;
 				}
 				case 0x3120://写入电机控制参数2
 				{
-				  memcpy((uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch, Data, DataLength);
+				  	memcpy((uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}				
 				case 0x3201://查询力矩传感器零点值
-        {
-          //Data[0]表示需要读取的传感器序号,相邻两个地址偏差为29
-          GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET_1 + (29 * (Data[0] - 1)), sizeof(TorqueOffSetData_Struct_t), Data + 1);
-          switch(Data[0])
-          {
-            case 1:
-            {
-              memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_1_Param.Torque_OffSetData.PresentData, 2);
-              break;
-            }
-            case 2:
-            {
-              memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_2_Param.Torque_OffSetData.PresentData, 2);
-              break;
-            }
-            case 3:
-            {
-              memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_3_Param.Torque_OffSetData.PresentData, 2);
-              break;
-            }
-          }
-          SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAE1A, Data);
-          break;
-        }
+				{
+					//Data[0]表示需要读取的传感器序号,相邻两个地址偏差为29
+					GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET_1 + (29 * (Data[0] - 1)), sizeof(TorqueOffSetData_Struct_t), Data + 1);
+					switch(Data[0])
+					{
+						case 1:
+						{
+							memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_1_Param.Torque_OffSetData.PresentData, 2);
+							break;
+						}
+						case 2:
+						{
+							memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_2_Param.Torque_OffSetData.PresentData, 2);
+							break;
+						}
+						case 3:
+						{
+							memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_3_Param.Torque_OffSetData.PresentData, 2);
+							break;
+						}
+					}
+					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAE1A, Data);
+					break;
+				}
 				case 0x3301://查询力矩传感器标定系数
 				{
-				  //Data[0]表示需要读取的传感器序号,相邻两个地址偏差为29
+				  	//Data[0]表示需要读取的传感器序号,相邻两个地址偏差为29
 					GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_1_CAL_K + (29 * (Data[0] - 1)), sizeof(uint8_t), Data + 1);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAF02, Data);
 					break;
 				}
 				case 0x3402://写入力矩传感器标定系数
 				{
-				  //Data[0]表示需要读取的传感器序号
+				  	//Data[0]表示需要读取的传感器序号
 					if(Data[0] == 1)
 					{
-					  TorqueSensor_1_Param.Torque_Cal_K = Data[1];
+					  	TorqueSensor_1_Param.Torque_Cal_K = Data[1];
 						SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_1_CAL_K, sizeof(TorqueSensor_1_Param.Torque_Cal_K), &TorqueSensor_1_Param.Torque_Cal_K);
 					}
 					else if(Data[0] == 2)
 					{
-					  TorqueSensor_2_Param.Torque_Cal_K = Data[1];
+					  	TorqueSensor_2_Param.Torque_Cal_K = Data[1];
 						SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_2_CAL_K, sizeof(TorqueSensor_2_Param.Torque_Cal_K), &TorqueSensor_2_Param.Torque_Cal_K);
 					}
 					else if(Data[0] == 3)
 					{
-					  TorqueSensor_3_Param.Torque_Cal_K = Data[1];
+					  	TorqueSensor_3_Param.Torque_Cal_K = Data[1];
 						SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_3_CAL_K, sizeof(TorqueSensor_3_Param.Torque_Cal_K), &TorqueSensor_3_Param.Torque_Cal_K);
 					}
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
@@ -827,15 +892,15 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3500://查询启动值
 				{
-				  GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), Data);
+				  	GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), Data);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xB002, Data);
 					break;
 				}
 				case 0x3909://清除历史信息
 				{
-				  if(strncmp("LOG CLEAR", (char*)Data, DataLength) == 0)
+				  	if(strncmp("LOG CLEAR", (char*)Data, DataLength) == 0)
 					{
-					  Var_SetToDefaultLog();
+					  	Var_SetToDefaultLog();
 						EEPROM_24C02_LogReset(&I2C_Handle_EEPROM);
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					}
@@ -843,27 +908,27 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3ACC://电池放电曲线
 				{
-				  memcpy((uint8_t*)&BatteryCellInfo.DesignCap, Data, DataLength);
+				  	memcpy((uint8_t*)&BatteryCellInfo.DesignCap, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x3B10://写入ODO和TRIP信息
 				{
-				  memcpy((uint8_t*)&MC_RideLog.ODO_Km, Data, DataLength);
+				  	memcpy((uint8_t*)&MC_RideLog.ODO_Km, Data, DataLength);
 					SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
 				}
 				case 0x3C00://查询电机标签信息
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_TAG_INFO, MC_TagInfo, 32);
+				  	ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_TAG_INFO, MC_TagInfo, 32);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBB20, MC_TagInfo);
 					break;
 				}
 				case 0x3D20://写入电机标签信息
 				{
-				  memcpy(MC_TagInfo, Data, DataLength);
+				  	memcpy(MC_TagInfo, Data, DataLength);
 					IsFlashSaveDataUpdate = TRUE;
 					SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
 					break;
@@ -874,16 +939,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 		}
     case ID_CDL_TO_MC_TE://0X651
     {
-      switch(Cmd)
-      {
-        case 0x2505: case 0xA10B: //TE复位指令和TE升级指令,让主控进入TE升级状态
-           IsSendDataToTE_Step = SENDUPDATA;
-          break;
-        default:
-          break;
-      }      
-      SendUartDataToTE(&UART_TxBuff_Struct3,ID_CDL_TO_MC_TE,Mode,Cmd, Data);//直接透传所有的0X651指令 
-      break;
+		switch(Cmd)
+		{
+			case 0x2505: case 0xA10B: //TE复位指令和TE升级指令,让主控进入TE升级状态
+				IsSendDataToTE_Step = SENDUPDATA;
+				break;
+			default:
+				break;
+		}      
+		SendUartDataToTE(&UART_TxBuff_Struct3,ID_CDL_TO_MC_TE,Mode,Cmd, Data);//直接透传所有的0X651指令 
+		break;
     }      
 		default:break;
 	}
@@ -895,46 +960,46 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 uint8_t CAN_RevData[255], CAN_RevData_CRC_Buf[255];
 void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
 {
-  uint8_t Mode, CmdLength, DataLength;
+  	uint8_t Mode, CmdLength, DataLength;
 	uint16_t Cmd, i;
 	uint32_t CrcResult, CrcData;
 	uint8_t FrameBegin1, FrameBegin2;
 	
 	if(ptCANRx->ucBufCnt >= 11)
 	{
-	  //读取帧头
+	  	//读取帧头
 		FrameBegin1 = cd_ReadChar(ptCANRx, 0);
 		CAN_RevData_CRC_Buf[0] = FrameBegin1;
 		FrameBegin2 = cd_ReadChar(ptCANRx, 1);
 		CAN_RevData_CRC_Buf[1] = FrameBegin2;
 		if((FrameBegin1 == FRAME_BEGIN1) && (FrameBegin2 == FRAME_BEGIN2))
 		{
-		  CAN_RevData_CRC_Buf[2] = (uint8_t)((ptCANRx->ucBufID >> 8) & 0xFF);
+		  	CAN_RevData_CRC_Buf[2] = (uint8_t)((ptCANRx->ucBufID >> 8) & 0xFF);
 			CAN_RevData_CRC_Buf[3] = (uint8_t)(ptCANRx->ucBufID & 0xFF);
 			//读取帧模式
 			Mode = cd_ReadChar(ptCANRx, 2);
 			CAN_RevData_CRC_Buf[4] = Mode;
 			if((Mode == MODE_READ) || (Mode == MODE_WRITE) || (Mode == MODE_REPORT))
 			{
-			  //读取命令段长度和命令字
+			  	//读取命令段长度和命令字
 				CmdLength = cd_ReadChar(ptCANRx, 3);
 				CAN_RevData_CRC_Buf[5] = CmdLength;
 				Cmd = (cd_ReadChar(ptCANRx, 4) << 8) + cd_ReadChar(ptCANRx, 5);
 				CAN_RevData_CRC_Buf[6] = (uint8_t)((Cmd >> 8) & 0xFF);
-		  	CAN_RevData_CRC_Buf[7] = (uint8_t)(Cmd & 0xFF);
+		  		CAN_RevData_CRC_Buf[7] = (uint8_t)(Cmd & 0xFF);
 				DataLength = cd_ReadChar(ptCANRx, 5);
 				if((CmdLength - DataLength) == 2)
 				{
 					if(ptCANRx->ucBufCnt < (CmdLength + 9))//帧头2bytes  + 模式1byte + 命令段长度1byte + 校验位4bytes + 帧尾1byte
 					{
-					  if(ptCANRx->IsWaitRX_Flag == FALSE)
+					 	 if(ptCANRx->IsWaitRX_Flag == FALSE)
 						{
-						  ptCANRx->DelayTimeCnt = HAL_GetTick();
+						  	ptCANRx->DelayTimeCnt = HAL_GetTick();
 							ptCANRx->IsWaitRX_Flag = TRUE;
 						}
 						if((HAL_GetTick() - ptCANRx->DelayTimeCnt) > TimeOutCnt)//超时,单位ms
 						{
-						  cd_DelChar(ptCANRx, ptCANRx->ucBufCnt);
+						  	cd_DelChar(ptCANRx, ptCANRx->ucBufCnt);
 							ptCANRx->IsWaitRX_Flag = FALSE;
 						}
 						return;
@@ -945,7 +1010,7 @@ void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
 						//接收到完整正确数据包
 						for(i=0; i<DataLength; i++)//读取数据段
 						{
-						  CAN_RevData[i] = cd_ReadChar(ptCANRx, 6 + i);
+						  	CAN_RevData[i] = cd_ReadChar(ptCANRx, 6 + i);
 							CAN_RevData_CRC_Buf[8 + i] = CAN_RevData[i];
 						}
 						CrcData = (cd_ReadChar(ptCANRx, 6 + DataLength) << 24) + \
@@ -955,7 +1020,7 @@ void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
 						CrcResult = CRC32_Calculate(CAN_RevData_CRC_Buf, 8 + DataLength);
 						if((CrcData - CrcResult) == 0) // 比较校验
 						{
-						  //数据处理
+						  	//数据处理
 							DataProcess(ptCANRx->ucBufID, Mode, Cmd, CAN_RevData);//Mode为帧模式,Cmd为命令字,Data为数据段
 							cd_DelChar(ptCANRx, CmdLength + 9);
 							return;
@@ -965,17 +1030,17 @@ void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
 				}
 				else
 				{
-				  cd_DelChar(ptCANRx, 1);
+				  	cd_DelChar(ptCANRx, 1);
 				}
 			}
 			else
 			{
-			  cd_DelChar(ptCANRx, 1);
+			  	cd_DelChar(ptCANRx, 1);
 			}
 		}
 		else
 		{
-		  cd_DelChar(ptCANRx, 1);
+		  	cd_DelChar(ptCANRx, 1);
 		}
 	}
 }

+ 1 - 0
User/Src/tasks.c

@@ -138,6 +138,7 @@ void CanRx_Process(void)
 	CAN_RxData_Process(&CAN_RxBuf_Struct_BMS, 500);
 	CAN_RxData_Process(&CAN_RxBuf_Struct_HMI, 500);
 	CAN_RxData_Process(&CAN_RxBuf_Struct_CDL, 500);
+	CAN_RxData_Process(&CAN_RxBuf_Struct_To_BMS, 500);
 }
 
 //UARTÊý¾Ý½âÎöº¯Êý

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff