can_process.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. #include "can_process.h"
  2. #include "uart_process.h"
  3. #include "motor_control.h"
  4. #include "crc_cal.h"
  5. #include "var.h"
  6. #include "eeprom_24c02.h"
  7. #include "eeprom_flash.h"
  8. #include "tasks.h"
  9. #include "ctf_process.h"
  10. #include "log_save.h"
  11. #include "speed_sensor.h"
  12. #include "enviolo_can.h"
  13. #include "bms_magene.h"
  14. /**********局部函数定义**********/
  15. uint8_t cd_ReadChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
  16. {
  17. uint8_t ucData;
  18. uint16_t i;
  19. i = ucNum;
  20. if ((*ptCANRx).ucBufCnt >= ucNum)
  21. {
  22. i += (*ptCANRx).ucBufRdInde;
  23. if (i >= (*ptCANRx).ucBufSize)
  24. {
  25. i -=((*ptCANRx).ucBufSize);
  26. }
  27. }
  28. else
  29. {
  30. i=0;
  31. }
  32. ucData = *((*ptCANRx).pcBufAddr + i);
  33. return ucData;
  34. }
  35. void cd_DelChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
  36. {
  37. uint16_t i;
  38. if ((*ptCANRx).ucBufCnt >= ucNum)
  39. {
  40. __HAL_CAN_DISABLE_IT(&hcan, CAN_IT_FMP0);//关接收中断
  41. (*ptCANRx).ucBufCnt -= ucNum;
  42. __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
  43. i = ucNum;
  44. i += (*ptCANRx).ucBufRdInde;
  45. if (i >= (*ptCANRx).ucBufSize)
  46. {
  47. i -= (*ptCANRx).ucBufSize;
  48. }
  49. (*ptCANRx).ucBufRdInde = i;
  50. }
  51. else
  52. {
  53. __HAL_CAN_DISABLE_IT(&hcan, CAN_IT_FMP0);//关接收中断
  54. i = (*ptCANRx).ucBufCnt;
  55. (*ptCANRx).ucBufCnt = 0;
  56. __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
  57. i += (*ptCANRx).ucBufRdInde;
  58. if (i >= (*ptCANRx).ucBufSize)
  59. {
  60. i -= (*ptCANRx).ucBufSize;
  61. }
  62. (*ptCANRx).ucBufRdInde = i;
  63. }
  64. }
  65. //数据解析处理
  66. void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
  67. {
  68. uint8_t DataLength;
  69. DataLength = (uint8_t)(Cmd &0x00FF);
  70. switch(ID)
  71. {
  72. //处理BMS发送的指令
  73. case ID_BMS_BC: case ID_BMS_TO_MC:
  74. {
  75. switch(Cmd)
  76. {
  77. //BMS广播的指令
  78. case 0x1010://BMS运行信息
  79. {
  80. //更新电池运行信息
  81. memcpy(&BMS_RunInfo.Voltage, Data, DataLength);
  82. MC_RunInfo.SOC = BMS_RunInfo.SOC;
  83. //电池通信正常标志置位,用于续航计算
  84. RemainDis.IsBMS_ComOK_Flag = TRUE;
  85. RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
  86. //BMS通信正常标志置位
  87. IsComOK_BMS.IsOK_Flag = TRUE;
  88. IsComOK_BMS.OK_TrigTime = HAL_GetTick();
  89. break;
  90. }
  91. case 0x1308://关机指令
  92. {
  93. PowerOff_Process(FALSE);
  94. break;
  95. }
  96. case 0x1410://电池设计信息
  97. {
  98. memcpy(&BMS_DesignInfo.Capacity, Data, DataLength);
  99. break;
  100. }
  101. case 0x160C://电池物理ID
  102. {
  103. memcpy(BMS_CheckInfo.MAC_ID, Data, DataLength);
  104. break;
  105. }
  106. case 0x170C://电池存储的校验码
  107. {
  108. memcpy(BMS_CheckInfo.CheckCode, Data, DataLength);
  109. break;
  110. }
  111. //BMS发送给MC的指令
  112. case 0x3005://电池在线检测反馈
  113. {
  114. if(strncmp("READY", (char*)Data, DataLength) == 0)
  115. {
  116. DeviceOnLine_Status.Status_Bit.BMS_OffLine = 0;
  117. }
  118. break;
  119. }
  120. default:break;
  121. }
  122. break;
  123. }
  124. //处理仪表发送BMS的指令
  125. case ID_PBU_TO_BMS: case ID_CDL_TO_BMS:
  126. {
  127. if((BMS_Magene_OnLineCheck_Main.OnLineFlag == 1) && (BMS_Magene_OnLineCheck_Back.OnLineFlag == 1))
  128. {
  129. switch(Cmd)
  130. {
  131. //仪表指令
  132. case 0x5000: //读取运行信息
  133. {
  134. SendData(ID_BMS_BC, MODE_REPORT, 0x1010, (uint8_t*)&BMS_RunInfo.Voltage);
  135. break;
  136. }
  137. case 0x5100: //读取版本信息
  138. {
  139. SendData(ID_BMS_BC, MODE_REPORT, 0x1540, (uint8_t*)&BMS_VerInfo.Mode);
  140. break;
  141. }
  142. case 0x5200: //读取设计信息
  143. {
  144. SendData(ID_BMS_BC, MODE_REPORT, 0x1410, (uint8_t*)&BMS_DesignInfo.Capacity);
  145. break;
  146. }
  147. case 0x5300: //读取电芯电压
  148. {
  149. SendData(ID_BMS_BC, MODE_REPORT, 0x1120, (uint8_t*)&BMS_CellVol.Cell1);
  150. break;
  151. }
  152. case 0x5400: //读取电池使用记录
  153. {
  154. SendData(ID_BMS_BC, MODE_REPORT, 0x1810, (uint8_t*)&BMS_UsrLog.Max_Tmp);
  155. break;
  156. }
  157. //CDL指令
  158. case 0x3300: //读取版本信息
  159. {
  160. SendData(ID_BMS_BC, MODE_REPORT, 0x1540, (uint8_t*)&BMS_VerInfo.Mode);
  161. break;
  162. }
  163. case 0x3400: //读取运行信息
  164. {
  165. SendData(ID_BMS_BC, MODE_REPORT, 0x1010, (uint8_t*)&BMS_RunInfo.Voltage);
  166. break;
  167. }
  168. case 0x3500: //读取电芯电压
  169. {
  170. SendData(ID_BMS_BC, MODE_REPORT, 0x1120, (uint8_t*)&BMS_CellVol.Cell1);
  171. break;
  172. }
  173. case 0x3600: //读取设计信息
  174. {
  175. SendData(ID_BMS_BC, MODE_REPORT, 0x1410, (uint8_t*)&BMS_DesignInfo.Capacity);
  176. break;
  177. }
  178. case 0x3700: //读取生产信息
  179. {
  180. SendData(ID_BMS_TO_CDL, MODE_REPORT, 0x5120, (uint8_t*)&BMS_MacInfo.Manufacturer);
  181. break;
  182. }
  183. default:break;
  184. }
  185. }
  186. break;
  187. }
  188. //处理PBU发送的指令
  189. case ID_PBU_BC: case ID_PBU_TO_MC:
  190. {
  191. switch(Cmd)
  192. {
  193. //PBU广播的指令
  194. case 0x1008://PBU关机指令
  195. {
  196. PowerOff_Process(FALSE);
  197. break;
  198. }
  199. case 0x120C://PBU物理ID
  200. {
  201. memcpy(PBU_CheckInfo.MAC_ID, Data, DataLength);
  202. break;
  203. }
  204. case 0x130C://PBU存储的校验码
  205. {
  206. memcpy(PBU_CheckInfo.CheckCode, Data, DataLength);
  207. break;
  208. }
  209. #if 1 // PBU/OBC发送给MC的指令
  210. case 0x3002://控制电机指令
  211. {
  212. if(MC_WorkMode != MC_WorkMode_Config)
  213. {
  214. memcpy(&MC_ControlCode.GearSt, Data, DataLength);
  215. Update_MC_ControlCode_Back();
  216. }
  217. MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
  218. MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
  219. SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
  220. //PBU通信正常标志置位
  221. IsComOK_PBU.IsOK_Flag = TRUE;
  222. IsComOK_PBU.OK_TrigTime = HAL_GetTick();
  223. break;
  224. }
  225. case 0x3105://PBU在线检测反馈
  226. {
  227. if(strncmp("READY", (char*)Data, DataLength) == 0)
  228. {
  229. DeviceOnLine_Status.Status_Bit.PBU_OffLine = 0;
  230. }
  231. break;
  232. }
  233. case 0x3208://PBU控制参数配置
  234. {
  235. memcpy(&PBU_ConfigParam.GearsNum, Data, DataLength);
  236. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  237. break;
  238. }
  239. case 0x3300://OBC查询用户参数
  240. {
  241. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
  242. memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, sizeof(MC_ConfigParam1_Struct_t));
  243. Data[0] = MC_ConfigParam1.WheelSize; //轮胎默认周长
  244. Data[1] = MC_ConfigParam1.StarModel; //启动模式
  245. Data[2] = MC_ConfigParam1.SpeedLimit; //限速值
  246. Data[3] = MC_ConfigParam1.WheelSizeAdj;//轮胎微调值
  247. Data[4] = 1; //预留大牙盘
  248. Data[5] = 15; //预留大牙盘
  249. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM2, Data + 6, sizeof(MC_ConfigParam2_Struct_t));
  250. memcpy((uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch, Data + 6, sizeof(MC_ConfigParam2_Struct_t));
  251. Data[6] = MC_ConfigParam2.SpeedLimitAdj;//限速微调值
  252. Data[7] = 0;
  253. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5408, Data);
  254. break;
  255. }
  256. case 0x3408://OBC设置用户参数
  257. {
  258. MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
  259. if(MC_ConfigParam1.WheelSizeAdj > 10)
  260. {
  261. MC_ConfigParam1.WheelSizeAdj = 10;
  262. }
  263. if(MC_ConfigParam1.WheelSizeAdj < -10)
  264. {
  265. MC_ConfigParam1.WheelSizeAdj = -10;
  266. }
  267. MC_ConfigParam1.StarModel = (MC_StarMode_Struct_t)Data[1];
  268. MC_ConfigParam2.SpeedLimitAdj = (int8_t)Data[4];
  269. if(MC_ConfigParam2.SpeedLimitAdj > 0)
  270. {
  271. MC_ConfigParam2.SpeedLimitAdj = 0;
  272. }
  273. else if(MC_ConfigParam2.SpeedLimitAdj < -20)
  274. {
  275. MC_ConfigParam2.SpeedLimitAdj = -20;
  276. }
  277. IsFlashSaveDataUpdate = TRUE;
  278. //变速器参数初始化
  279. GearBox_Init();
  280. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  281. break;
  282. }
  283. case 0x3500://OBC查询骑行历史
  284. {
  285. SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
  286. break;
  287. }
  288. case 0x3605://OBC清除TRIP信息
  289. {
  290. if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
  291. {
  292. MC_RideLog.TRIP_Km = 0;
  293. MC_RideLog.TRIP_Time = 0;
  294. if(strncmp("CLEAR_ODO", (char*)UserString1, 9) != 0)//利用UserString1作为是否允许清除ODO的标志
  295. {
  296. if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
  297. {
  298. MC_RideLog.ODO_Km = 0;
  299. MC_RideLog.ODO_Time = 0;
  300. }
  301. strncpy((char*)UserString1, (char*)"CLEAR_ODO", 9);
  302. IsFlashSaveDataUpdate = TRUE;
  303. }
  304. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  305. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  306. MC_RunInfo.Ride_Km = 0;
  307. MC_RunInfo.Ride_Time = 0;
  308. }
  309. break;
  310. }
  311. #else //ECU的指令
  312. case 0x3300://ECU查询用户参数
  313. {
  314. GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
  315. Data[0] = MC_ConfigParam1.WheelSize; //轮胎默认周长
  316. Data[1] = MC_ConfigParam1.SpeedLimit; //限速值
  317. Data[2] = 0x18; //低压保护阈值 31000mV
  318. Data[3] = 0x79;
  319. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5410, Data);
  320. break;
  321. }
  322. case 0x3708://ECU控制指令
  323. {
  324. if(MC_WorkMode != MC_WorkMode_Config)
  325. {
  326. memcpy(&MC_ControlCode.GearSt, Data, 2);
  327. Update_MC_ControlCode_Back();
  328. //更新轮速,仅配置为通过通信获取车轮周期时更新
  329. if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION)
  330. {
  331. MC_SpeedSensorData.DiffTime_ms = (Data[3] << 8) + Data[2];
  332. MC_SpeedSensorData.IsTrigFlag = TRUE;
  333. }
  334. }
  335. MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
  336. MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
  337. SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
  338. //PBU通信正常标志置位
  339. IsComOK_PBU.IsOK_Flag = TRUE;
  340. IsComOK_PBU.OK_TrigTime = HAL_GetTick();
  341. break;
  342. }
  343. case 0x3810://ECU设置用户参数
  344. {
  345. MC_ConfigParam1.WheelSize = Data[0];
  346. if(MC_ConfigParam1.WheelSize > 250)
  347. {
  348. MC_ConfigParam1.WheelSize = 250;
  349. }
  350. if(MC_ConfigParam1.WheelSize < 120)
  351. {
  352. MC_ConfigParam1.WheelSize = 120;
  353. }
  354. MC_ConfigParam1.SpeedLimit = Data[1];
  355. if(MC_ConfigParam1.SpeedLimit > 99)
  356. {
  357. MC_ConfigParam1.SpeedLimit = 99;
  358. }
  359. if(MC_ConfigParam1.SpeedLimit < 5)
  360. {
  361. MC_ConfigParam1.SpeedLimit = 5;
  362. }
  363. //Data[2]和Data[3]低压保护值暂不处理
  364. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
  365. //变速器参数初始化
  366. GearBox_Init();
  367. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  368. break;
  369. }
  370. #endif
  371. case 0x3900://OBC/ECU查询版本信息
  372. {
  373. if( VersionIdentifyFinishedFlag == TRUE )
  374. {
  375. uint32_t MCU_ID_CRC32;
  376. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
  377. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
  378. MCU_ID_CRC32 = CRC32_Calculate(MC_CheckInfo.MAC_ID, 12);
  379. memcpy((uint8_t*)(MC_VerInfo.HW_Version + 12), (uint8_t*)(&MCU_ID_CRC32), 4);
  380. SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
  381. SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
  382. }
  383. break;
  384. }
  385. case 0x4008://OBC设置变速器工作模式
  386. {
  387. memcpy((uint8_t*)&GearBox_OBC_SetMode.Mode, Data, DataLength);
  388. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  389. break;
  390. }
  391. case 0x4100://OBC查询变速器工作参数
  392. {
  393. GearBox_Send_OBC_Params(GearBox_CalFlag, &GearBox_OBC_SetParams, &EnvioloGearInfo2.Soft_Version);
  394. break;
  395. }
  396. case 0x4208://OBC设置变速器工作参数
  397. {
  398. memcpy((uint8_t*)&GearBox_OBC_SetParams.GearNum, Data, DataLength);
  399. IsFlashSaveDataUpdate = TRUE;
  400. //变速器参数初始化
  401. GearBox_Init();
  402. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  403. break;
  404. }
  405. case 0x4300://OBC设置OBC查询骑行参数
  406. {
  407. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
  408. memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, sizeof(MC_ConfigParam1_Struct_t));
  409. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM2, Data, sizeof(MC_ConfigParam2_Struct_t));
  410. memcpy((uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch, Data, sizeof(MC_ConfigParam2_Struct_t));
  411. memcpy(Data, (uint8_t*)&MC_ConfigParam1.UserAdjParam1_ECO.Assist_K_GAIN, 10);
  412. memcpy(Data + 10, (uint8_t*)&MC_ConfigParam2.UserAdjParam2_ECO.MaxCurrent_K_GAIN, 10);
  413. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5620, Data);
  414. break;
  415. }
  416. case 0x4420://OBC设置骑行参数
  417. {
  418. memcpy((uint8_t*)&MC_ConfigParam1.UserAdjParam1_ECO.Assist_K_GAIN, Data, 10);
  419. memcpy((uint8_t*)&MC_ConfigParam2.UserAdjParam2_ECO.MaxCurrent_K_GAIN, Data + 10, 10);
  420. IsFlashSaveDataUpdate = TRUE;
  421. SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
  422. break;
  423. }
  424. default:break;
  425. }
  426. break;
  427. }
  428. //处理HMI发送的指令
  429. case ID_HMI_BC: case ID_HMI_TO_MC:
  430. {
  431. switch(Cmd)
  432. {
  433. //HMI广播的指令
  434. case 0x110C://HMI物理ID
  435. {
  436. memcpy(HMI_CheckInfo.MAC_ID, Data, DataLength);
  437. break;
  438. }
  439. case 0x120C://HMI存储的校验码
  440. {
  441. memcpy(HMI_CheckInfo.CheckCode, Data, DataLength);
  442. break;
  443. }
  444. case 0x1508://HMI运行信息
  445. {
  446. //HMI通信正常标志置位
  447. IsComOK_HMI.IsOK_Flag = TRUE;
  448. IsComOK_HMI.OK_TrigTime = HAL_GetTick();
  449. break;
  450. }
  451. //HMI发送MC的指令
  452. case 0x3000://查询电机版本信息
  453. {
  454. if( VersionIdentifyFinishedFlag == TRUE )
  455. {
  456. uint32_t MCU_ID_CRC32;
  457. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
  458. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
  459. MCU_ID_CRC32 = CRC32_Calculate(MC_CheckInfo.MAC_ID, 12);
  460. memcpy((uint8_t*)(MC_VerInfo.HW_Version + 12), (uint8_t*)(&MCU_ID_CRC32), 4);
  461. SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
  462. SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
  463. }
  464. break;
  465. }
  466. case 0x3100://查询电机配置参数
  467. {
  468. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
  469. memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, sizeof(MC_ConfigParam1_Struct_t));
  470. Data[0] = MC_ConfigParam1.WheelSize; //轮胎默认周长
  471. Data[1] = MC_ConfigParam1.StarModel; //启动模式
  472. Data[2] = MC_ConfigParam1.SpeedLimit; //限速值
  473. Data[3] = MC_ConfigParam1.WheelSizeAdj;//轮胎微调值
  474. SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7308, Data);
  475. break;
  476. }
  477. case 0x3208://设置电机配置参数
  478. {
  479. MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
  480. if(MC_ConfigParam1.WheelSizeAdj > 10)
  481. {
  482. MC_ConfigParam1.WheelSizeAdj = 10;
  483. }
  484. if(MC_ConfigParam1.WheelSizeAdj < -10)
  485. {
  486. MC_ConfigParam1.WheelSizeAdj = -10;
  487. }
  488. MC_ConfigParam1.StarModel = (MC_StarMode_Struct_t)Data[1];
  489. IsFlashSaveDataUpdate = TRUE;
  490. //变速器参数初始化
  491. GearBox_Init();
  492. SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7403, (uint8_t*)"ACK");
  493. break;
  494. }
  495. case 0x3305://HMI在线检测反馈
  496. {
  497. if(strncmp("READY", (char*)Data, DataLength) == 0)
  498. {
  499. DeviceOnLine_Status.Status_Bit.HMI_OffLine = 0;
  500. }
  501. break;
  502. }
  503. case 0x3400://查询电机骑行历史信息
  504. {
  505. SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
  506. break;
  507. }
  508. case 0x3505://清除TRIP信息
  509. {
  510. if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
  511. {
  512. MC_RideLog.TRIP_Km = 0;
  513. MC_RideLog.TRIP_Time = 0;
  514. if(strncmp("CLEAR_ODO", (char*)UserString1, 9) != 0)//利用UserString1作为是否允许清除ODO的标志
  515. {
  516. if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
  517. {
  518. MC_RideLog.ODO_Km = 0;
  519. MC_RideLog.ODO_Time = 0;
  520. }
  521. strncpy((char*)UserString1, (char*)"CLEAR_ODO", 9);
  522. IsFlashSaveDataUpdate = TRUE;
  523. }
  524. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  525. SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7403, (uint8_t*)"ACK");
  526. MC_RunInfo.Ride_Km = 0;
  527. MC_RunInfo.Ride_Time = 0;
  528. }
  529. }
  530. default:break;
  531. }
  532. break;
  533. }
  534. //处理CDL发送的指令
  535. case ID_CDL_BC: case ID_CDL_TO_MC:
  536. {
  537. switch(Cmd)
  538. {
  539. case 0x1000://查询校验密钥
  540. {
  541. GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
  542. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA408, Secret_Key);
  543. break;
  544. }
  545. case 0x1108://写入校验密钥
  546. {
  547. memcpy(Secret_Key, Data, DataLength);
  548. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_SECRET_KEY, sizeof(Secret_Key), Secret_Key);
  549. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  550. //写入密钥后时,重新对电机授权码计算和存储
  551. Ctf_CalAndSave();
  552. break;
  553. }
  554. case 0x1200://查询电机版本信息
  555. {
  556. if( VersionIdentifyFinishedFlag == TRUE )
  557. {
  558. uint32_t MCU_ID_CRC32;
  559. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
  560. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
  561. MCU_ID_CRC32 = CRC32_Calculate(MC_CheckInfo.MAC_ID, 12);
  562. memcpy((uint8_t*)(MC_VerInfo.HW_Version + 12), (uint8_t*)(&MCU_ID_CRC32), 4);
  563. SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
  564. SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
  565. }
  566. break;
  567. }
  568. case 0x1300://查询自定义字符串1
  569. {
  570. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO1, UserString1, 16);
  571. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA610, UserString1);
  572. break;
  573. }
  574. case 0x1410://写入自定义字符串1
  575. {
  576. memcpy(UserString1, Data, DataLength);
  577. IsFlashSaveDataUpdate = TRUE;
  578. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  579. break;
  580. }
  581. case 0x1500://查询自定义字符串2
  582. {
  583. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO2, UserString2, 16);
  584. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA710, UserString2);
  585. break;
  586. }
  587. case 0x1610://写入自定义字符串2
  588. {
  589. memcpy(UserString2, Data, DataLength);
  590. IsFlashSaveDataUpdate = TRUE;
  591. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  592. break;
  593. }
  594. case 0x1700://查询自定义字符串3
  595. {
  596. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_USER_INFO3, UserString3, 16);
  597. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA810, UserString3);
  598. break;
  599. }
  600. case 0x1810://写入自定义字符串3
  601. {
  602. memcpy(UserString3, Data, DataLength);
  603. IsFlashSaveDataUpdate = TRUE;
  604. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  605. break;
  606. }
  607. case 0x1901://写入电机工作模式
  608. {
  609. MC_WorkMode = (MC_WorkMode_Struct_t)*Data;
  610. MC_WorkMode_Back = (MC_WorkMode_Struct_t)~MC_WorkMode;
  611. //配置模式时,清除设备校验失败故障码
  612. if(MC_WorkMode != MC_WorkMode_Run)
  613. {
  614. MC_ErrorCode.ERROR_Bit.Fault_BMS_Check = 0;
  615. MC_ErrorCode.ERROR_Bit.Fault_PBU_Check = 0;
  616. MC_ErrorCode.ERROR_Bit.Fault_HMI_Check = 0;
  617. }
  618. break;
  619. }
  620. case 0x1A00://查询电机控制参数1
  621. {
  622. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM1, Data, sizeof(MC_ConfigParam1_Struct_t));
  623. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA020, Data);
  624. break;
  625. }
  626. case 0x1B20://写入电机控制参数1
  627. {
  628. memcpy((uint8_t*)&MC_ConfigParam1.GasCtrlMode_Param, Data, DataLength);
  629. MC_GasMode_Param.Mode = MC_ConfigParam1.GasCtrlMode_Param;
  630. IsFlashSaveDataUpdate = TRUE;
  631. //助力参数初始化
  632. UpdateGearParam(MC_ConfigParam1.SerialNum);
  633. //变速器参数初始化
  634. GearBox_Init();
  635. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  636. break;
  637. }
  638. case 0x1C00://查询马达参数
  639. {
  640. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MOTOR_PARAM, Data, sizeof(MC_MotorParam_Struct_t));
  641. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA110, Data);
  642. break;
  643. }
  644. case 0x1D10://写入马达参数
  645. {
  646. memcpy((uint8_t*)&MC_MotorParam.Rate_Power, Data, DataLength);
  647. IsFlashSaveDataUpdate = TRUE;
  648. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  649. break;
  650. }
  651. case 0x1E00://查询电机历史信息
  652. {
  653. //历史信息1
  654. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA230, (uint8_t*)&MC_RunLog1.PowerOnCnt); // 发送历史信息1
  655. //历史信息2
  656. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAC10, (uint8_t*)&MC_RunLog2.MCU_FaultCnt); // 发送历史信息2
  657. break;
  658. }
  659. case 0x1F00://查询电机生产信息
  660. {
  661. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MAC_INFO, (uint8_t*)MC_MacInfo.Manufacturer, 32);
  662. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA520, (uint8_t*)MC_MacInfo.Manufacturer);
  663. break;
  664. }
  665. case 0x2000://查询力矩传感器零偏数据
  666. {
  667. //...三力矩传感器,不用该命令
  668. break;
  669. }
  670. case 0x2100://查询设备在线结果
  671. {
  672. SendData(ID_MC_BC, MODE_REPORT, 0x1401, &DeviceOnLine_Status.Status);
  673. break;
  674. }
  675. case 0x2210://写入电机Mode
  676. {
  677. memcpy(MC_VerInfo.Mode, Data, DataLength);
  678. IsFlashSaveDataUpdate = TRUE;
  679. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  680. //写入型号时,完成电机授权码计算和存储
  681. Ctf_CalAndSave();
  682. break;
  683. }
  684. case 0x2310://写入电机SN
  685. {
  686. memcpy(MC_VerInfo.SN_Num, Data, DataLength);
  687. IsFlashSaveDataUpdate = TRUE;
  688. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  689. break;
  690. }
  691. case 0x2420://写入电机生产信息
  692. {
  693. memcpy(MC_MacInfo.Manufacturer, Data, DataLength);
  694. IsFlashSaveDataUpdate = TRUE;
  695. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  696. break;
  697. }
  698. case 0x2505://复位指令
  699. {
  700. if(strncmp("RESET", (char*)Data, DataLength) == 0)
  701. {
  702. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  703. PowerOff_Process(TRUE);
  704. HAL_Delay(100);
  705. __set_FAULTMASK(1);//关闭所有中断
  706. HAL_NVIC_SystemReset();
  707. }
  708. break;
  709. }
  710. case 0x2605://系统清除
  711. {
  712. if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
  713. {
  714. EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_FLAG + 4, 0xFF);//清除标志位
  715. EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, EEPROM_24C02_ADDR_RUN_LOG1 + 4, 0xFF);//清除开机次数
  716. EEPROM_Flash_Erase(EEPROM_FLASH_BEGIN_ADDRESS, EEPROM_FLASH_END_ADDRESS);
  717. EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN, LOG_ADDRESS_END);
  718. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  719. __set_FAULTMASK(1);//关闭所有中断
  720. HAL_NVIC_SystemReset();
  721. }
  722. break;
  723. }
  724. case 0x2708://参数还原
  725. {
  726. if(strncmp("RECOVERY", (char*)Data, DataLength) == 0)
  727. {
  728. Var_SetToDefaultParam();
  729. EEPROM_24C02_ParamReset(&I2C_Handle_EEPROM);
  730. CopyDataToEEPROM_Flash();
  731. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  732. __set_FAULTMASK(1);//关闭所有中断
  733. HAL_NVIC_SystemReset();
  734. }
  735. break;
  736. }
  737. case 0x2802://控制指令
  738. {
  739. memcpy(&MC_ControlCode.GearSt, Data, DataLength);
  740. Update_MC_ControlCode_Back();
  741. //PBU通信正常标志置位,避免上位機測試時認爲PBU失聯而關閉助力
  742. IsComOK_PBU.IsOK_Flag = TRUE;
  743. IsComOK_PBU.OK_TrigTime = HAL_GetTick();
  744. //運行信息助力档位更新
  745. MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
  746. MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
  747. SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
  748. break;
  749. }
  750. case 0x2900://查询力矩传感器校正信息
  751. {
  752. //...三力矩传感器,不用该命令
  753. break;
  754. }
  755. case 0x2A01://写入力矩传感器标定系数
  756. {
  757. //...三力矩传感器,不用该命令
  758. break;
  759. }
  760. case 0x2B02://写入力矩传感器启动值
  761. {
  762. memcpy((uint8_t*)&TorqueSensorStartData, Data, DataLength);
  763. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), (uint8_t*)&TorqueSensorStartData);
  764. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  765. break;
  766. }
  767. case 0x2C01://设置推行模式最高转速百分比
  768. {
  769. MC_WalkMode_Persent = Data[0];
  770. break;
  771. }
  772. case 0x2D08://读取RAM或FLASH存储器指定地址数据
  773. {
  774. do
  775. {
  776. uint32_t DataLength;
  777. 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;
  778. memcpy((uint8_t*)(Data + 8), (uint8_t*)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])), DataLength);
  779. SendData(ID_MC_TO_CDL, MODE_REPORT, (0xAB08 + DataLength), (uint8_t*)Data);
  780. }while(0);
  781. break;
  782. }
  783. case 0x2DF0://指定RAM或FLASH存储器写入数据,前面8个字节是起始地址,长度 = 结束地址 - 起始地址 + 1,有效数据长度为232Bytes
  784. {
  785. do
  786. {
  787. uint32_t AddrBegin, AddrEnd;
  788. uint32_t DataLength;
  789. //取起止地址
  790. AddrBegin = (uint32_t)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3]));
  791. AddrEnd = (uint32_t)((Data[4] << 24) + (Data[5] << 16) + (Data[6] << 8) + (Data[7]));
  792. //计算有效数据长度
  793. DataLength = AddrEnd - AddrBegin + 1;
  794. //RAM数据
  795. if(AddrBegin > 0x20000000)
  796. {
  797. memcpy((uint8_t*)(AddrBegin), (uint8_t*)(Data + 8), DataLength);
  798. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  799. }
  800. //FLASH数据,该功能慎用,FLASH只能按页擦除,地址需要谨慎计算,首地址必须为页首
  801. else if(AddrBegin > 0x08003000)
  802. {
  803. EEPROM_Flash_Erase(AddrBegin, AddrBegin + 0x3FF);//擦除首地址对应的页
  804. SaveDataToEEPROM_Flash(AddrBegin, Data + 8, DataLength);
  805. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  806. }
  807. }while(0);
  808. }
  809. case 0x2E00://查询骑行历史信息
  810. {
  811. SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);
  812. break;
  813. }
  814. case 0x2F00://读取姿态传感器数值
  815. {
  816. SendData(ID_MC_BC, MODE_REPORT, 0x1608, (uint8_t*)&MC_AttitudeAngle.Angle_Pitch_Absolute);
  817. break;
  818. }
  819. case 0x3000://查询电机控制参数2
  820. {
  821. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_CONFIG_PARAM2, Data, sizeof(MC_ConfigParam2_Struct_t));
  822. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAD20, Data);
  823. break;
  824. }
  825. case 0x3120://写入电机控制参数2
  826. {
  827. memcpy((uint8_t*)&MC_ConfigParam2.ZeroAngle_Pitch, Data, DataLength);
  828. IsFlashSaveDataUpdate = TRUE;
  829. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  830. break;
  831. }
  832. case 0x3201://查询力矩传感器零点值
  833. {
  834. //Data[0]表示需要读取的传感器序号,相邻两个地址偏差为29
  835. GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET_1 + (29 * (Data[0] - 1)), sizeof(TorqueOffSetData_Struct_t), Data + 1);
  836. switch(Data[0])
  837. {
  838. case 1:
  839. {
  840. memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_1_Param.Torque_OffSetData.PresentData, 2);
  841. break;
  842. }
  843. case 2:
  844. {
  845. memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_2_Param.Torque_OffSetData.PresentData, 2);
  846. break;
  847. }
  848. case 3:
  849. {
  850. memcpy((uint8_t*)(Data + 23), (uint16_t*)&TorqueSensor_3_Param.Torque_OffSetData.PresentData, 2);
  851. break;
  852. }
  853. }
  854. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAE1A, Data);
  855. break;
  856. }
  857. case 0x3301://查询力矩传感器标定系数
  858. {
  859. //Data[0]表示需要读取的传感器序号,相邻两个地址偏差为29
  860. GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_1_CAL_K + (29 * (Data[0] - 1)), sizeof(uint8_t), Data + 1);
  861. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAF02, Data);
  862. break;
  863. }
  864. case 0x3402://写入力矩传感器标定系数
  865. {
  866. //Data[0]表示需要读取的传感器序号
  867. if(Data[0] == 1)
  868. {
  869. TorqueSensor_1_Param.Torque_Cal_K = Data[1];
  870. 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);
  871. }
  872. else if(Data[0] == 2)
  873. {
  874. TorqueSensor_2_Param.Torque_Cal_K = Data[1];
  875. 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);
  876. }
  877. else if(Data[0] == 3)
  878. {
  879. TorqueSensor_3_Param.Torque_Cal_K = Data[1];
  880. 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);
  881. }
  882. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  883. break;
  884. }
  885. case 0x3500://查询启动值
  886. {
  887. GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_STARDATA, sizeof(TorqueSensorStartData), Data);
  888. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xB002, Data);
  889. break;
  890. }
  891. case 0x3909://清除历史信息
  892. {
  893. if(strncmp("LOG CLEAR", (char*)Data, DataLength) == 0)
  894. {
  895. Var_SetToDefaultLog();
  896. EEPROM_24C02_LogReset(&I2C_Handle_EEPROM);
  897. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  898. }
  899. break;
  900. }
  901. case 0x3ACC://电池放电曲线
  902. {
  903. memcpy((uint8_t*)&BatteryCellInfo.DesignCap, Data, DataLength);
  904. IsFlashSaveDataUpdate = TRUE;
  905. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  906. break;
  907. }
  908. case 0x3B10://写入ODO和TRIP信息
  909. {
  910. memcpy((uint8_t*)&MC_RideLog.ODO_Km, Data, DataLength);
  911. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
  912. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  913. break;
  914. }
  915. case 0x3C00://查询电机标签信息
  916. {
  917. ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_TAG_INFO, MC_TagInfo, 32);
  918. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBB20, MC_TagInfo);
  919. break;
  920. }
  921. case 0x3D20://写入电机标签信息
  922. {
  923. memcpy(MC_TagInfo, Data, DataLength);
  924. IsFlashSaveDataUpdate = TRUE;
  925. SendData(ID_MC_BC, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
  926. break;
  927. }
  928. default:break;
  929. }
  930. break;
  931. }
  932. case ID_CDL_TO_MC_TE://0X651
  933. {
  934. switch(Cmd)
  935. {
  936. case 0x2505: case 0xA10B: //TE复位指令和TE升级指令,让主控进入TE升级状态
  937. IsSendDataToTE_Step = SENDUPDATA;
  938. break;
  939. default:
  940. break;
  941. }
  942. SendUartDataToTE(&UART_TxBuff_Struct3,ID_CDL_TO_MC_TE,Mode,Cmd, Data);//直接透传所有的0X651指令
  943. break;
  944. }
  945. default:break;
  946. }
  947. }
  948. /*********************End*******************/
  949. /************全局函数定义*******************/
  950. //CAN数据解析,严格按照协议格式
  951. uint8_t CAN_RevData[255], CAN_RevData_CRC_Buf[255];
  952. void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
  953. {
  954. uint8_t Mode, CmdLength, DataLength;
  955. uint16_t Cmd, i;
  956. uint32_t CrcResult, CrcData;
  957. uint8_t FrameBegin1, FrameBegin2;
  958. if(ptCANRx->ucBufCnt >= 11)
  959. {
  960. //读取帧头
  961. FrameBegin1 = cd_ReadChar(ptCANRx, 0);
  962. CAN_RevData_CRC_Buf[0] = FrameBegin1;
  963. FrameBegin2 = cd_ReadChar(ptCANRx, 1);
  964. CAN_RevData_CRC_Buf[1] = FrameBegin2;
  965. if((FrameBegin1 == FRAME_BEGIN1) && (FrameBegin2 == FRAME_BEGIN2))
  966. {
  967. CAN_RevData_CRC_Buf[2] = (uint8_t)((ptCANRx->ucBufID >> 8) & 0xFF);
  968. CAN_RevData_CRC_Buf[3] = (uint8_t)(ptCANRx->ucBufID & 0xFF);
  969. //读取帧模式
  970. Mode = cd_ReadChar(ptCANRx, 2);
  971. CAN_RevData_CRC_Buf[4] = Mode;
  972. if((Mode == MODE_READ) || (Mode == MODE_WRITE) || (Mode == MODE_REPORT))
  973. {
  974. //读取命令段长度和命令字
  975. CmdLength = cd_ReadChar(ptCANRx, 3);
  976. CAN_RevData_CRC_Buf[5] = CmdLength;
  977. Cmd = (cd_ReadChar(ptCANRx, 4) << 8) + cd_ReadChar(ptCANRx, 5);
  978. CAN_RevData_CRC_Buf[6] = (uint8_t)((Cmd >> 8) & 0xFF);
  979. CAN_RevData_CRC_Buf[7] = (uint8_t)(Cmd & 0xFF);
  980. DataLength = cd_ReadChar(ptCANRx, 5);
  981. if((CmdLength - DataLength) == 2)
  982. {
  983. if(ptCANRx->ucBufCnt < (CmdLength + 9))//帧头2bytes + 模式1byte + 命令段长度1byte + 校验位4bytes + 帧尾1byte
  984. {
  985. if(ptCANRx->IsWaitRX_Flag == FALSE)
  986. {
  987. ptCANRx->DelayTimeCnt = HAL_GetTick();
  988. ptCANRx->IsWaitRX_Flag = TRUE;
  989. }
  990. if((HAL_GetTick() - ptCANRx->DelayTimeCnt) > TimeOutCnt)//超时,单位ms
  991. {
  992. cd_DelChar(ptCANRx, ptCANRx->ucBufCnt);
  993. ptCANRx->IsWaitRX_Flag = FALSE;
  994. }
  995. return;
  996. }
  997. else
  998. {
  999. ptCANRx->IsWaitRX_Flag = FALSE;
  1000. //接收到完整正确数据包
  1001. for(i=0; i<DataLength; i++)//读取数据段
  1002. {
  1003. CAN_RevData[i] = cd_ReadChar(ptCANRx, 6 + i);
  1004. CAN_RevData_CRC_Buf[8 + i] = CAN_RevData[i];
  1005. }
  1006. CrcData = (cd_ReadChar(ptCANRx, 6 + DataLength) << 24) + \
  1007. (cd_ReadChar(ptCANRx, 7 + DataLength) << 16) + \
  1008. (cd_ReadChar(ptCANRx, 8 + DataLength) << 8) + \
  1009. cd_ReadChar(ptCANRx, 9 + DataLength);
  1010. CrcResult = CRC32_Calculate(CAN_RevData_CRC_Buf, 8 + DataLength);
  1011. if((CrcData - CrcResult) == 0) // 比较校验
  1012. {
  1013. //数据处理
  1014. DataProcess(ptCANRx->ucBufID, Mode, Cmd, CAN_RevData);//Mode为帧模式,Cmd为命令字,Data为数据段
  1015. cd_DelChar(ptCANRx, CmdLength + 9);
  1016. return;
  1017. }
  1018. cd_DelChar(ptCANRx, 1);
  1019. }
  1020. }
  1021. else
  1022. {
  1023. cd_DelChar(ptCANRx, 1);
  1024. }
  1025. }
  1026. else
  1027. {
  1028. cd_DelChar(ptCANRx, 1);
  1029. }
  1030. }
  1031. else
  1032. {
  1033. cd_DelChar(ptCANRx, 1);
  1034. }
  1035. }
  1036. }
  1037. uint8_t CanSendData[255], CanSendData_CRC_Buf[255];
  1038. void SendData(uint16_t ID, uint8_t Mode, uint16_t Command, uint8_t* Data)
  1039. {
  1040. uint32_t CRC_Result = 0x00000000;
  1041. uint8_t DataLength;
  1042. DataLength = (uint8_t)(Command & 0xFF);
  1043. CanSendData[0] = FRAME_BEGIN1;
  1044. CanSendData[1] = FRAME_BEGIN2;
  1045. CanSendData[2] = Mode;
  1046. CanSendData[3] = DataLength + 2;
  1047. CanSendData[4] = (uint8_t)((Command >> 8) & 0xFF);
  1048. CanSendData[5] = DataLength;
  1049. memcpy(CanSendData + 6, Data, DataLength);
  1050. CanSendData_CRC_Buf[0] = FRAME_BEGIN1;
  1051. CanSendData_CRC_Buf[1] = FRAME_BEGIN2;
  1052. CanSendData_CRC_Buf[2] = (uint8_t)(ID >> 8);
  1053. CanSendData_CRC_Buf[3] = (uint8_t)(ID & 0xFF);
  1054. memcpy(CanSendData_CRC_Buf + 4, CanSendData + 2, DataLength + 4);
  1055. CRC_Result = CRC32_Calculate(CanSendData_CRC_Buf, DataLength + 8);//帧头 2bytes + ID 2bytes + 模式 1byte + 命令段长度 1byte + 命令字 2bytes
  1056. CanSendData[6 + DataLength] = (uint8_t)((CRC_Result >> 24) & 0xFF);
  1057. CanSendData[7 + DataLength] = (uint8_t)((CRC_Result >> 16) & 0xFF);
  1058. CanSendData[8 + DataLength] = (uint8_t)((CRC_Result >> 8) & 0xFF);
  1059. CanSendData[9 + DataLength] = (uint8_t)(CRC_Result & 0xFF);
  1060. CanSendData[10 + DataLength] = FRAME_END;
  1061. CAN_SendData(ID, CanSendData, DataLength + 11);
  1062. }
  1063. /********************End********************/