UartTask.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962
  1. /****************************************************************************
  2. *
  3. * Copy right: Qx.
  4. * File name: UartTask.c
  5. * Description: 串口任务
  6. * History: 2021-03-05
  7. *
  8. * 2021-04-11:可以通过Ota线路升级Bms保护板
  9. ****************************************************************************/
  10. #include "bsp.h"
  11. #include "bsp_custom.h"
  12. #include "osasys.h"
  13. #include "ostask.h"
  14. #include "queue.h"
  15. #include "ps_event_callback.h"
  16. #include "cmisim.h"
  17. #include "cmimm.h"
  18. #include "cmips.h"
  19. #include "sockets.h"
  20. #include "psifevent.h"
  21. #include "ps_lib_api.h"
  22. #include "lwip/netdb.h"
  23. //#include <cis_def.h>
  24. #include "debug_log.h"
  25. #include "slpman_ec616.h"
  26. #include "plat_config.h"
  27. #include "ec_tcpip_api.h"
  28. #include "hal_module_adapter.h"
  29. #include "UartTask.h"
  30. #include "MainTask.h"
  31. #include <stdlib.h>
  32. #include "app.h"
  33. #include "numeric.h"
  34. #include "Fota.h"
  35. #include "signal.h"
  36. //全局变量输入区
  37. extern UINT32 Timer_count;
  38. extern volatile BOOL Sleep_flag;
  39. extern AppNVMDataType AppNVMData;
  40. extern AppDataBody AppDataInfo;
  41. //全局变量输出区
  42. BOOL UartBattInfoRecvFlag = false;
  43. QueueHandle_t UartWriteCmdHandle = NULL;
  44. UINT8 BattChrgEndFlag;
  45. //
  46. extern ARM_DRIVER_USART Driver_USART1;
  47. static ARM_DRIVER_USART *USARTdrv = &Driver_USART1;
  48. volatile bool isRecvTimeout = false;
  49. volatile bool isRecvComplete = false;
  50. //线程声明区
  51. static StaticTask_t gProcess_Uart_Task_t;
  52. static UINT8 gProcess_Uart_TaskStack[PROC_UART_TASK_STACK_SIZE];
  53. static osThreadId_t UartTaskId = NULL;
  54. static process_Uart gProcess_Uart_Task = PROCESS_UART_STATE_IDLE;
  55. #define PROC_UART_STATE_SWITCH(a) (gProcess_Uart_Task = a)
  56. //函数声明区
  57. void USART_callback(uint32_t event);
  58. UINT8 Uart_DataRecv_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer);
  59. static BOOL uartBattInfoDecode(UINT8* dataPtr);
  60. UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData);
  61. UINT16 crc_chk(UINT8* data, UINT8 length);
  62. void battSOCDisplay(void);
  63. void battErrorStateDisplay(void);
  64. void battWarningStateDisplay(void);
  65. void battLockStateDisplay(UINT8 lockState);
  66. void relayPWMControl(void);
  67. void SP_BMS_Update_Service(void);
  68. BOOL BattHeaterSwitch(UINT8* heaterSwitch);
  69. UINT16 encryptionAlgorithm (UINT16 plainText);
  70. UINT8 decryptionAlgorithm (UINT16 cipherText);
  71. UINT8 Uart_Encrypt_Send(void);
  72. //BMS升级函数声明
  73. UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len);
  74. void SP_BMS_Update_Service();
  75. UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);
  76. //Uart线程任务区
  77. static void UartTask(void* arg)
  78. {
  79. USARTdrv->Initialize(USART_callback);
  80. USARTdrv->PowerControl(ARM_POWER_FULL);
  81. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  82. ARM_USART_DATA_BITS_8 |
  83. ARM_USART_PARITY_NONE |
  84. ARM_USART_STOP_BITS_1 |
  85. ARM_USART_FLOW_CONTROL_NONE, 9600);
  86. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
  87. UINT16 Reg_Num = 0;
  88. UINT16 Uart_Uds_LEN;
  89. UINT16 Uart_Recv_LEN;
  90. UINT32 currentTimerCount=0;
  91. BOOL uartReadSuccessFlag = false;
  92. Uart_Read_Msg_Type Uart_Read_Msg;
  93. Uart_Write_Data_Type UartWriteData; //Uart控制命令
  94. UartReadMsgType UartReadMsg;
  95. memset(&(UartReadMsg.UartFlag),0x00,sizeof(UartReadMsgType));
  96. if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
  97. {
  98. UartWriteCmdHandle = osMessageQueueNew(3,sizeof(Uart_Write_Data_Type), NULL);
  99. }
  100. //上电起始控制区域
  101. while (1)
  102. {
  103. switch (gProcess_Uart_Task)
  104. {
  105. case PROCESS_UART_STATE_ENCRYPT:
  106. {
  107. UINT8 EncryptFlag=0x00;
  108. UINT8 EncryptCount=0;
  109. while(EncryptFlag!=0x01&&EncryptCount<=3)
  110. {
  111. EncryptFlag = Uart_Encrypt_Send();
  112. EncryptCount++;
  113. }
  114. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  115. break;
  116. }
  117. case PROCESS_UART_STATE_IDLE:
  118. {
  119. osDelay(100);
  120. if(Sleep_flag)
  121. {
  122. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
  123. }
  124. else if(Timer_count%10==0)
  125. {
  126. #ifdef USING_PRINTF
  127. printf("[%d]Uart Timer 5s:%d,Header:%x\n",__LINE__,Timer_count,UartReadMsg.Header[2]);
  128. #endif
  129. if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK)
  130. {
  131. #ifdef USING_PRINTF
  132. printf("[%d]UartWriteCmdHandle :%x\n",__LINE__,UartWriteData.WriteCmd);
  133. #endif
  134. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WRITE);
  135. }
  136. else
  137. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
  138. }
  139. if(UartReadMsg.Header[2]>0)
  140. {
  141. uartReadSuccessFlag = true;
  142. }
  143. else
  144. {
  145. uartReadSuccessFlag = false;
  146. }
  147. if(Timer_count-currentTimerCount >= 1)
  148. {
  149. if(AppNVMData.isBattLocked != 0)
  150. {
  151. battLockStateDisplay(TRUE);
  152. }
  153. if(uartReadSuccessFlag)
  154. {
  155. battSOCDisplay();
  156. battErrorStateDisplay();
  157. }
  158. // else
  159. // {
  160. // #ifdef USING_PRINTF
  161. // printf("battWarningStateDisplay\n");
  162. // #endif
  163. // battWarningStateDisplay();
  164. // }
  165. }
  166. currentTimerCount = Timer_count;
  167. if(BMS_Fota_update_flag)
  168. {
  169. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_UPDATE);
  170. }
  171. if(AppNVMData.isBattLocked==TRUE && ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1])>>1)&0x03!=0x00)
  172. {
  173. UartWriteData.WriteCmd = 0x01;
  174. UartWriteData.Data[0] = 0x00;
  175. UartWriteData.Data[1] = 0x00;
  176. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,1000);
  177. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
  178. }
  179. else if (AppNVMData.isBattLocked==FALSE && ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1])>>1)&0x03==0x00)
  180. {
  181. UartWriteData.WriteCmd = 0x01;
  182. UartWriteData.Data[0] = 0x00;
  183. UartWriteData.Data[1] = 0x03;
  184. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,1000);
  185. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
  186. }
  187. break;
  188. }
  189. case PROCESS_UART_STATE_READ:
  190. {
  191. Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + 2;//按照协议里面的0x21+X+N的结束地址
  192. Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
  193. Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
  194. Uart_Read_Msg.Reg_Begin_H = 0x00;
  195. Uart_Read_Msg.Reg_Begin_L= 0x00;
  196. Uart_Read_Msg.Reg_Num_H = Reg_Num>>8;
  197. Uart_Read_Msg.Reg_Num_L = Reg_Num;
  198. Uart_Uds_LEN = Reg_Num*2;
  199. memset(UartReadMsg.Header,0x00,Uart_Uds_LEN);
  200. Uart_Recv_LEN = Uart_DataRecv_func((UINT8 *)&Uart_Read_Msg,UartReadMsg.Header);
  201. //osMutexRelease(UartMutex);
  202. if(Uart_Recv_LEN>0)
  203. {
  204. UartBattInfoRecvFlag = TRUE;
  205. uartBattInfoDecode(UartReadMsg.data);
  206. }
  207. else
  208. {
  209. UartBattInfoRecvFlag = FALSE;
  210. }
  211. UartReadMsg.len = Uart_Recv_LEN;
  212. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  213. if( battWorkState ==0x02)
  214. {
  215. BattChrgEndFlag=TRUE;
  216. }
  217. else
  218. {
  219. BattChrgEndFlag=FALSE;
  220. }
  221. #ifdef USING_PRINTF1
  222. printf("\nUart_Recv_buffer: ");
  223. for(int i=0;i<Uart_Recv_LEN;i++)
  224. {
  225. printf("%x ",*((UINT8 *)&UartReadMsg.Header+i));
  226. }
  227. printf("\n");
  228. #endif
  229. break;
  230. }
  231. case PROCESS_UART_STATE_WRITE:
  232. {
  233. Uart_WriteCmd_func(UartWriteData);
  234. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  235. break;
  236. }
  237. case PROCESS_UART_STATE_UPDATE:
  238. SP_BMS_Update_Service();
  239. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  240. BMS_Fota_update_flag = FALSE;
  241. break;
  242. case PROCESS_UART_STATE_SLEEP:
  243. {
  244. USARTdrv->PowerControl(ARM_POWER_LOW);
  245. while(TRUE)
  246. {
  247. osDelay(60000/portTICK_PERIOD_MS);
  248. }
  249. osThreadExit();
  250. break;
  251. }
  252. }
  253. }
  254. }
  255. //Uart 接收的数据解码
  256. static BOOL uartBattInfoDecode(UINT8* dataPtr)
  257. {
  258. //BattInfoType battInfo;
  259. UINT8 i,temp=0;
  260. UINT8 TEMP_NUM = BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;
  261. UINT16 Batt_current;
  262. for(i=0;i<BATT_CELL_VOL_NUM;i++)
  263. {
  264. battCellU[i] = (dataPtr[(0x02+i)*2] << 8) | dataPtr[(0x02+i)*2 + 1];
  265. }
  266. battWorkState = (dataPtr[(0x03+BATT_CELL_VOL_NUM)*2+1])&0x03;//电池状态(原始数据),0表示静置,1表示放电,2表示充电
  267. for(i=0; i<BATT_TEMP_NUM; i++)
  268. {
  269. battCellTemp[i] = dataPtr[(0x06+BATT_CELL_VOL_NUM+i)*2+1];
  270. }
  271. MOSTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM)*2+1];
  272. packTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+1)*2+1];
  273. Batt_current = (dataPtr[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(dataPtr[(0x02+BATT_CELL_VOL_NUM)*2+1]);
  274. #ifdef USING_PRINTF
  275. printf("Batt_current = %x\n",Batt_current);
  276. #endif
  277. //原始数据:充电为负,放电为正
  278. if(battWorkState==0x02&&Batt_current>0x8000)
  279. {
  280. AppDataInfo.BattCurrentNegFlag = 1;
  281. }
  282. if(battWorkState==0x02&&Batt_current<0x8000)
  283. {
  284. AppDataInfo.BattCurrentNegFlag = -1;
  285. }
  286. if (Batt_current>0x8000) //为负,充电数据
  287. {
  288. Batt_current = (UINT16)((UINT16)(~(Batt_current))+1);
  289. Batt_current = Batt_current/10;
  290. Batt_current = -Batt_current*AppDataInfo.BattCurrentNegFlag + 0x2710;//平台数据:充电为负
  291. //Batt_current = Batt_current;
  292. }
  293. else //为正,数据
  294. {
  295. Batt_current = Batt_current/10;
  296. Batt_current = Batt_current*AppDataInfo.BattCurrentNegFlag + 0x2710;//平台数据:充电为负
  297. //Batt_current = Batt_current;
  298. }
  299. battI = Batt_current;
  300. #ifdef USING_PRINTF
  301. printf("battI = %x\n",battI);
  302. #endif
  303. //bit0 ~ bit31 represent cell0 ~ cell31
  304. battBalanceoInfo = dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1] | (dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<8) + (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]<<16) | (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<24);
  305. bmsHwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
  306. bmsSwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2];
  307. temp = ((dataPtr[(0x09+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1])>>1)&0x03;
  308. battMOSSwitchState = ((temp&0x01)<<1)|((temp&0x02)>>1);
  309. if(AppNVMData.isBattLocked==TRUE)
  310. {
  311. battMOSSwitchState = battMOSSwitchState |(0x01<<2);
  312. }
  313. else
  314. {
  315. battMOSSwitchState = battMOSSwitchState |(0x00<<2);
  316. }
  317. battWarningState = (dataPtr[(0x09+BATT_CELL_VOL_NUM+TEMP_NUM)*2+0]<<16) | (dataPtr[(0x0A+BATT_CELL_VOL_NUM+TEMP_NUM)*2+0] << 8) |(dataPtr[(0x0A+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]);
  318. battSOC = dataPtr[(0x0B+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
  319. battSOH = dataPtr[(0x0C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
  320. battPackVol =((dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2])<<8|(dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]))/10; //uint 100mV
  321. maxCellVol = (dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
  322. minCellVol = (dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
  323. battHeatEnableState = dataPtr[(0x1C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]&0x01;
  324. maxCellTemp = 0x00;
  325. minCellTemp = 0xFF;
  326. for(i=0;i<BATT_TEMP_NUM;i++)
  327. {
  328. maxCellTemp = max(maxCellTemp,battCellTemp[i]);
  329. minCellTemp = min(minCellTemp,battCellTemp[i]);
  330. }
  331. nbSwVersion = APPSWVERSION;
  332. nbHwVersion = HWVERSION;
  333. return true;
  334. }
  335. //Uart线程初始化
  336. void UartTaskInit(void *arg)
  337. {
  338. osThreadAttr_t task_attr;
  339. memset(&task_attr,0,sizeof(task_attr));
  340. memset(gProcess_Uart_TaskStack, 0xA5, PROC_UART_TASK_STACK_SIZE);
  341. task_attr.name = "Uart_Task";
  342. task_attr.stack_mem = gProcess_Uart_TaskStack;
  343. task_attr.stack_size = PROC_UART_TASK_STACK_SIZE;
  344. task_attr.priority = osPriorityBelowNormal7;
  345. task_attr.cb_mem = &gProcess_Uart_Task_t;
  346. task_attr.cb_size = sizeof(StaticTask_t);
  347. UartTaskId = osThreadNew(UartTask, NULL, &task_attr);
  348. }
  349. void UartTaskDeInit(void *arg)
  350. {
  351. osThreadTerminate(UartTaskId);
  352. UartTaskId = NULL;
  353. }
  354. //函数区
  355. //Uart回调程序
  356. void USART_callback(uint32_t event)
  357. {
  358. if(event & ARM_USART_EVENT_RX_TIMEOUT)
  359. {
  360. isRecvTimeout = true;
  361. }
  362. if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
  363. {
  364. isRecvComplete = true;
  365. }
  366. }
  367. //Uart校验程序
  368. UINT16 crc_chk(UINT8* data, UINT8 length)
  369. {
  370. UINT8 j;
  371. UINT16 reg_crc=0xFFFF;
  372. while(length--)
  373. {
  374. reg_crc ^= *data++;
  375. for(j=0;j<8;j++)
  376. {
  377. if(reg_crc & 0x01)
  378. {
  379. reg_crc=(reg_crc>>1) ^ 0xA001;
  380. }
  381. else
  382. {
  383. reg_crc=reg_crc >>1;
  384. }
  385. }
  386. }
  387. return reg_crc;
  388. }
  389. //Uart写命令函数
  390. UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
  391. {
  392. Uart_Write_Msg_Type Uart_Write_Msg;
  393. UINT16 RegAddress = 0x0000;
  394. UINT16 CRC_chk_buffer;
  395. UINT8 timeout = 0x00;
  396. UINT8 Uart_Recv_Buffer[8];
  397. switch (UartWriteData.WriteCmd)
  398. {
  399. case 0x01:
  400. {
  401. RegAddress = 0x1B + BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM;
  402. Uart_Write_Msg.Bms_Address = BMS_ADDRESS_CODE;
  403. Uart_Write_Msg.Bms_Funcode = UART_WRITE_CODE;
  404. Uart_Write_Msg.Reg_Begin_H = RegAddress>>8;
  405. Uart_Write_Msg.Reg_Begin_L = RegAddress;
  406. Uart_Write_Msg.Reg_Num_H = 0x00;
  407. Uart_Write_Msg.Reg_Num_L = 0x01;
  408. Uart_Write_Msg.Data_Count = 0x02;//要写入的字节数
  409. memcpy(Uart_Write_Msg.Data,UartWriteData.Data,2);
  410. CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
  411. Uart_Write_Msg.CRC_L = CRC_chk_buffer;
  412. Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
  413. break;
  414. }
  415. default:
  416. {
  417. UartWriteData.WriteCmd = 0x00;
  418. return 0;
  419. break;
  420. }
  421. }
  422. USARTdrv->Send((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg));
  423. #ifdef USING_PRINTF
  424. printf("Uart_Send_buffer: ");
  425. for(int i=0;i<sizeof(Uart_Write_Msg);i++)
  426. {
  427. printf("%x ",*((UINT8 *)&Uart_Write_Msg+i));
  428. }
  429. printf("\n");
  430. #endif
  431. USARTdrv->Receive(Uart_Recv_Buffer,8);
  432. while((isRecvTimeout == false) && (isRecvComplete == false))
  433. {
  434. timeout++;
  435. osDelay(100);
  436. if (timeout>=10)
  437. {
  438. timeout =0;
  439. isRecvTimeout = true;
  440. break;
  441. }
  442. }
  443. if (isRecvComplete == true)
  444. {
  445. #ifdef USING_PRINTF
  446. printf("Uart_Rece_buffer: ");
  447. for(int i=0;i<8;i++)
  448. {
  449. printf("%x ",Uart_Recv_Buffer[i]);
  450. }
  451. printf("\n");
  452. #endif
  453. isRecvComplete = false;
  454. if(Uart_Recv_Buffer[1]==0x10)
  455. {
  456. return UartWriteData.WriteCmd;
  457. }
  458. else
  459. {
  460. return 0x00;
  461. }
  462. }
  463. else
  464. {
  465. isRecvTimeout = false;
  466. return 0x00;
  467. }
  468. }
  469. //Uart发送接收函数
  470. UINT8 Uart_DataRecv_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer)
  471. {
  472. UINT16 CRC_Rece_buffer;
  473. UINT16 CRC_chk_buffer;
  474. UINT16 Data_Len ;
  475. UINT8 timeout = 0x00;
  476. Data_Len = (*(Uart_Read_Msg+4)|*(Uart_Read_Msg+5))*2+5;
  477. CRC_chk_buffer = crc_chk(Uart_Read_Msg,6);
  478. *(Uart_Read_Msg+6) = CRC_chk_buffer;
  479. *(Uart_Read_Msg+7) = CRC_chk_buffer>>8;
  480. USARTdrv->Send(Uart_Read_Msg,8);
  481. #ifdef USING_PRINTF
  482. printf("Uart_Send_buffer: ");
  483. for(int i=0;i<8;i++)
  484. {
  485. printf("%x ",*(Uart_Read_Msg+i));
  486. }
  487. printf("\n");
  488. #endif
  489. USARTdrv->Receive(Uart_Recv_Buffer,Data_Len);
  490. while(true)
  491. {
  492. timeout++;
  493. if((isRecvTimeout == true) || (isRecvComplete == true))
  494. {
  495. break;
  496. }
  497. else
  498. {
  499. osDelay(100);
  500. if (timeout>=50)
  501. {
  502. timeout =0;
  503. isRecvTimeout = true;
  504. }
  505. }
  506. }
  507. #ifdef USING_PRINTF1
  508. printf("Uart_Rece_buffer1: ");
  509. for(int i=0;i<Data_Len;i++)
  510. {
  511. printf("%x ",*(Uart_Recv_Buffer+i));
  512. }
  513. #endif
  514. if (isRecvComplete == true)
  515. {
  516. isRecvComplete = false;
  517. CRC_Rece_buffer =*(Uart_Recv_Buffer+Data_Len-1)<<8|*(Uart_Recv_Buffer+Data_Len-2);
  518. CRC_chk_buffer = crc_chk(Uart_Recv_Buffer,Data_Len-2);
  519. #ifdef USING_PRINTF1
  520. printf("Uart_Rece_buffer after Crc: ");
  521. for(int i=0;i<Data_Len;i++)
  522. {
  523. printf("%x ",*(Uart_Recv_Buffer+i));
  524. }
  525. printf("\tcrcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
  526. #endif
  527. if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
  528. {
  529. return Data_Len;//此处指针移位出现重启问题
  530. }
  531. else //接收数据的校验不过
  532. {
  533. USARTdrv->Uninitialize();
  534. osDelay(1000);
  535. USARTdrv->Initialize(USART_callback);
  536. USARTdrv->PowerControl(ARM_POWER_FULL);
  537. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  538. ARM_USART_DATA_BITS_8 |
  539. ARM_USART_PARITY_NONE |
  540. ARM_USART_STOP_BITS_1 |
  541. ARM_USART_FLOW_CONTROL_NONE, 9600);
  542. memset(Uart_Recv_Buffer,0xff,Data_Len);
  543. return 0;
  544. }
  545. }
  546. else
  547. {
  548. memset(Uart_Recv_Buffer,0x00,Data_Len);
  549. isRecvTimeout = false;
  550. return 0;
  551. }
  552. }
  553. /**
  554. \fn BOOL BattHeaterSwitch(UINT8* heaterSwitch)
  555. \param[in] (UINT8*) heaterSwitch: the heater switch state
  556. \brief according to the current switch state and all the cell temp, it will turn on/off the switch
  557. \return (BOOL) isNeedtoSwitch: true: need to send cmd to turn on/off the switch
  558. false: do not need to do anything
  559. */
  560. BOOL BattHeaterSwitch(UINT8* heaterSwitch)
  561. {
  562. BOOL isNeedtoSwitch = FALSE;
  563. UINT8 i =0;
  564. UINT8 currentSwitchState = 0;
  565. //get the current switch state and the cell temp
  566. currentSwitchState = battMOSSwitchState & 0x01;
  567. if(currentSwitchState==0) //当前状态为关闭,判断是否应该开启
  568. {
  569. if(minCellTemp<=5+40 && maxCellTemp<25+40 && battSOC>=12)//温度偏移为40
  570. {
  571. *heaterSwitch = 1;
  572. isNeedtoSwitch = true;
  573. }
  574. }
  575. else //当前状态为开启,判断是否应该关闭
  576. {
  577. if(minCellTemp>10+40 || maxCellTemp>30+40 || battSOC<10)
  578. {
  579. *heaterSwitch = 0;
  580. isNeedtoSwitch= true;
  581. }
  582. }
  583. return isNeedtoSwitch;
  584. }
  585. void battSOCDisplay()
  586. {
  587. static UINT8 lightTimer = 0;
  588. UINT8 socLowLEDFlashPeriod = 10;//10*100 = 1000ms
  589. UINT8 chargeLEDFlashPeriod = 6;//6*100 = 600ms
  590. float dutyRatio = 0.4;
  591. UINT8 temp;
  592. if(AppNVMData.isBattLocked == TRUE)
  593. {
  594. return;
  595. }
  596. if(UartBattInfoRecvFlag == true)
  597. {
  598. lightTimer++;
  599. if(battWorkState == 0||battWorkState == 1) //静置或放电状态
  600. {
  601. if(battSOC<=10)
  602. {
  603. if(lightTimer<(UINT8)(socLowLEDFlashPeriod*dutyRatio))
  604. {
  605. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  606. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  607. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  608. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  609. }
  610. else if(lightTimer>=(UINT8)(socLowLEDFlashPeriod*dutyRatio) && lightTimer<socLowLEDFlashPeriod)
  611. {
  612. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  613. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  614. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  615. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  616. }
  617. else
  618. {
  619. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  620. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  621. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  622. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  623. lightTimer = 0;
  624. }
  625. }
  626. else if(battSOC>10&&battSOC<=25)
  627. {
  628. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  629. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  630. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  631. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  632. lightTimer = 0;
  633. }
  634. else if(battSOC>25&&battSOC<=50)
  635. {
  636. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  637. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  638. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  639. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  640. lightTimer = 0;
  641. }
  642. else if(battSOC>50&&battSOC<=75)
  643. {
  644. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  645. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  646. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  647. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  648. lightTimer = 0;
  649. }
  650. else if(battSOC>75&&battSOC<=100)
  651. {
  652. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  653. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  654. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  655. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  656. lightTimer = 0;
  657. }
  658. }
  659. else if(battWorkState == 2)
  660. {
  661. if(battSOC<=25)
  662. {
  663. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  664. {
  665. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  666. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  667. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  668. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  669. }
  670. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  671. {
  672. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  673. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  674. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  675. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  676. }
  677. else
  678. {
  679. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  680. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  681. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  682. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  683. lightTimer = 0;
  684. }
  685. }
  686. else if(battSOC>25&&battSOC<=50)
  687. {
  688. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  689. {
  690. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  691. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  692. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  693. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  694. }
  695. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  696. {
  697. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  698. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  699. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  700. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  701. }
  702. else
  703. {
  704. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  705. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  706. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  707. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  708. lightTimer = 0;
  709. }
  710. }
  711. else if(battSOC>50&&battSOC<=75)
  712. {
  713. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  714. {
  715. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  716. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  717. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  718. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  719. }
  720. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  721. {
  722. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  723. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  724. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  725. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  726. }
  727. else
  728. {
  729. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  730. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  731. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  732. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  733. lightTimer = 0;
  734. }
  735. }
  736. else if(battSOC>75&&battSOC<=97)
  737. {
  738. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  739. {
  740. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  741. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  742. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  743. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  744. }
  745. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  746. {
  747. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  748. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  749. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  750. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  751. }
  752. else
  753. {
  754. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  755. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  756. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  757. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  758. lightTimer = 0;
  759. }
  760. }
  761. else if(battSOC>97&&battSOC<=100)
  762. {
  763. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  764. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  765. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  766. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  767. }
  768. }
  769. }
  770. }
  771. void battErrorStateDisplay()
  772. {
  773. static UINT8 errorLightTimer = 0;
  774. //static UINT32 currentTimerCount=0;
  775. UINT8 errorLEDFlashPeriod = 6;//600ms
  776. float errorDutyRatio = 0.4;
  777. if(AppNVMData.isBattLocked == TRUE)
  778. {
  779. return;
  780. }
  781. if(UartBattInfoRecvFlag == true)
  782. {
  783. errorLightTimer++;
  784. if(battWarningState != 0)
  785. {
  786. if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
  787. {
  788. FaultDisplay(LED_TURN_ON);
  789. }
  790. else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
  791. {
  792. FaultDisplay(LED_TURN_OFF);
  793. }
  794. else
  795. {
  796. FaultDisplay(LED_TURN_OFF);
  797. errorLightTimer = 0;
  798. }
  799. }
  800. else
  801. {
  802. FaultDisplay(LED_TURN_OFF);
  803. errorLightTimer = 0;
  804. }
  805. }
  806. }
  807. void battWarningStateDisplay()
  808. {
  809. static UINT8 warningLightTimer = 0;
  810. //static UINT32 currentTimerCount=0;
  811. UINT8 warningLEDFlashPeriod = 6;//600ms
  812. float warningDutyRatio = 0.4;
  813. if(AppNVMData.isBattLocked == TRUE)
  814. {
  815. return;
  816. }
  817. if(UartBattInfoRecvFlag == false)
  818. {
  819. warningLightTimer++;
  820. //if(battWarningState != 0)
  821. {
  822. if(warningLightTimer<(UINT8)(warningLEDFlashPeriod*warningDutyRatio))
  823. {
  824. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  825. FaultDisplay(LED_TURN_ON);
  826. }
  827. else if(warningLightTimer>=(UINT8)(warningLEDFlashPeriod*warningDutyRatio) && warningLightTimer<warningLEDFlashPeriod)
  828. {
  829. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  830. FaultDisplay(LED_TURN_OFF);
  831. }
  832. else
  833. {
  834. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  835. FaultDisplay(LED_TURN_OFF);
  836. warningLightTimer = 0;
  837. }
  838. }
  839. }
  840. }
  841. void battLockStateDisplay(UINT8 lockState)
  842. {
  843. static UINT8 currentState = 0;
  844. static UINT8 errorLightTimer = 0;
  845. //static UINT32 currentTimerCount=0;
  846. UINT8 errorLEDFlashPeriod = 10;//1000ms
  847. float errorDutyRatio = 0.4;
  848. //printf("lockState = %d\ncurrent State = %d\n",lockState,currentState);
  849. if(lockState==0)//no error
  850. {
  851. if(currentState!=lockState)
  852. {
  853. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  854. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  855. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  856. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  857. FaultDisplay(LED_TURN_OFF);
  858. currentState = lockState;
  859. errorLightTimer = 0;
  860. }
  861. else
  862. {
  863. return;
  864. }
  865. }
  866. else // error occurred, errorState = 1
  867. {
  868. if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
  869. {
  870. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  871. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  872. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  873. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  874. FaultDisplay(LED_TURN_ON);
  875. }
  876. else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
  877. {
  878. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  879. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  880. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  881. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  882. FaultDisplay(LED_TURN_OFF);
  883. }
  884. else
  885. {
  886. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  887. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  888. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  889. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  890. FaultDisplay(LED_TURN_OFF);
  891. errorLightTimer = 0;
  892. }
  893. }
  894. errorLightTimer++;
  895. }
  896. void relayPWMControl()
  897. {
  898. static UINT8 timerCount=0;
  899. //printf("timerCout=%d\n",timerCount);
  900. if(timerCount<2)
  901. {
  902. relayControl(TRUE);
  903. timerCount++;
  904. }
  905. else if(timerCount>=2 && timerCount<5)
  906. {
  907. relayControl(FALSE);
  908. timerCount++;
  909. }
  910. else
  911. {
  912. relayControl(FALSE);
  913. timerCount = 0;
  914. }
  915. }
  916. UINT8 decryptionAlgorithm (UINT16 cipherText)
  917. {
  918. UINT16 plainText = 1;
  919. UINT16 publicKeyD = 43;
  920. UINT16 publicKeyN = 10961;
  921. cipherText = cipherText % publicKeyN;
  922. while(publicKeyD >0)
  923. {
  924. if(publicKeyD % 2 ==1)
  925. {
  926. plainText = plainText * cipherText % publicKeyN;
  927. }
  928. publicKeyD = publicKeyD/2;
  929. cipherText = (cipherText * cipherText) % publicKeyN;
  930. }
  931. return (UINT8)plainText;
  932. }
  933. UINT16 encryptionAlgorithm (UINT16 plainText)
  934. {
  935. UINT16 cipherText = 1;
  936. UINT16 privateKeyE = 37507;
  937. UINT16 privateKeyN = 10961;
  938. plainText = plainText % privateKeyN;
  939. while(privateKeyE >0)
  940. {
  941. if(privateKeyE % 2 ==1)
  942. {
  943. cipherText = ( cipherText * plainText) % privateKeyN;
  944. }
  945. privateKeyE = privateKeyE/2;
  946. plainText = (plainText * plainText) % privateKeyN;
  947. }
  948. return cipherText;
  949. }
  950. UINT8 Uart_Encrypt_Send()
  951. {
  952. UINT8 SeedNumberArrray[4]={0x38,0x56,0xfe,0xac};
  953. UINT16 EncodeNumberArray[4];
  954. UINT8 UartEncryptBuffer[17];
  955. UINT8 UartDecryptBuffer[5];
  956. UINT16 CRC_chk_buffer;
  957. UINT8 timeCount = 0;
  958. UartEncryptBuffer[0] = BMS_ADDRESS_CODE;
  959. UartEncryptBuffer[1] = UART_ENCRYPT_CODE;
  960. UartEncryptBuffer[2] = 0x0c;
  961. for(int i=0;i<4;i++)
  962. {
  963. SeedNumberArrray[i]=rand();
  964. EncodeNumberArray[i] = encryptionAlgorithm(SeedNumberArrray[i]);
  965. UartEncryptBuffer[i+3] = SeedNumberArrray[i];
  966. UartEncryptBuffer[i*2+7] = EncodeNumberArray[i]>>8;
  967. UartEncryptBuffer[i*2+8] = EncodeNumberArray[i];
  968. }
  969. CRC_chk_buffer = crc_chk(UartEncryptBuffer,17-2);
  970. UartEncryptBuffer[15] = CRC_chk_buffer;
  971. UartEncryptBuffer[16] = CRC_chk_buffer>>8;
  972. USARTdrv->Send(UartEncryptBuffer,17);
  973. USARTdrv->Receive(UartDecryptBuffer,5);
  974. while((isRecvTimeout == false) && (isRecvComplete == false))
  975. {
  976. timeCount++;
  977. osDelay(100);
  978. if (timeCount>=10)
  979. {
  980. timeCount =0;
  981. isRecvTimeout = true;
  982. break;
  983. }
  984. }
  985. #ifdef USING_PRINTF
  986. printf("Uart_Rece_buffer: ");
  987. for(int i=0;i<5;i++)
  988. {
  989. printf("%x ",UartDecryptBuffer[i]);
  990. }
  991. #endif
  992. if (isRecvComplete == true)
  993. {
  994. isRecvComplete = false;
  995. return UartDecryptBuffer[2];
  996. }
  997. else
  998. {
  999. isRecvTimeout = false;
  1000. return 0x03;
  1001. }
  1002. }
  1003. /*-----------------------------------------------------------------------------*/
  1004. void SP_BMS_Update_Service() //超力源BMS升级服务
  1005. {
  1006. UINT8 errorCount = 0;
  1007. UINT8 resetCount = 0;
  1008. UINT16 currentPackage = 0;
  1009. UINT32 updateDataTotalByteLen = 0;
  1010. UpdateStep updateStep = UPDATE_STEP_CHECK_VERSION;
  1011. UINT8 i,j,ret=0;
  1012. UINT8 dataLen = 0;
  1013. UINT8 pUpdateMsgSend[80];
  1014. UINT32 updateMsgSendLen = 0;
  1015. UINT32 currentPackageStartAddr = 0;
  1016. BMS_Update_Recv_Msg_Type pUpdateMsgRecv;
  1017. UINT8 bmsUpdateFlag = 1;
  1018. //BMS_Update_Recv_Msg_Type bmsMsg;
  1019. //static UpdateStep step = UPDATE_STEP_CHECK_VERSION;
  1020. UINT8 Cycle_conut = 0;
  1021. while(bmsUpdateFlag && Cycle_conut<2)
  1022. {
  1023. switch (updateStep)
  1024. {
  1025. case UPDATE_STEP_CHECK_VERSION:
  1026. dataLen = 0;
  1027. updateMsgSendLen = 7;
  1028. pUpdateMsgSend[0] = 0xEB; //start flag
  1029. pUpdateMsgSend[1] = 0x01; //add flag
  1030. pUpdateMsgSend[2] = 0x01; //read
  1031. pUpdateMsgSend[3] = 0x03; //data len
  1032. pUpdateMsgSend[4] = 0x90; //cmd
  1033. pUpdateMsgSend[5] = 0x93; //checksum
  1034. pUpdateMsgSend[6] = 0xF5; //end flag
  1035. //printf("updateMsgSendLen0 = %x\n",updateMsgSendLen);
  1036. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1037. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv),sizeof(BMS_Update_Recv_Msg_Type), 500);
  1038. //printf("updateMsgSendLen1 = %x\n",updateMsgSendLen);
  1039. if(ret!=0)
  1040. {
  1041. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1042. {
  1043. if(pUpdateMsgRecv.cmd == 0x90)
  1044. {
  1045. if(pUpdateMsgRecv.data != 0xFF)
  1046. {
  1047. updateStep = UPDATE_STEP_REQUEST_UPDATE;
  1048. errorCount = 0;
  1049. }
  1050. else
  1051. {
  1052. updateStep = UPDATE_STEP_SET_BAUD_RATE;
  1053. errorCount = 0;
  1054. }
  1055. }
  1056. else
  1057. {
  1058. errorCount++;
  1059. }
  1060. }
  1061. else
  1062. {
  1063. errorCount++;
  1064. }
  1065. }
  1066. else
  1067. {
  1068. errorCount++;
  1069. }
  1070. #ifdef USING_PRINTF1
  1071. //printf("update step:%d\n",updateStep);
  1072. printf("query:");
  1073. for(j=0;j<updateMsgSendLen;j++)
  1074. {
  1075. printf("%x ",pUpdateMsgSend[j]);
  1076. }
  1077. printf("\nanswer:");
  1078. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1079. {
  1080. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1081. }
  1082. printf("\n");
  1083. printf("next update step:%d\n",updateStep);
  1084. #endif
  1085. if(errorCount>10)
  1086. {
  1087. updateStep = UPDATE_STEP_RESET;
  1088. errorCount = 0;
  1089. }
  1090. osDelay(50);
  1091. break;
  1092. case UPDATE_STEP_REQUEST_UPDATE:
  1093. dataLen = 1;
  1094. updateMsgSendLen = 8;
  1095. pUpdateMsgSend[0] = 0xEB; //start flag
  1096. pUpdateMsgSend[1] = 0x01; //add flag
  1097. pUpdateMsgSend[2] = 0x00; //write
  1098. pUpdateMsgSend[3] = 0x04; //data len
  1099. pUpdateMsgSend[4] = 0x80; //cmd
  1100. pUpdateMsgSend[5] = 0x22; //data
  1101. pUpdateMsgSend[6] = 0xA6; //check
  1102. pUpdateMsgSend[7] = 0xF5; //end flag
  1103. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1104. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1105. if(ret!=0)
  1106. {
  1107. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1108. {
  1109. if(pUpdateMsgRecv.cmd == 0x80)
  1110. {
  1111. if(pUpdateMsgRecv.data == 0x33)
  1112. {
  1113. updateStep = UPDATE_STEP_START_UPDATE;
  1114. errorCount = 0;
  1115. }
  1116. else
  1117. {
  1118. errorCount++;
  1119. }
  1120. }
  1121. else
  1122. {
  1123. errorCount++;
  1124. }
  1125. }
  1126. else
  1127. {
  1128. errorCount++;
  1129. }
  1130. }
  1131. else
  1132. {
  1133. errorCount++;
  1134. }
  1135. if(errorCount>10)
  1136. {
  1137. updateStep = UPDATE_STEP_RESET;
  1138. errorCount = 0;
  1139. }
  1140. #ifdef USING_PRINTF1
  1141. printf("update step:%d\n",updateStep);
  1142. printf("query:");
  1143. for(j=0;j<updateMsgSendLen;j++)
  1144. {
  1145. printf("%x ",pUpdateMsgSend[j]);
  1146. }
  1147. printf("\nanswer:");
  1148. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1149. {
  1150. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1151. }
  1152. printf("\n");
  1153. printf("next update step:%d\n",updateStep);
  1154. #endif
  1155. osDelay(50);
  1156. break;
  1157. case UPDATE_STEP_START_UPDATE:
  1158. dataLen = 1;
  1159. updateMsgSendLen = 8;
  1160. pUpdateMsgSend[0] = 0xEB; //start flag
  1161. pUpdateMsgSend[1] = 0x01; //add flag
  1162. pUpdateMsgSend[2] = 0x00; //write
  1163. pUpdateMsgSend[3] = 0x04; //data len
  1164. pUpdateMsgSend[4] = 0x80; //cmd
  1165. pUpdateMsgSend[5] = 0x55; //data
  1166. pUpdateMsgSend[6] = 0xD9; //check
  1167. pUpdateMsgSend[7] = 0xF5; //end flag
  1168. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1169. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1170. //updateStep = UPDATE_STEP_SET_BAUD_RATE;
  1171. updateStep = UPDATE_STEP_CHECK_VERSION_AGAIN;//2021-04-09跳过波特率设置
  1172. #ifdef USING_PRINTF1
  1173. printf("query:");
  1174. for(j=0;j<updateMsgSendLen;j++)
  1175. {
  1176. printf("%x ",pUpdateMsgSend[j]);
  1177. }
  1178. printf("\nanswer:");
  1179. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1180. {
  1181. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1182. }
  1183. printf("\n");
  1184. printf("next update step:%d\n",updateStep);
  1185. #endif
  1186. break;
  1187. case UPDATE_STEP_CHECK_VERSION_AGAIN:
  1188. dataLen = 0;
  1189. updateMsgSendLen = 7;
  1190. pUpdateMsgSend[0] = 0xEB; //start flag
  1191. pUpdateMsgSend[1] = 0x01; //add flag
  1192. pUpdateMsgSend[2] = 0x01; //read
  1193. pUpdateMsgSend[3] = 0x03; //data len
  1194. pUpdateMsgSend[4] = 0x90; //cmd
  1195. pUpdateMsgSend[5] = 0x93; //checksum
  1196. pUpdateMsgSend[6] = 0xF5; //end flag
  1197. //printf("updateMsgSendLen0 = %x\n",updateMsgSendLen);
  1198. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1199. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv),sizeof(BMS_Update_Recv_Msg_Type), 100);
  1200. //printf("updateMsgSendLen1 = %x\n",updateMsgSendLen);
  1201. if(ret!=0)
  1202. {
  1203. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1204. {
  1205. if(pUpdateMsgRecv.cmd == 0x90)
  1206. {
  1207. if(pUpdateMsgRecv.data != 0xFF)
  1208. {
  1209. updateStep = UPDATE_STEP_RESET;
  1210. errorCount = 0;
  1211. }
  1212. else
  1213. {
  1214. updateStep = UPDATE_STEP_SET_BAUD_RATE;
  1215. errorCount = 0;
  1216. }
  1217. }
  1218. else
  1219. {
  1220. errorCount++;
  1221. }
  1222. }
  1223. else
  1224. {
  1225. errorCount++;
  1226. }
  1227. }
  1228. else
  1229. {
  1230. errorCount++;
  1231. }
  1232. #ifdef USING_PRINTF1
  1233. //printf("update step:%d\n",updateStep);
  1234. printf("query:");
  1235. for(j=0;j<updateMsgSendLen;j++)
  1236. {
  1237. printf("%x ",pUpdateMsgSend[j]);
  1238. }
  1239. printf("\nanswer:");
  1240. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1241. {
  1242. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1243. }
  1244. printf("\n");
  1245. printf("next update step:%d\n",updateStep);
  1246. #endif
  1247. if(errorCount>10)
  1248. {
  1249. updateStep = UPDATE_STEP_RESET;
  1250. errorCount = 0;
  1251. }
  1252. osDelay(50);
  1253. break;
  1254. case UPDATE_STEP_SET_BAUD_RATE:
  1255. printf("start step %d\n",updateStep);
  1256. dataLen = 4;
  1257. updateMsgSendLen = 12;
  1258. pUpdateMsgSend[0] = 0xEB; //start flag
  1259. pUpdateMsgSend[1] = 0x01; //add flag
  1260. pUpdateMsgSend[2] = 0x00; //write
  1261. pUpdateMsgSend[3] = 0x08; //data len
  1262. pUpdateMsgSend[4] = 0x81; //cmd
  1263. pUpdateMsgSend[5] = 0x33; //data
  1264. pUpdateMsgSend[6] = 0x00; //baud rate:9600
  1265. pUpdateMsgSend[7] = 0x00;
  1266. pUpdateMsgSend[8] = 0x25;
  1267. pUpdateMsgSend[9] = 0x80;
  1268. pUpdateMsgSend[10] = 0x61; //check
  1269. pUpdateMsgSend[11] = 0xF5; //end flag
  1270. #ifdef USING_PRINTF1
  1271. printf("query:");
  1272. for(j=0;j<updateMsgSendLen;j++)
  1273. {
  1274. printf("%x ",pUpdateMsgSend[j]);
  1275. }
  1276. printf("\n");
  1277. #endif
  1278. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1279. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1280. printf("ret = %d\n",ret);
  1281. if(ret!=0)
  1282. {
  1283. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1284. {
  1285. if(pUpdateMsgRecv.cmd == 0x81)
  1286. {
  1287. if(pUpdateMsgRecv.data == 0x11)
  1288. {
  1289. updateStep = UPDATE_STEP_PREPARE_SEND_DATA_LEN;
  1290. errorCount = 0;
  1291. }
  1292. else
  1293. {
  1294. errorCount++;
  1295. }
  1296. }
  1297. else
  1298. {
  1299. errorCount++;
  1300. }
  1301. }
  1302. else
  1303. {
  1304. errorCount++;
  1305. }
  1306. }
  1307. else
  1308. {
  1309. errorCount++;
  1310. }
  1311. if(errorCount>10)
  1312. {
  1313. updateStep = UPDATE_STEP_RESET;
  1314. errorCount = 0;
  1315. }
  1316. #ifdef USING_PRINTF1
  1317. //printf("update step:%d\n",updateStep);
  1318. printf("query:");
  1319. for(j=0;j<updateMsgSendLen;j++)
  1320. {
  1321. printf("%x ",pUpdateMsgSend[j]);
  1322. }
  1323. printf("\nanswer:");
  1324. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1325. {
  1326. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1327. }
  1328. printf("\n");
  1329. printf("next update step:%d\n",updateStep);
  1330. #endif
  1331. osDelay(50);
  1332. break;
  1333. case UPDATE_STEP_PREPARE_SEND_DATA_LEN:
  1334. printf("start step %d\n",updateStep);
  1335. dataLen = 1;
  1336. updateMsgSendLen = 8;
  1337. pUpdateMsgSend[0] = 0xEB; //start flag
  1338. pUpdateMsgSend[1] = 0x01; //add flag
  1339. pUpdateMsgSend[2] = 0x00; //write
  1340. pUpdateMsgSend[3] = 0x04; //data len
  1341. pUpdateMsgSend[4] = 0x81; //cmd
  1342. pUpdateMsgSend[5] = 0x44; //data
  1343. pUpdateMsgSend[6] = 0xC9; //check
  1344. pUpdateMsgSend[7] = 0xF5; //end flag
  1345. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1346. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1347. if(ret!=0)
  1348. {
  1349. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1350. {
  1351. if(pUpdateMsgRecv.cmd == 0x81)
  1352. {
  1353. if(pUpdateMsgRecv.data == 0x11)
  1354. {
  1355. updateStep = UPDATE_STEP_SEND_DATA_LEN;
  1356. errorCount = 0;
  1357. }
  1358. else
  1359. {
  1360. errorCount++;
  1361. }
  1362. }
  1363. else
  1364. {
  1365. errorCount++;
  1366. }
  1367. }
  1368. else
  1369. {
  1370. errorCount++;
  1371. }
  1372. }
  1373. else
  1374. {
  1375. errorCount++;
  1376. }
  1377. if(errorCount>10)
  1378. {
  1379. updateStep = UPDATE_STEP_RESET;
  1380. errorCount = 0;
  1381. }
  1382. #ifdef USING_PRINTF1
  1383. //printf("update step:%d\n",updateStep);
  1384. printf("query:");
  1385. for(j=0;j<updateMsgSendLen;j++)
  1386. {
  1387. printf("%x ",pUpdateMsgSend[j]);
  1388. }
  1389. printf("\nanswer:");
  1390. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1391. {
  1392. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1393. }
  1394. printf("\n");
  1395. printf("next update step:%d\n",updateStep);
  1396. #endif
  1397. osDelay(50);
  1398. break;
  1399. case UPDATE_STEP_SEND_DATA_LEN:
  1400. dataLen = 4;
  1401. BSP_QSPI_Read_Safe(&updateDataTotalByteLen,FLASH_BMS_FOTA_START_ADDR,4);
  1402. updateDataTotalByteLen = (((updateDataTotalByteLen)&0xFF)<<24)|(((updateDataTotalByteLen>>8)&0xFF)<<16)|(((updateDataTotalByteLen>>16)&0xFF)<<8)|(((updateDataTotalByteLen>>24)&0xFF));
  1403. updateMsgSendLen = 11;
  1404. pUpdateMsgSend[0] = 0xEB; //start flag
  1405. pUpdateMsgSend[1] = 0x01; //add flag
  1406. pUpdateMsgSend[2] = 0x00; //write
  1407. pUpdateMsgSend[3] = 0x07; //data len
  1408. pUpdateMsgSend[4] = 0x82; //cmd
  1409. pUpdateMsgSend[5] = (updateDataTotalByteLen>>24)&0xFF; //data: package byte len
  1410. pUpdateMsgSend[6] = (updateDataTotalByteLen>>16)&0xFF;
  1411. pUpdateMsgSend[7] = (updateDataTotalByteLen>>8)&0xFF;
  1412. pUpdateMsgSend[8] = (updateDataTotalByteLen)&0xFF;
  1413. pUpdateMsgSend[9] = SP_BMS_Update_CheckSUM(&pUpdateMsgSend[3], dataLen+2); //check sum
  1414. pUpdateMsgSend[10] = 0xF5; //end flag
  1415. memset((UINT8*)(&pUpdateMsgRecv),0,sizeof(BMS_Update_Recv_Msg_Type));
  1416. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1417. if(ret!=0)
  1418. {
  1419. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1420. {
  1421. if(pUpdateMsgRecv.cmd == 0x81)
  1422. {
  1423. if(pUpdateMsgRecv.data == 0x11)
  1424. {
  1425. updateStep = UPDATE_STEP_PREPARE_SEND_UPDATE_DATA;
  1426. errorCount = 0;
  1427. }
  1428. else
  1429. {
  1430. errorCount++;
  1431. }
  1432. }
  1433. else
  1434. {
  1435. errorCount++;
  1436. }
  1437. }
  1438. else
  1439. {
  1440. errorCount++;
  1441. }
  1442. }
  1443. else
  1444. {
  1445. errorCount++;
  1446. }
  1447. if(errorCount>10)
  1448. {
  1449. updateStep = UPDATE_STEP_RESET;
  1450. errorCount = 0;
  1451. }
  1452. #ifdef USING_PRINTF1
  1453. //printf("update step:%d\n",updateStep);
  1454. printf("query:");
  1455. for(j=0;j<updateMsgSendLen;j++)
  1456. {
  1457. printf("%x ",pUpdateMsgSend[j]);
  1458. }
  1459. printf("\nanswer:");
  1460. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1461. {
  1462. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1463. }
  1464. printf("\n");
  1465. printf("next update step:%d\n",updateStep);
  1466. #endif
  1467. osDelay(50);
  1468. break;
  1469. case UPDATE_STEP_PREPARE_SEND_UPDATE_DATA:
  1470. dataLen = 1;
  1471. updateMsgSendLen = 8;
  1472. pUpdateMsgSend[0] = 0xEB; //start flag
  1473. pUpdateMsgSend[1] = 0x01; //add flag
  1474. pUpdateMsgSend[2] = 0x00; //write
  1475. pUpdateMsgSend[3] = 0x04; //data len
  1476. pUpdateMsgSend[4] = 0x81; //cmd
  1477. pUpdateMsgSend[5] = 0x55; //data
  1478. pUpdateMsgSend[6] = 0xDA; //check
  1479. pUpdateMsgSend[7] = 0xF5; //end flag
  1480. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1481. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen,(UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1482. if(ret!=0)
  1483. {
  1484. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1485. {
  1486. if(pUpdateMsgRecv.cmd == 0x81)
  1487. {
  1488. if(pUpdateMsgRecv.data == 0x11)
  1489. {
  1490. updateStep = UPDATE_STEP_SEND_UPDATE_DATA;
  1491. errorCount = 0;
  1492. }
  1493. else
  1494. {
  1495. errorCount++;
  1496. }
  1497. }
  1498. else
  1499. {
  1500. errorCount++;
  1501. }
  1502. }
  1503. else
  1504. {
  1505. errorCount++;
  1506. }
  1507. }
  1508. else
  1509. {
  1510. errorCount++;
  1511. }
  1512. if(errorCount>10)
  1513. {
  1514. updateStep = UPDATE_STEP_RESET;
  1515. errorCount = 0;
  1516. }
  1517. #ifdef USING_PRINTF1
  1518. //printf("update step:%d\n",updateStep);
  1519. printf("query:");
  1520. for(j=0;j<updateMsgSendLen;j++)
  1521. {
  1522. printf("%x ",pUpdateMsgSend[j]);
  1523. }
  1524. printf("\nanswer:");
  1525. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1526. {
  1527. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1528. }
  1529. printf("\n");
  1530. printf("next update step:%d\n",updateStep);
  1531. #endif
  1532. osDelay(50);
  1533. break;
  1534. case UPDATE_STEP_SEND_UPDATE_DATA:
  1535. dataLen = 64;
  1536. updateMsgSendLen = 75;
  1537. for(currentPackage=0;currentPackage<updateDataTotalByteLen/64;currentPackage++)
  1538. {
  1539. currentPackageStartAddr = currentPackage*64;
  1540. pUpdateMsgSend[0] = 0xEB; //start flag
  1541. pUpdateMsgSend[1] = 0x01; //add flag
  1542. pUpdateMsgSend[2] = 0x00; //write
  1543. pUpdateMsgSend[3] = 0x47; //data len
  1544. pUpdateMsgSend[4] = 0x82; //cmd
  1545. pUpdateMsgSend[5] = (currentPackageStartAddr>>24)&0xFF;
  1546. pUpdateMsgSend[6] = (currentPackageStartAddr>>16)&0xFF;
  1547. pUpdateMsgSend[7] = (currentPackageStartAddr>>8)&0xFF;
  1548. pUpdateMsgSend[8] = currentPackageStartAddr&0xFF;
  1549. BSP_QSPI_Read_Safe(&pUpdateMsgSend[9], FLASH_BMS_FOTA_START_ADDR+4+currentPackage*dataLen, dataLen); //data
  1550. pUpdateMsgSend[8+dataLen+1] = SP_BMS_Update_CheckSUM(&pUpdateMsgSend[3], dataLen+6); //check sum
  1551. pUpdateMsgSend[8+dataLen+2] = 0xF5; //end flag
  1552. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1553. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1554. if(ret!=0)
  1555. {
  1556. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1557. {
  1558. if(pUpdateMsgRecv.cmd == 0x81)
  1559. {
  1560. if(pUpdateMsgRecv.data == 0x11)
  1561. {
  1562. if(currentPackage+1 == updateDataTotalByteLen/64)
  1563. {
  1564. updateStep = UPDATE_STEP_SEND_DATA_END;
  1565. }
  1566. errorCount = 0;
  1567. }
  1568. else
  1569. {
  1570. errorCount++;
  1571. }
  1572. }
  1573. else
  1574. {
  1575. errorCount++;
  1576. }
  1577. }
  1578. else
  1579. {
  1580. errorCount++;
  1581. }
  1582. }
  1583. else
  1584. {
  1585. errorCount++;
  1586. }
  1587. if(errorCount>10)
  1588. {
  1589. updateStep = UPDATE_STEP_RESET;
  1590. errorCount = 0;
  1591. break;
  1592. }
  1593. #ifdef USING_PRINTF1
  1594. //printf("update step:%d\n",updateStep);
  1595. printf("query:");
  1596. for(j=0;j<updateMsgSendLen;j++)
  1597. {
  1598. printf("%x ",pUpdateMsgSend[j]);
  1599. }
  1600. printf("\nanswer:");
  1601. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1602. {
  1603. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1604. }
  1605. printf("\n");
  1606. printf("next update step:%d\n",updateStep);
  1607. #endif
  1608. }
  1609. osDelay(50);
  1610. break;
  1611. case UPDATE_STEP_SEND_DATA_END:
  1612. dataLen = 1;
  1613. updateMsgSendLen = 8;
  1614. pUpdateMsgSend[0] = 0xEB; //start flag
  1615. pUpdateMsgSend[1] = 0x01; //add flag
  1616. pUpdateMsgSend[2] = 0x00; //write
  1617. pUpdateMsgSend[3] = 0x04; //data len
  1618. pUpdateMsgSend[4] = 0x81; //cmd
  1619. pUpdateMsgSend[5] = 0x66; //data
  1620. pUpdateMsgSend[6] = 0xEB; //check
  1621. pUpdateMsgSend[7] = 0xF5; //end flag
  1622. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1623. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1624. if(ret!=0)
  1625. {
  1626. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1627. {
  1628. if(pUpdateMsgRecv.cmd == 0x81)
  1629. {
  1630. if(pUpdateMsgRecv.data == 0x11)
  1631. {
  1632. updateStep = UPDATE_STEP_START_INSTALL;
  1633. errorCount = 0;
  1634. }
  1635. else
  1636. {
  1637. errorCount++;
  1638. }
  1639. }
  1640. else
  1641. {
  1642. errorCount++;
  1643. }
  1644. }
  1645. else
  1646. {
  1647. errorCount++;
  1648. }
  1649. }
  1650. else
  1651. {
  1652. errorCount++;
  1653. }
  1654. if(errorCount>10)
  1655. {
  1656. updateStep = UPDATE_STEP_RESET;
  1657. errorCount = 0;
  1658. }
  1659. #ifdef USING_PRINTF1
  1660. //printf("update step:%d\n",updateStep);
  1661. printf("query:");
  1662. for(j=0;j<updateMsgSendLen;j++)
  1663. {
  1664. printf("%x ",pUpdateMsgSend[j]);
  1665. }
  1666. printf("\nanswer:");
  1667. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1668. {
  1669. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1670. }
  1671. printf("\n");
  1672. printf("next update step:%d\n",updateStep);
  1673. #endif
  1674. osDelay(50);
  1675. break;
  1676. case UPDATE_STEP_START_INSTALL:
  1677. dataLen = 1;
  1678. updateMsgSendLen = 8;
  1679. pUpdateMsgSend[0] = 0xEB; //start flag
  1680. pUpdateMsgSend[1] = 0x01; //add flag
  1681. pUpdateMsgSend[2] = 0x00; //write
  1682. pUpdateMsgSend[3] = 0x04; //data len
  1683. pUpdateMsgSend[4] = 0x81; //cmd
  1684. pUpdateMsgSend[5] = 0x99; //data
  1685. pUpdateMsgSend[6] = 0x1E; //check
  1686. pUpdateMsgSend[7] = 0xF5; //end flag
  1687. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1688. SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1689. updateStep = UPDATE_STEP_END;
  1690. #ifdef USING_PRINTF1
  1691. //printf("update step:%d\n",updateStep);
  1692. printf("query:");
  1693. for(j=0;j<updateMsgSendLen;j++)
  1694. {
  1695. printf("%x ",pUpdateMsgSend[j]);
  1696. }
  1697. printf("\nanswer:");
  1698. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1699. {
  1700. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1701. }
  1702. printf("\n");
  1703. printf("next update step:%d\n",updateStep);
  1704. #endif
  1705. osDelay(50);
  1706. break;
  1707. case UPDATE_STEP_END:
  1708. updateStep = UPDATE_STEP_CHECK_VERSION;
  1709. printf("update end\n");
  1710. bmsUpdateFlag = 0;
  1711. break;
  1712. case UPDATE_STEP_RESET:
  1713. dataLen = 1;
  1714. updateMsgSendLen = 8;
  1715. pUpdateMsgSend[0] = 0xEB; //start flag
  1716. pUpdateMsgSend[1] = 0x01; //add flag
  1717. pUpdateMsgSend[2] = 0x00; //write
  1718. pUpdateMsgSend[3] = 0x04; //data len
  1719. pUpdateMsgSend[4] = 0x81; //cmd
  1720. pUpdateMsgSend[5] = 0xAA; //data
  1721. pUpdateMsgSend[6] = 0x2F; //check
  1722. pUpdateMsgSend[7] = 0xF5; //end flag
  1723. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1724. SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1725. osDelay(50);
  1726. resetCount++;
  1727. if(resetCount>=2)
  1728. {
  1729. updateStep = UPDATE_STEP_DOWNLOAD_BREAK_OFF;
  1730. resetCount = 0;
  1731. }
  1732. else
  1733. {
  1734. updateStep = UPDATE_STEP_PREPARE_SEND_DATA_LEN;
  1735. }
  1736. #ifdef USING_PRINTF
  1737. printf("update error!!\n rest and start send data lenth again!!\n continue update!\n");
  1738. #endif
  1739. break;
  1740. case UPDATE_STEP_DOWNLOAD_BREAK_OFF:
  1741. dataLen = 1;
  1742. updateMsgSendLen = 8;
  1743. pUpdateMsgSend[0] = 0xEB; //start flag
  1744. pUpdateMsgSend[1] = 0x01; //add flag
  1745. pUpdateMsgSend[2] = 0x00; //write
  1746. pUpdateMsgSend[3] = 0x04; //data len
  1747. pUpdateMsgSend[4] = 0x81; //cmd
  1748. pUpdateMsgSend[5] = 0xBB; //data
  1749. pUpdateMsgSend[6] = 0x40; //check
  1750. pUpdateMsgSend[7] = 0xF5; //end flag
  1751. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1752. SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1753. osDelay(50);
  1754. updateStep = UPDATE_STEP_CHECK_VERSION;
  1755. Cycle_conut++;
  1756. break;
  1757. case UPDATE_STEP_ERROR:
  1758. updateStep = UPDATE_STEP_CHECK_VERSION;
  1759. printf("update error end\n");
  1760. bmsUpdateFlag = 0;
  1761. break;
  1762. default:
  1763. updateStep = UPDATE_STEP_CHECK_VERSION;
  1764. printf("update default end\n");
  1765. bmsUpdateFlag = 0;
  1766. break;
  1767. }
  1768. }
  1769. }
  1770. UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout)
  1771. {
  1772. UINT8 timeCount = 0;
  1773. UINT8 j=0;
  1774. USARTdrv->Send(pSend,sendLen);
  1775. #ifdef USING_PRINTF
  1776. printf("query in:");
  1777. for(j=0;j<sendLen;j++)
  1778. {
  1779. printf("%x ",*(pSend+j));
  1780. }
  1781. printf("\n");
  1782. #endif
  1783. if(readLen>0)
  1784. {
  1785. USARTdrv->Receive(pRead,readLen);
  1786. while((isRecvTimeout == false) && (isRecvComplete == false))
  1787. {
  1788. timeCount++;
  1789. osDelay(100);
  1790. if (timeCount>=timeout/100)
  1791. {
  1792. timeCount =0;
  1793. isRecvTimeout = true;
  1794. break;
  1795. }
  1796. }
  1797. #ifdef USING_PRINTF
  1798. printf("\nanswer in:");
  1799. for(j=0;j<readLen;j++)
  1800. {
  1801. printf("%x ",*(pRead+j));
  1802. }
  1803. printf("\n");
  1804. #endif
  1805. if (isRecvComplete == true)
  1806. {
  1807. isRecvComplete = false;
  1808. if(*(pRead+0)!=0xEB)
  1809. {
  1810. USARTdrv->Uninitialize();
  1811. osDelay(100);
  1812. USARTdrv->Initialize(USART_callback);
  1813. USARTdrv->PowerControl(ARM_POWER_FULL);
  1814. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  1815. ARM_USART_DATA_BITS_8 |
  1816. ARM_USART_PARITY_NONE |
  1817. ARM_USART_STOP_BITS_1 |
  1818. ARM_USART_FLOW_CONTROL_NONE, 9600);
  1819. #ifdef USING_PRINTF
  1820. printf("\nuart reset in \n");
  1821. #endif
  1822. return 0;
  1823. }
  1824. return readLen;
  1825. }
  1826. else
  1827. {
  1828. memset(pRead,0x00,readLen);
  1829. isRecvTimeout = false;
  1830. return 0;
  1831. }
  1832. }
  1833. else
  1834. {
  1835. return 1;
  1836. }
  1837. }
  1838. UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len)
  1839. {
  1840. UINT8 ret = 0;
  1841. UINT8 i=0;
  1842. for(i=0;i<len;i++)
  1843. {
  1844. ret +=*(pSendData+i);
  1845. }
  1846. return ret&0xFF;
  1847. }