UartTask.c 82 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019
  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. extern UINT8 WorkFlag;
  42. extern UINT8 UDSSwitch;
  43. //全局变量输出区
  44. BOOL UartBattInfoRecvFlag = false;
  45. QueueHandle_t UartWriteCmdHandle = NULL;
  46. UINT8 BattChrgEndFlag;
  47. //
  48. extern ARM_DRIVER_USART Driver_USART1;
  49. static ARM_DRIVER_USART *USARTdrv = &Driver_USART1;
  50. volatile bool isRecvTimeout = false;
  51. volatile bool isRecvComplete = false;
  52. //线程声明区
  53. static StaticTask_t gProcess_Uart_Task_t;
  54. static UINT8 gProcess_Uart_TaskStack[PROC_UART_TASK_STACK_SIZE];
  55. static osThreadId_t UartTaskId = NULL;
  56. static process_Uart gProcess_Uart_Task = PROCESS_UART_STATE_IDLE;
  57. #define PROC_UART_STATE_SWITCH(a) (gProcess_Uart_Task = a)
  58. //函数声明区
  59. void USART_callback(uint32_t event);
  60. UINT8 Uart_DataRecv_func(Uart_Read_Msg_Type Uart_Read_Msg_Fun,UINT8* Uart_Recv_Buffer_Fun);
  61. static BOOL uartBattInfoDecode(UINT8* dataPtr);
  62. UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData);
  63. UINT16 crc_chk(UINT8* data, UINT8 length);
  64. void battSOCDisplay(void);
  65. void battErrorStateDisplay(void);
  66. void battWarningStateDisplay(void);
  67. void battLockStateDisplay(UINT8 lockState);
  68. void relayControlFunc(float DutyRatio);
  69. void SP_BMS_Update_Service(void);
  70. BOOL BattHeaterSwitch(UINT8* heaterSwitch);
  71. UINT16 encryptionAlgorithm (UINT16 plainText);
  72. UINT8 decryptionAlgorithm (UINT16 cipherText);
  73. UINT8 Uart_Encrypt_Send(void);
  74. UINT8 BmsErrorDecode(UINT32 battWarningState);
  75. //BMS升级函数声明
  76. UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len);
  77. void SP_BMS_Update_Service();
  78. UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);
  79. updateBMSStatus MS_BMS_Update_Service();
  80. UINT16 MS_BMS_Update_CRC16(UINT8* pSendData,UINT16 len);
  81. UINT8 MS_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);
  82. //Uart线程任务区
  83. static void UartTask(void* arg)
  84. {
  85. USARTdrv->Initialize(USART_callback);
  86. USARTdrv->PowerControl(ARM_POWER_FULL);
  87. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  88. ARM_USART_DATA_BITS_8 |
  89. ARM_USART_PARITY_NONE |
  90. ARM_USART_STOP_BITS_1 |
  91. ARM_USART_FLOW_CONTROL_NONE, 9600);
  92. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
  93. UINT16 Reg_Num = 0;
  94. UINT16 Uart_Uds_LEN;
  95. UINT16 Uart_Recv_LEN;
  96. UINT32 currentTimerCount=0;
  97. BOOL uartReadSuccessFlag = false;
  98. Uart_Read_Msg_Type Uart_Read_Msg;
  99. memset(&(Uart_Read_Msg),0x00,sizeof(Uart_Read_Msg_Type));
  100. Uart_Write_Data_Type UartWriteData; //Uart控制命令
  101. memset(&(UartWriteData),0x00,sizeof(Uart_Write_Data_Type));
  102. UartReadMsgType UartReadMsg;
  103. memset(&(UartReadMsg.UartFlag),0x00,sizeof(UartReadMsgType));
  104. if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
  105. {
  106. UartWriteCmdHandle = osMessageQueueNew(1,sizeof(Uart_Write_Data_Type), NULL);
  107. }
  108. //上电起始控制区域
  109. UINT8 ret = 0x00,Ringtimes = 0;
  110. UINT8 HeatSwitch = 0;
  111. while (1)
  112. {
  113. switch (gProcess_Uart_Task)
  114. {
  115. case PROCESS_UART_STATE_ENCRYPT:
  116. {
  117. UINT8 EncryptFlag=0x00;
  118. UINT8 EncryptCount=0;
  119. while(EncryptFlag!=0x01&&EncryptCount<=3)
  120. {
  121. EncryptFlag = Uart_Encrypt_Send();
  122. EncryptCount++;
  123. }
  124. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  125. break;
  126. }
  127. case PROCESS_UART_STATE_IDLE:
  128. {
  129. osDelay(100);
  130. if(Sleep_flag)
  131. {
  132. Ringtimes = 0;
  133. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
  134. break;
  135. }
  136. else if(Timer_count%10==0)
  137. {
  138. #ifdef USING_PRINTF1
  139. printf("[%d]Uart Timer 1s:%d,uartReadSuccessFlag:%d\n",__LINE__,Timer_count,uartReadSuccessFlag);
  140. #endif
  141. if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK && uartReadSuccessFlag==TRUE)
  142. {
  143. #ifdef USING_PRINTF
  144. printf("[%d]UartWriteCmdHandle :%x-%X%X\n",__LINE__,UartWriteData.WriteCmd,UartWriteData.Data[0],UartWriteData.Data[1]);
  145. #endif
  146. Ringtimes = 0;
  147. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WRITE);
  148. break;
  149. }
  150. else
  151. {
  152. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
  153. break;
  154. }
  155. }
  156. if(maxCellVol>4400&&maxCellVol<6000)//继电器测试
  157. {
  158. AppDataInfo.RelayControl=TRUE;
  159. }
  160. else if(maxCellVol<4000)
  161. {
  162. AppDataInfo.RelayControl=FALSE;
  163. }
  164. if(UartReadMsg.Header[2]>0)
  165. {
  166. uartReadSuccessFlag = true;
  167. }
  168. else
  169. {
  170. uartReadSuccessFlag = false;
  171. }
  172. if(Timer_count-currentTimerCount >= 1)
  173. {
  174. if(AppNVMData.isBattLocked != 0)
  175. {
  176. battLockStateDisplay(TRUE);
  177. }
  178. else if(uartReadSuccessFlag)
  179. {
  180. battSOCDisplay();
  181. battErrorStateDisplay();
  182. }
  183. else
  184. {
  185. battWarningStateDisplay();
  186. }
  187. if(AppNVMData.isBattLocked==FALSE && ret==0x01)
  188. {
  189. relayControlFunc(0.6);
  190. Ringtimes++;
  191. if(Ringtimes>=30)
  192. {
  193. relayControl(FALSE);
  194. ret = 0;
  195. Ringtimes = 0;
  196. }
  197. }
  198. else if (AppNVMData.isBattLocked==TRUE && ret==0x01)
  199. {
  200. relayControlFunc(0.6);
  201. Ringtimes++;
  202. if(Ringtimes>=20)
  203. {
  204. relayControl(FALSE);
  205. ret = 0;
  206. Ringtimes = 0;
  207. }
  208. }
  209. else if(UDSSwitch==1 && Ringtimes<=50)
  210. {
  211. relayControlFunc(0.6);
  212. Ringtimes++;
  213. }
  214. else if(BuzzerControl==TRUE)
  215. {
  216. relayControlFunc(0.6);
  217. }
  218. if(Ringtimes>=50)
  219. {
  220. relayControl(FALSE);
  221. }
  222. }
  223. currentTimerCount = Timer_count;
  224. if(BMS_Fota_update_flag)
  225. {
  226. if(WorkFlag==0x00)
  227. {
  228. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_UPDATE);
  229. break;
  230. }
  231. }
  232. if(battWorkState ==0x00 && AppNVMData.isBattLocked==TRUE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03)!=0x02)//try to lock lock the discharge
  233. {
  234. #ifdef USING_PRINTF
  235. printf("[%d]try to lock:%X-%X\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03);
  236. #endif
  237. UartWriteData.WriteCmd = 0x01;
  238. UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
  239. UartWriteData.Data[1] = 0x02;
  240. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
  241. }
  242. else if (battWorkState ==0x00 && AppNVMData.isBattLocked==FALSE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03)!=0x03) // try to unlock
  243. {
  244. #ifdef USING_PRINTF
  245. printf("[%d]try to unlock:%X-%X\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03);
  246. #endif
  247. UartWriteData.WriteCmd = 0x01;
  248. UartWriteData.Data[0] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2]);
  249. UartWriteData.Data[1] = 0x03;
  250. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
  251. }
  252. if(AppDataInfo.RelayControl==TRUE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x00)//继电器断开
  253. {
  254. UartWriteData.WriteCmd = 0x03;
  255. UartWriteData.Data[0] = 0x80;
  256. UartWriteData.Data[1] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]);
  257. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
  258. }
  259. else if(AppDataInfo.RelayControl==FALSE && ((UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2])&0x80)==0x80)//继电器闭合
  260. {
  261. UartWriteData.WriteCmd = 0x03;
  262. UartWriteData.Data[0] = 0x00;
  263. UartWriteData.Data[1] = 0x00|(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1]);
  264. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
  265. }
  266. if(BattHeaterSwitch(&HeatSwitch)==TRUE)
  267. {
  268. UartWriteData.WriteCmd = 0x02;
  269. UartWriteData.Data[0] = 0x00;
  270. UartWriteData.Data[1] = HeatSwitch&0xFF;
  271. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
  272. }
  273. break;
  274. }
  275. case PROCESS_UART_STATE_READ:
  276. {
  277. UINT16 CRC_chk_buffer;
  278. Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;//按照协议里面的0x21+X+N的结束地址
  279. Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
  280. Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
  281. Uart_Read_Msg.Reg_Begin_H = 0x00;
  282. Uart_Read_Msg.Reg_Begin_L= 0x00;
  283. Uart_Read_Msg.Reg_Num_H = Reg_Num>>8;
  284. Uart_Read_Msg.Reg_Num_L = Reg_Num;
  285. Uart_Uds_LEN = Reg_Num*2;
  286. memset(UartReadMsg.Header,0x00,Uart_Uds_LEN);
  287. CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Read_Msg,6);
  288. Uart_Read_Msg.CRC_L = CRC_chk_buffer;
  289. Uart_Read_Msg.CRC_H = CRC_chk_buffer>>8;
  290. //Uart_Recv_LEN = Uart_DataRecv_func((UINT8 *)&Uart_Read_Msg,(UINT8*)UartReadMsg.Header);
  291. Uart_Recv_LEN = Uart_DataRecv_func(Uart_Read_Msg,(UINT8*)(UartReadMsg.Header));
  292. if(Uart_Recv_LEN>0)
  293. {
  294. UartBattInfoRecvFlag = TRUE;
  295. uartBattInfoDecode(UartReadMsg.data);
  296. }
  297. else
  298. {
  299. UartBattInfoRecvFlag = FALSE;
  300. }
  301. UartReadMsg.len = Uart_Recv_LEN;
  302. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  303. if( battWorkState ==0x02)
  304. {
  305. BattChrgEndFlag=TRUE;
  306. }
  307. else
  308. {
  309. BattChrgEndFlag=FALSE;
  310. }
  311. #ifdef USING_PRINTF1
  312. printf("[%d]lock:%X,permit:%X,Mos:%x\n",__LINE__,AppNVMData.isBattLocked,(UartReadMsg.data[(0x1B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM)*2+1])&0x03,((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_OTHER_TEMP_NUM)*2+1])>>1)&0x03);
  313. #endif
  314. break;
  315. }
  316. case PROCESS_UART_STATE_WRITE:
  317. {
  318. ret = Uart_WriteCmd_func(UartWriteData);
  319. osDelay(500);
  320. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
  321. break;
  322. }
  323. case PROCESS_UART_STATE_UPDATE:
  324. UartBattInfoRecvFlag = FALSE;
  325. #if BMS_MANUFACTURE==1
  326. {
  327. SP_BMS_Update_Service();
  328. }
  329. #elif BMS_MANUFACTURE==2
  330. MS_BMS_Update_Service();
  331. #endif
  332. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  333. BMS_Fota_update_flag = FALSE;
  334. break;
  335. case PROCESS_UART_STATE_SLEEP:
  336. {
  337. USARTdrv->PowerControl(ARM_POWER_LOW);
  338. while(TRUE)
  339. {
  340. osDelay(60000/portTICK_PERIOD_MS);
  341. }
  342. osThreadExit();
  343. break;
  344. }
  345. }
  346. }
  347. }
  348. //Uart 接收的数据解码
  349. static BOOL uartBattInfoDecode(UINT8* dataPtr)
  350. {
  351. //BattInfoType battInfo;
  352. UINT8 i,temp=0;
  353. UINT8 TEMP_NUM = BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;
  354. UINT16 Batt_current;
  355. for(i=0;i<BATT_CELL_VOL_NUM;i++)
  356. {
  357. battCellU[i] = (dataPtr[(0x02+i)*2] << 8) | dataPtr[(0x02+i)*2 + 1];
  358. }
  359. battWorkState = (dataPtr[(0x03+BATT_CELL_VOL_NUM)*2+1])&0x03;//电池状态(原始数据),0表示静置,1表示放电,2表示充电
  360. for(i=0; i<BATT_TEMP_NUM; i++)
  361. {
  362. battCellTemp[i] = dataPtr[(0x06+BATT_CELL_VOL_NUM+i)*2+1];
  363. }
  364. MOSTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM)*2+1];
  365. packTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+1)*2+1];
  366. Batt_current = (dataPtr[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(dataPtr[(0x02+BATT_CELL_VOL_NUM)*2+1]);
  367. //原始数据:充电为负,放电为正
  368. if(battWorkState == 0x02) //充电过程
  369. {
  370. if(Batt_current >0x8000)// 数据为负
  371. {
  372. //求补码,结果为负
  373. Batt_current = (UINT16)((UINT16)(~(Batt_current))+1);
  374. Batt_current = Batt_current/10;
  375. AppDataInfo.BattCurrentNegFlag = -1;
  376. }
  377. else
  378. {
  379. //源码,结果为负
  380. Batt_current = Batt_current/10;
  381. AppDataInfo.BattCurrentNegFlag = -1;
  382. }
  383. }
  384. else //放电过程
  385. {
  386. if(Batt_current >0x8000)// 数据为负
  387. {
  388. //求补码,结果为正
  389. Batt_current = (UINT16)((UINT16)(~(Batt_current))+1);
  390. Batt_current = Batt_current/10;
  391. AppDataInfo.BattCurrentNegFlag = 1;
  392. }
  393. else
  394. {
  395. //源码,结果为正
  396. Batt_current = Batt_current/10;
  397. AppDataInfo.BattCurrentNegFlag = 1;
  398. }
  399. }
  400. battI = Batt_current*AppDataInfo.BattCurrentNegFlag + 0x2710;
  401. //bit0 ~ bit31 represent cell0 ~ cell31
  402. 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);
  403. // chargerConnectState = (dataPtr[(0x03+BATT_CELL_VOL_NUM)*2+1])&0x04;//充电器连接状态,0表示未连接,1表示已连接
  404. bmsHwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
  405. bmsSwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2];
  406. temp = ((dataPtr[(0x09+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1])>>1)&0x03;
  407. battMOSSwitchState = ((temp&0x01)<<1)|((temp&0x02)>>1);
  408. #ifdef USING_PRINTF1
  409. printf("[%d]battMOSSwitchState :%x\n",__LINE__,battMOSSwitchState);
  410. #endif
  411. if(AppNVMData.isBattLocked==TRUE)
  412. {
  413. battMOSSwitchState = battMOSSwitchState |(0x01<<2);
  414. }
  415. else
  416. {
  417. battMOSSwitchState = battMOSSwitchState |(0x00<<2);
  418. }
  419. 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]);
  420. battSOC = dataPtr[(0x0B+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
  421. battSOH = dataPtr[(0x0C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
  422. Battdesigncap = (dataPtr[(0x0E+BATT_CELL_VOL_NUM+TEMP_NUM)*2])<<24|(dataPtr[(0x0E+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1])<<16|(dataPtr[(0x0F+BATT_CELL_VOL_NUM+TEMP_NUM)*2])<<8|(dataPtr[(0x0F+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]);
  423. battPackVol =((dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2])<<8|(dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]))/10; //uint 100mV
  424. maxCellVol = (dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
  425. minCellVol = (dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
  426. RelayControlState = (dataPtr[(0x1B+BATT_CELL_VOL_NUM+TEMP_NUM)*2])&0x80;
  427. battHeatEnableState = dataPtr[(0x1C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]&0x01;
  428. maxCellTemp = 0x00;
  429. minCellTemp = 0xFF;
  430. for(i=0;i<BATT_TEMP_NUM;i++)
  431. {
  432. maxCellTemp = max(maxCellTemp,battCellTemp[i]);
  433. minCellTemp = min(minCellTemp,battCellTemp[i]);
  434. }
  435. nbSwVersion = APPSWVERSION;
  436. nbHwVersion = HWVERSION;
  437. BmsErrorDecode(battWarningState);
  438. return true;
  439. }
  440. //Uart线程初始化
  441. void UartTaskInit(void *arg)
  442. {
  443. osThreadAttr_t task_attr;
  444. memset(&task_attr,0,sizeof(task_attr));
  445. memset(gProcess_Uart_TaskStack, 0xA5, PROC_UART_TASK_STACK_SIZE);
  446. task_attr.name = "Uart_Task";
  447. task_attr.stack_mem = gProcess_Uart_TaskStack;
  448. task_attr.stack_size = PROC_UART_TASK_STACK_SIZE;
  449. task_attr.priority = osPriorityBelowNormal7;
  450. task_attr.cb_mem = &gProcess_Uart_Task_t;
  451. task_attr.cb_size = sizeof(StaticTask_t);
  452. UartTaskId = osThreadNew(UartTask, NULL, &task_attr);
  453. }
  454. void UartTaskDeInit(void *arg)
  455. {
  456. osThreadTerminate(UartTaskId);
  457. UartTaskId = NULL;
  458. }
  459. //函数区
  460. //Uart回调程序
  461. void USART_callback(uint32_t event)
  462. {
  463. if(event & ARM_USART_EVENT_RX_TIMEOUT)
  464. {
  465. isRecvTimeout = true;
  466. }
  467. if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
  468. {
  469. isRecvComplete = true;
  470. }
  471. }
  472. //Uart校验程序
  473. UINT16 crc_chk(UINT8* data, UINT8 length)
  474. {
  475. UINT8 j;
  476. UINT16 reg_crc=0xFFFF;
  477. while(length--)
  478. {
  479. reg_crc ^= *data++;
  480. for(j=0;j<8;j++)
  481. {
  482. if(reg_crc & 0x01)
  483. {
  484. reg_crc=(reg_crc>>1) ^ 0xA001;
  485. }
  486. else
  487. {
  488. reg_crc=reg_crc >>1;
  489. }
  490. }
  491. }
  492. return reg_crc;
  493. }
  494. //Uart写命令函数
  495. UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
  496. {
  497. Uart_Write_Msg_Type Uart_Write_Msg;
  498. UINT16 RegAddress = 0x0000;
  499. UINT16 CRC_chk_buffer;
  500. UINT8 timeout = 0x00;
  501. UINT8 Uart_Recv_Buffer[8];
  502. #ifdef USING_PRINTF
  503. printf("\nUart_WriteCmd_func: %x ",UartWriteData.WriteCmd);
  504. #endif
  505. switch (UartWriteData.WriteCmd)
  506. {
  507. case 0x01://是否锁定
  508. {
  509. RegAddress = 0x1B + BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM;
  510. Uart_Write_Msg.Bms_Address = BMS_ADDRESS_CODE;
  511. Uart_Write_Msg.Bms_Funcode = UART_WRITE_CODE;
  512. Uart_Write_Msg.Reg_Begin_H = RegAddress>>8;
  513. Uart_Write_Msg.Reg_Begin_L = RegAddress;
  514. Uart_Write_Msg.Reg_Num_H = 0x00;
  515. Uart_Write_Msg.Reg_Num_L = 0x01;
  516. Uart_Write_Msg.Data_Count = 0x02;//要写入的字节数
  517. memcpy(Uart_Write_Msg.Data,UartWriteData.Data,2);
  518. CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
  519. Uart_Write_Msg.CRC_L = CRC_chk_buffer;
  520. Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
  521. break;
  522. }
  523. case 0x02://是否加热
  524. {
  525. RegAddress = 0x1C + BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM;
  526. Uart_Write_Msg.Bms_Address = BMS_ADDRESS_CODE;
  527. Uart_Write_Msg.Bms_Funcode = UART_WRITE_CODE;
  528. Uart_Write_Msg.Reg_Begin_H = RegAddress>>8;
  529. Uart_Write_Msg.Reg_Begin_L = RegAddress;
  530. Uart_Write_Msg.Reg_Num_H = 0x00;
  531. Uart_Write_Msg.Reg_Num_L = 0x01;
  532. Uart_Write_Msg.Data_Count = 0x02;//要写入的字节数
  533. memcpy(Uart_Write_Msg.Data,UartWriteData.Data,2);
  534. CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
  535. Uart_Write_Msg.CRC_L = CRC_chk_buffer;
  536. Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
  537. break;
  538. }
  539. case 0x03://是否继电器控制
  540. {
  541. RegAddress = 0x1B + BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM;
  542. Uart_Write_Msg.Bms_Address = BMS_ADDRESS_CODE;
  543. Uart_Write_Msg.Bms_Funcode = UART_WRITE_CODE;
  544. Uart_Write_Msg.Reg_Begin_H = RegAddress>>8;
  545. Uart_Write_Msg.Reg_Begin_L = RegAddress;
  546. Uart_Write_Msg.Reg_Num_H = 0x00;
  547. Uart_Write_Msg.Reg_Num_L = 0x01;
  548. Uart_Write_Msg.Data_Count = 0x02;//要写入的字节数
  549. memcpy(Uart_Write_Msg.Data,UartWriteData.Data,2);
  550. CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
  551. Uart_Write_Msg.CRC_L = CRC_chk_buffer;
  552. Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
  553. break;
  554. }
  555. default:
  556. {
  557. UartWriteData.WriteCmd = 0x00;
  558. return 0;
  559. break;
  560. }
  561. }
  562. USARTdrv->Send((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg));
  563. #ifdef USING_PRINTF
  564. printf("Uart_Send_buffer: ");
  565. for(int i=0;i<sizeof(Uart_Write_Msg);i++)
  566. {
  567. printf("%x ",*((UINT8 *)&Uart_Write_Msg+i));
  568. }
  569. printf("\n");
  570. #endif
  571. USARTdrv->Receive(Uart_Recv_Buffer,8);
  572. while((isRecvTimeout == false) && (isRecvComplete == false))
  573. {
  574. timeout++;
  575. osDelay(100);
  576. if (timeout>=10)
  577. {
  578. timeout =0;
  579. isRecvTimeout = true;
  580. break;
  581. }
  582. }
  583. if (isRecvComplete == true)
  584. {
  585. #ifdef USING_PRINTF
  586. printf("Uart_Rece_buffer: ");
  587. for(int i=0;i<8;i++)
  588. {
  589. printf("%x ",Uart_Recv_Buffer[i]);
  590. }
  591. printf("\n");
  592. #endif
  593. isRecvComplete = false;
  594. if(Uart_Recv_Buffer[1]==0x10)
  595. {
  596. return UartWriteData.WriteCmd;
  597. }
  598. else
  599. {
  600. return 0x00;
  601. }
  602. }
  603. else
  604. {
  605. isRecvTimeout = false;
  606. return 0x00;
  607. }
  608. }
  609. //Uart发送接收函数
  610. UINT8 Uart_DataRecv_func(Uart_Read_Msg_Type Uart_Read_Msg_Fun,UINT8* Uart_Recv_Buffer_Fun)
  611. {
  612. UINT16 CRC_Rece_buffer;
  613. UINT16 CRC_chk_buffer;
  614. UINT16 Data_Len ;
  615. UINT8 timeout = 0x00;
  616. UINT8 pSendCmd[8];
  617. memcpy(pSendCmd,(UINT8*)(&Uart_Read_Msg_Fun),8);
  618. //Data_Len = (*(Uart_Read_Msg_Fun+4)|*(Uart_Read_Msg_Fun+5))*2+5;
  619. Data_Len = ((Uart_Read_Msg_Fun.Reg_Num_H<<8)|(Uart_Read_Msg_Fun.Reg_Num_L))*2+5;
  620. //USARTdrv->Send(Uart_Read_Msg_Fun,8);
  621. USARTdrv->Send(pSendCmd,8);
  622. #ifdef USING_PRINTF1
  623. printf("Uart_Send_buffer: ");
  624. for(int i=0;i<8;i++)
  625. // {
  626. printf("%x ",pSendCmd[i]);
  627. // }
  628. printf("end\n");
  629. //printf("%x ",*(Uart_Read_Msg_Fun));
  630. //UINT8 temp = *(Uart_Read_Msg_Fun);
  631. #endif
  632. USARTdrv->Receive(Uart_Recv_Buffer_Fun,Data_Len);
  633. while(true)
  634. {
  635. timeout++;
  636. if((isRecvTimeout == true) || (isRecvComplete == true))
  637. {
  638. break;
  639. }
  640. else
  641. {
  642. osDelay(100);
  643. if (timeout>=10)
  644. {
  645. // Data_Len = 0;
  646. timeout =0;
  647. isRecvTimeout = true;
  648. }
  649. }
  650. }
  651. #ifdef USING_PRINTF1
  652. printf("Uart_Rece_buffer1: ");
  653. for(int j=0;j<Data_Len;j++)
  654. {
  655. printf("%x ",*(Uart_Recv_Buffer_Fun+j));
  656. }
  657. #endif
  658. if (isRecvComplete == true)
  659. {
  660. isRecvComplete = false;
  661. CRC_Rece_buffer =*(Uart_Recv_Buffer_Fun+Data_Len-1)<<8|*(Uart_Recv_Buffer_Fun+Data_Len-2);
  662. CRC_chk_buffer = crc_chk(Uart_Recv_Buffer_Fun,Data_Len-2);
  663. #ifdef USING_PRINTF1
  664. printf("Uart_Rece_buffer after Crc: ");
  665. for(int i=0;i<Data_Len;i++)
  666. {
  667. printf("%x ",*(Uart_Recv_Buffer_Fun+i));
  668. }
  669. printf("\tcrcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
  670. #endif
  671. if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
  672. {
  673. return Data_Len;//此处指针移位出现重启问题
  674. }
  675. else //接收数据的校验不过
  676. {
  677. USARTdrv->Uninitialize();
  678. osDelay(1000);
  679. USARTdrv->Initialize(USART_callback);
  680. USARTdrv->PowerControl(ARM_POWER_FULL);
  681. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  682. ARM_USART_DATA_BITS_8 |
  683. ARM_USART_PARITY_NONE |
  684. ARM_USART_STOP_BITS_1 |
  685. ARM_USART_FLOW_CONTROL_NONE, 9600);
  686. memset(Uart_Recv_Buffer_Fun,0xff,Data_Len);
  687. return 0;
  688. }
  689. }
  690. else
  691. {
  692. memset(Uart_Recv_Buffer_Fun,0x00,Data_Len);
  693. isRecvTimeout = false;
  694. return 0;
  695. }
  696. return 0;
  697. }
  698. /**
  699. \fn BOOL BattHeaterSwitch(UINT8* heaterSwitch)
  700. \param[in] (UINT8*) heaterSwitch: the heater switch state
  701. \brief according to the current switch state and all the cell temp, it will turn on/off the switch
  702. \return (BOOL) isNeedtoSwitch: true: need to send cmd to turn on/off the switch
  703. false: do not need to do anything
  704. */
  705. BOOL BattHeaterSwitch(UINT8* heaterSwitch)
  706. {
  707. BOOL isNeedtoSwitch = FALSE;
  708. UINT8 i =0;
  709. UINT8 currentSwitchState = 0;
  710. //get the current switch state and the cell temp
  711. currentSwitchState = battHeatEnableState&0x01;
  712. if(currentSwitchState==0) //当前状态为关闭,判断是否应该开启
  713. {
  714. if(minCellTemp<5+40 && minCellTemp>=-29+40 && maxCellTemp<25+40)//温度偏移为40
  715. {
  716. *heaterSwitch = 1;
  717. isNeedtoSwitch = true;
  718. }
  719. }
  720. else //当前状态为开启,判断是否应该关闭
  721. {
  722. if(minCellTemp>=10+40 || maxCellTemp>=30+40)
  723. {
  724. *heaterSwitch = 0;
  725. isNeedtoSwitch = true;
  726. }
  727. }
  728. return isNeedtoSwitch;
  729. }
  730. void battSOCDisplay()
  731. {
  732. static UINT8 lightTimer = 0;
  733. UINT8 socLowLEDFlashPeriod = 10;//10*100 = 1000ms
  734. UINT8 chargeLEDFlashPeriod = 6;//6*100 = 600ms
  735. float dutyRatio = 0.4;
  736. UINT8 temp;
  737. if(AppNVMData.isBattLocked == TRUE)
  738. {
  739. return;
  740. }
  741. if(UartBattInfoRecvFlag == true)
  742. {
  743. lightTimer++;
  744. if(battWorkState == 0||battWorkState == 1) //静置或放电状态
  745. {
  746. if(battSOC<=10)
  747. {
  748. if(lightTimer<(UINT8)(socLowLEDFlashPeriod*dutyRatio))
  749. {
  750. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  751. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  752. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  753. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  754. }
  755. else if(lightTimer>=(UINT8)(socLowLEDFlashPeriod*dutyRatio) && lightTimer<socLowLEDFlashPeriod)
  756. {
  757. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  758. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  759. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  760. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  761. }
  762. else
  763. {
  764. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  765. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  766. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  767. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  768. lightTimer = 0;
  769. }
  770. }
  771. else if(battSOC>10&&battSOC<=25)
  772. {
  773. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  774. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  775. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  776. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  777. lightTimer = 0;
  778. }
  779. else if(battSOC>25&&battSOC<=50)
  780. {
  781. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  782. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  783. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  784. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  785. lightTimer = 0;
  786. }
  787. else if(battSOC>50&&battSOC<=75)
  788. {
  789. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  790. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  791. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  792. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  793. lightTimer = 0;
  794. }
  795. else if(battSOC>75&&battSOC<=100)
  796. {
  797. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  798. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  799. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  800. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  801. lightTimer = 0;
  802. }
  803. }
  804. else if(battWorkState == 2)
  805. {
  806. if(battSOC<=25)
  807. {
  808. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  809. {
  810. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  811. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  812. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  813. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  814. }
  815. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  816. {
  817. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  818. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  819. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  820. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  821. }
  822. else
  823. {
  824. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  825. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  826. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  827. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  828. lightTimer = 0;
  829. }
  830. }
  831. else if(battSOC>25&&battSOC<=50)
  832. {
  833. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  834. {
  835. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  836. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  837. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  838. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  839. }
  840. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  841. {
  842. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  843. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  844. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  845. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  846. }
  847. else
  848. {
  849. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  850. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  851. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  852. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  853. lightTimer = 0;
  854. }
  855. }
  856. else if(battSOC>50&&battSOC<=75)
  857. {
  858. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  859. {
  860. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  861. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  862. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  863. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  864. }
  865. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  866. {
  867. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  868. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  869. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  870. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  871. }
  872. else
  873. {
  874. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  875. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  876. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  877. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  878. lightTimer = 0;
  879. }
  880. }
  881. else if(battSOC>75&&battSOC<=97)
  882. {
  883. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  884. {
  885. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  886. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  887. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  888. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  889. }
  890. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  891. {
  892. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  893. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  894. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  895. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  896. }
  897. else
  898. {
  899. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  900. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  901. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  902. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  903. lightTimer = 0;
  904. }
  905. }
  906. else if(battSOC>97&&battSOC<=100)
  907. {
  908. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  909. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  910. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  911. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  912. }
  913. }
  914. }
  915. }
  916. void battErrorStateDisplay()
  917. {
  918. static UINT8 errorLightTimer = 0;
  919. //static UINT32 currentTimerCount=0;
  920. UINT8 errorLEDFlashPeriod = 6;//600ms
  921. float errorDutyRatio = 0.4;
  922. if(AppNVMData.isBattLocked == TRUE)
  923. {
  924. return;
  925. }
  926. if(UartBattInfoRecvFlag == true)
  927. {
  928. errorLightTimer++;
  929. if(battWorkState == 0x02) //充电模式下,如果只有“SOC低故障”,那么就不显示故障灯 zhengchao20210713 add
  930. {
  931. if((((battWarningState >> 10) & 0x01) == 0x01) && ((battWarningState & 0xFFFFFBFF) == 0x00))
  932. return;
  933. }
  934. if(battWarningState != 0 )
  935. {
  936. if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
  937. {
  938. FaultDisplay(LED_TURN_ON);
  939. }
  940. else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
  941. {
  942. FaultDisplay(LED_TURN_OFF);
  943. }
  944. else
  945. {
  946. FaultDisplay(LED_TURN_OFF);
  947. errorLightTimer = 0;
  948. }
  949. }
  950. else
  951. {
  952. FaultDisplay(LED_TURN_OFF);
  953. errorLightTimer = 0;
  954. }
  955. }
  956. }
  957. void battWarningStateDisplay()
  958. {
  959. static UINT8 warningLightTimer = 0;
  960. //static UINT32 currentTimerCount=0;
  961. UINT8 warningLEDFlashPeriod = 6;//600ms
  962. float warningDutyRatio = 0.4;
  963. if(AppNVMData.isBattLocked == TRUE)
  964. {
  965. return;
  966. }
  967. if(UartBattInfoRecvFlag == false)
  968. {
  969. warningLightTimer++;
  970. //if(battWarningState != 0)
  971. {
  972. if(warningLightTimer<(UINT8)(warningLEDFlashPeriod*warningDutyRatio))
  973. {
  974. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  975. FaultDisplay(LED_TURN_ON);
  976. }
  977. else if(warningLightTimer>=(UINT8)(warningLEDFlashPeriod*warningDutyRatio) && warningLightTimer<warningLEDFlashPeriod)
  978. {
  979. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  980. FaultDisplay(LED_TURN_OFF);
  981. }
  982. else
  983. {
  984. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  985. FaultDisplay(LED_TURN_OFF);
  986. warningLightTimer = 0;
  987. }
  988. }
  989. }
  990. }
  991. void battLockStateDisplay(UINT8 lockState)
  992. {
  993. static UINT8 currentState = 0;
  994. static UINT8 errorLightTimer = 0;
  995. //static UINT32 currentTimerCount=0;
  996. UINT8 errorLEDFlashPeriod = 10;//1000ms
  997. float errorDutyRatio = 0.4;
  998. //printf("lockState = %d\ncurrent State = %d\n",lockState,currentState);
  999. if(lockState==0)//no error
  1000. {
  1001. if(currentState!=lockState)
  1002. {
  1003. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  1004. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  1005. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  1006. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  1007. FaultDisplay(LED_TURN_OFF);
  1008. currentState = lockState;
  1009. errorLightTimer = 0;
  1010. }
  1011. else
  1012. {
  1013. return;
  1014. }
  1015. }
  1016. else // error occurred, errorState = 1
  1017. {
  1018. if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
  1019. {
  1020. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  1021. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  1022. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  1023. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  1024. FaultDisplay(LED_TURN_ON);
  1025. }
  1026. else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
  1027. {
  1028. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  1029. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  1030. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  1031. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  1032. FaultDisplay(LED_TURN_OFF);
  1033. }
  1034. else
  1035. {
  1036. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  1037. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  1038. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  1039. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  1040. FaultDisplay(LED_TURN_OFF);
  1041. errorLightTimer = 0;
  1042. }
  1043. }
  1044. errorLightTimer++;
  1045. }
  1046. void relayControlFunc(float DutyRatio)
  1047. {
  1048. static UINT8 BuzzerTimer = 0;
  1049. UINT8 BuzzerPeriod = 5;//1000ms
  1050. BuzzerTimer++;
  1051. if(BuzzerTimer<(UINT8)(BuzzerPeriod*DutyRatio))
  1052. {
  1053. relayControl(TRUE);
  1054. }
  1055. else if(BuzzerTimer>=(UINT8)(BuzzerPeriod*DutyRatio) && BuzzerTimer<BuzzerPeriod)
  1056. {
  1057. relayControl(FALSE);
  1058. }
  1059. else
  1060. {
  1061. relayControl(FALSE);
  1062. BuzzerTimer = 0;
  1063. }
  1064. }
  1065. UINT8 decryptionAlgorithm (UINT16 cipherText)
  1066. {
  1067. UINT16 plainText = 1;
  1068. UINT16 publicKeyD = 43;
  1069. UINT16 publicKeyN = 10961;
  1070. cipherText = cipherText % publicKeyN;
  1071. while(publicKeyD >0)
  1072. {
  1073. if(publicKeyD % 2 ==1)
  1074. {
  1075. plainText = plainText * cipherText % publicKeyN;
  1076. }
  1077. publicKeyD = publicKeyD/2;
  1078. cipherText = (cipherText * cipherText) % publicKeyN;
  1079. }
  1080. return (UINT8)plainText;
  1081. }
  1082. UINT16 encryptionAlgorithm (UINT16 plainText)
  1083. {
  1084. UINT16 cipherText = 1;
  1085. UINT16 privateKeyE = 37507;
  1086. UINT16 privateKeyN = 10961;
  1087. plainText = plainText % privateKeyN;
  1088. while(privateKeyE >0)
  1089. {
  1090. if(privateKeyE % 2 ==1)
  1091. {
  1092. cipherText = ( cipherText * plainText) % privateKeyN;
  1093. }
  1094. privateKeyE = privateKeyE/2;
  1095. plainText = (plainText * plainText) % privateKeyN;
  1096. }
  1097. return cipherText;
  1098. }
  1099. UINT8 Uart_Encrypt_Send()
  1100. {
  1101. UINT8 SeedNumberArrray[4]={0x38,0x56,0xfe,0xac};
  1102. UINT16 EncodeNumberArray[4];
  1103. UINT8 UartEncryptBuffer[17];
  1104. UINT8 UartDecryptBuffer[5];
  1105. UINT16 CRC_chk_buffer;
  1106. UINT8 timeCount = 0;
  1107. UartEncryptBuffer[0] = BMS_ADDRESS_CODE;
  1108. UartEncryptBuffer[1] = UART_ENCRYPT_CODE;
  1109. UartEncryptBuffer[2] = 0x0c;
  1110. for(int i=0;i<4;i++)
  1111. {
  1112. SeedNumberArrray[i]=rand();
  1113. EncodeNumberArray[i] = encryptionAlgorithm(SeedNumberArrray[i]);
  1114. UartEncryptBuffer[i+3] = SeedNumberArrray[i];
  1115. UartEncryptBuffer[i*2+7] = EncodeNumberArray[i]>>8;
  1116. UartEncryptBuffer[i*2+8] = EncodeNumberArray[i];
  1117. }
  1118. CRC_chk_buffer = crc_chk(UartEncryptBuffer,17-2);
  1119. UartEncryptBuffer[15] = CRC_chk_buffer;
  1120. UartEncryptBuffer[16] = CRC_chk_buffer>>8;
  1121. USARTdrv->Send(UartEncryptBuffer,17);
  1122. USARTdrv->Receive(UartDecryptBuffer,5);
  1123. while((isRecvTimeout == false) && (isRecvComplete == false))
  1124. {
  1125. timeCount++;
  1126. osDelay(100);
  1127. if (timeCount>=10)
  1128. {
  1129. timeCount =0;
  1130. isRecvTimeout = true;
  1131. break;
  1132. }
  1133. }
  1134. #ifdef USING_PRINTF
  1135. printf("Uart_Rece_buffer: ");
  1136. for(int i=0;i<5;i++)
  1137. {
  1138. printf("%x ",UartDecryptBuffer[i]);
  1139. }
  1140. #endif
  1141. if (isRecvComplete == true)
  1142. {
  1143. isRecvComplete = false;
  1144. return UartDecryptBuffer[2];
  1145. }
  1146. else
  1147. {
  1148. isRecvTimeout = false;
  1149. return 0x03;
  1150. }
  1151. }
  1152. /*-----------------------------------------------------------------------------*/
  1153. void SP_BMS_Update_Service() //超力源BMS升级服务
  1154. {
  1155. UINT8 errorCount = 0;
  1156. UINT8 resetCount = 0;
  1157. UINT16 currentPackage = 0;
  1158. UINT32 updateDataTotalByteLen = 0;
  1159. UpdateStep updateStep = UPDATE_STEP_CHECK_VERSION;
  1160. UINT8 i,j,ret=0;
  1161. UINT8 dataLen = 0;
  1162. UINT8 pUpdateMsgSend[80];
  1163. UINT32 updateMsgSendLen = 0;
  1164. UINT32 currentPackageStartAddr = 0;
  1165. BMS_Update_Recv_Msg_Type pUpdateMsgRecv;
  1166. UINT8 bmsUpdateFlag = 1;
  1167. //BMS_Update_Recv_Msg_Type bmsMsg;
  1168. //static UpdateStep step = UPDATE_STEP_CHECK_VERSION;
  1169. UINT8 Cycle_conut = 0;
  1170. while(bmsUpdateFlag && Cycle_conut<2)
  1171. {
  1172. switch (updateStep)
  1173. {
  1174. case UPDATE_STEP_CHECK_VERSION:
  1175. dataLen = 0;
  1176. updateMsgSendLen = 7;
  1177. pUpdateMsgSend[0] = 0xEB; //start flag
  1178. pUpdateMsgSend[1] = 0x01; //add flag
  1179. pUpdateMsgSend[2] = 0x01; //read
  1180. pUpdateMsgSend[3] = 0x03; //data len
  1181. pUpdateMsgSend[4] = 0x90; //cmd
  1182. pUpdateMsgSend[5] = 0x93; //checksum
  1183. pUpdateMsgSend[6] = 0xF5; //end flag
  1184. //printf("updateMsgSendLen0 = %x\n",updateMsgSendLen);
  1185. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1186. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv),sizeof(BMS_Update_Recv_Msg_Type), 500);
  1187. //printf("updateMsgSendLen1 = %x\n",updateMsgSendLen);
  1188. if(ret!=0)
  1189. {
  1190. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1191. {
  1192. if(pUpdateMsgRecv.cmd == 0x90)
  1193. {
  1194. if(pUpdateMsgRecv.data != 0xFF)
  1195. {
  1196. updateStep = UPDATE_STEP_REQUEST_UPDATE;
  1197. errorCount = 0;
  1198. }
  1199. else
  1200. {
  1201. updateStep = UPDATE_STEP_SET_BAUD_RATE;
  1202. errorCount = 0;
  1203. }
  1204. }
  1205. else
  1206. {
  1207. errorCount++;
  1208. }
  1209. }
  1210. else
  1211. {
  1212. errorCount++;
  1213. }
  1214. }
  1215. else
  1216. {
  1217. errorCount++;
  1218. }
  1219. #ifdef USING_PRINTF1
  1220. //printf("update step:%d\n",updateStep);
  1221. printf("query:");
  1222. for(j=0;j<updateMsgSendLen;j++)
  1223. {
  1224. printf("%x ",pUpdateMsgSend[j]);
  1225. }
  1226. printf("\nanswer:");
  1227. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1228. {
  1229. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1230. }
  1231. printf("\n");
  1232. printf("next update step:%d\n",updateStep);
  1233. #endif
  1234. if(errorCount>10)
  1235. {
  1236. updateStep = UPDATE_STEP_RESET;
  1237. errorCount = 0;
  1238. }
  1239. osDelay(50);
  1240. break;
  1241. case UPDATE_STEP_REQUEST_UPDATE:
  1242. dataLen = 1;
  1243. updateMsgSendLen = 8;
  1244. pUpdateMsgSend[0] = 0xEB; //start flag
  1245. pUpdateMsgSend[1] = 0x01; //add flag
  1246. pUpdateMsgSend[2] = 0x00; //write
  1247. pUpdateMsgSend[3] = 0x04; //data len
  1248. pUpdateMsgSend[4] = 0x80; //cmd
  1249. pUpdateMsgSend[5] = 0x22; //data
  1250. pUpdateMsgSend[6] = 0xA6; //check
  1251. pUpdateMsgSend[7] = 0xF5; //end flag
  1252. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1253. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1254. if(ret!=0)
  1255. {
  1256. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1257. {
  1258. if(pUpdateMsgRecv.cmd == 0x80)
  1259. {
  1260. if(pUpdateMsgRecv.data == 0x33)
  1261. {
  1262. updateStep = UPDATE_STEP_START_UPDATE;
  1263. errorCount = 0;
  1264. }
  1265. else
  1266. {
  1267. errorCount++;
  1268. }
  1269. }
  1270. else
  1271. {
  1272. errorCount++;
  1273. }
  1274. }
  1275. else
  1276. {
  1277. errorCount++;
  1278. }
  1279. }
  1280. else
  1281. {
  1282. errorCount++;
  1283. }
  1284. if(errorCount>10)
  1285. {
  1286. updateStep = UPDATE_STEP_RESET;
  1287. errorCount = 0;
  1288. }
  1289. #ifdef USING_PRINTF1
  1290. printf("update step:%d\n",updateStep);
  1291. printf("query:");
  1292. for(j=0;j<updateMsgSendLen;j++)
  1293. {
  1294. printf("%x ",pUpdateMsgSend[j]);
  1295. }
  1296. printf("\nanswer:");
  1297. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1298. {
  1299. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1300. }
  1301. printf("\n");
  1302. printf("next update step:%d\n",updateStep);
  1303. #endif
  1304. osDelay(50);
  1305. break;
  1306. case UPDATE_STEP_START_UPDATE:
  1307. dataLen = 1;
  1308. updateMsgSendLen = 8;
  1309. pUpdateMsgSend[0] = 0xEB; //start flag
  1310. pUpdateMsgSend[1] = 0x01; //add flag
  1311. pUpdateMsgSend[2] = 0x00; //write
  1312. pUpdateMsgSend[3] = 0x04; //data len
  1313. pUpdateMsgSend[4] = 0x80; //cmd
  1314. pUpdateMsgSend[5] = 0x55; //data
  1315. pUpdateMsgSend[6] = 0xD9; //check
  1316. pUpdateMsgSend[7] = 0xF5; //end flag
  1317. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1318. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1319. //updateStep = UPDATE_STEP_SET_BAUD_RATE;
  1320. updateStep = UPDATE_STEP_CHECK_VERSION_AGAIN;//2021-04-09跳过波特率设置
  1321. #ifdef USING_PRINTF1
  1322. printf("query:");
  1323. for(j=0;j<updateMsgSendLen;j++)
  1324. {
  1325. printf("%x ",pUpdateMsgSend[j]);
  1326. }
  1327. printf("\nanswer:");
  1328. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1329. {
  1330. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1331. }
  1332. printf("\n");
  1333. printf("next update step:%d\n",updateStep);
  1334. #endif
  1335. break;
  1336. case UPDATE_STEP_CHECK_VERSION_AGAIN:
  1337. dataLen = 0;
  1338. updateMsgSendLen = 7;
  1339. pUpdateMsgSend[0] = 0xEB; //start flag
  1340. pUpdateMsgSend[1] = 0x01; //add flag
  1341. pUpdateMsgSend[2] = 0x01; //read
  1342. pUpdateMsgSend[3] = 0x03; //data len
  1343. pUpdateMsgSend[4] = 0x90; //cmd
  1344. pUpdateMsgSend[5] = 0x93; //checksum
  1345. pUpdateMsgSend[6] = 0xF5; //end flag
  1346. //printf("updateMsgSendLen0 = %x\n",updateMsgSendLen);
  1347. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1348. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv),sizeof(BMS_Update_Recv_Msg_Type), 100);
  1349. //printf("updateMsgSendLen1 = %x\n",updateMsgSendLen);
  1350. if(ret!=0)
  1351. {
  1352. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1353. {
  1354. if(pUpdateMsgRecv.cmd == 0x90)
  1355. {
  1356. if(pUpdateMsgRecv.data != 0xFF)
  1357. {
  1358. updateStep = UPDATE_STEP_RESET;
  1359. errorCount = 0;
  1360. }
  1361. else
  1362. {
  1363. updateStep = UPDATE_STEP_SET_BAUD_RATE;
  1364. errorCount = 0;
  1365. }
  1366. }
  1367. else
  1368. {
  1369. errorCount++;
  1370. }
  1371. }
  1372. else
  1373. {
  1374. errorCount++;
  1375. }
  1376. }
  1377. else
  1378. {
  1379. errorCount++;
  1380. }
  1381. #ifdef USING_PRINTF1
  1382. //printf("update step:%d\n",updateStep);
  1383. printf("query:");
  1384. for(j=0;j<updateMsgSendLen;j++)
  1385. {
  1386. printf("%x ",pUpdateMsgSend[j]);
  1387. }
  1388. printf("\nanswer:");
  1389. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1390. {
  1391. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1392. }
  1393. printf("\n");
  1394. printf("next update step:%d\n",updateStep);
  1395. #endif
  1396. if(errorCount>10)
  1397. {
  1398. updateStep = UPDATE_STEP_RESET;
  1399. errorCount = 0;
  1400. }
  1401. osDelay(50);
  1402. break;
  1403. case UPDATE_STEP_SET_BAUD_RATE:
  1404. printf("start step %d\n",updateStep);
  1405. dataLen = 4;
  1406. updateMsgSendLen = 12;
  1407. pUpdateMsgSend[0] = 0xEB; //start flag
  1408. pUpdateMsgSend[1] = 0x01; //add flag
  1409. pUpdateMsgSend[2] = 0x00; //write
  1410. pUpdateMsgSend[3] = 0x08; //data len
  1411. pUpdateMsgSend[4] = 0x81; //cmd
  1412. pUpdateMsgSend[5] = 0x33; //data
  1413. pUpdateMsgSend[6] = 0x00; //baud rate:9600
  1414. pUpdateMsgSend[7] = 0x00;
  1415. pUpdateMsgSend[8] = 0x25;
  1416. pUpdateMsgSend[9] = 0x80;
  1417. pUpdateMsgSend[10] = 0x61; //check
  1418. pUpdateMsgSend[11] = 0xF5; //end flag
  1419. #ifdef USING_PRINTF1
  1420. printf("query:");
  1421. for(j=0;j<updateMsgSendLen;j++)
  1422. {
  1423. printf("%x ",pUpdateMsgSend[j]);
  1424. }
  1425. printf("\n");
  1426. #endif
  1427. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1428. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1429. printf("ret = %d\n",ret);
  1430. if(ret!=0)
  1431. {
  1432. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1433. {
  1434. if(pUpdateMsgRecv.cmd == 0x81)
  1435. {
  1436. if(pUpdateMsgRecv.data == 0x11)
  1437. {
  1438. updateStep = UPDATE_STEP_PREPARE_SEND_DATA_LEN;
  1439. errorCount = 0;
  1440. }
  1441. else
  1442. {
  1443. errorCount++;
  1444. }
  1445. }
  1446. else
  1447. {
  1448. errorCount++;
  1449. }
  1450. }
  1451. else
  1452. {
  1453. errorCount++;
  1454. }
  1455. }
  1456. else
  1457. {
  1458. errorCount++;
  1459. }
  1460. if(errorCount>10)
  1461. {
  1462. updateStep = UPDATE_STEP_RESET;
  1463. errorCount = 0;
  1464. }
  1465. #ifdef USING_PRINTF1
  1466. //printf("update step:%d\n",updateStep);
  1467. printf("query:");
  1468. for(j=0;j<updateMsgSendLen;j++)
  1469. {
  1470. printf("%x ",pUpdateMsgSend[j]);
  1471. }
  1472. printf("\nanswer:");
  1473. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1474. {
  1475. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1476. }
  1477. printf("\n");
  1478. printf("next update step:%d\n",updateStep);
  1479. #endif
  1480. osDelay(50);
  1481. break;
  1482. case UPDATE_STEP_PREPARE_SEND_DATA_LEN:
  1483. printf("start step %d\n",updateStep);
  1484. dataLen = 1;
  1485. updateMsgSendLen = 8;
  1486. pUpdateMsgSend[0] = 0xEB; //start flag
  1487. pUpdateMsgSend[1] = 0x01; //add flag
  1488. pUpdateMsgSend[2] = 0x00; //write
  1489. pUpdateMsgSend[3] = 0x04; //data len
  1490. pUpdateMsgSend[4] = 0x81; //cmd
  1491. pUpdateMsgSend[5] = 0x44; //data
  1492. pUpdateMsgSend[6] = 0xC9; //check
  1493. pUpdateMsgSend[7] = 0xF5; //end flag
  1494. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1495. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1496. if(ret!=0)
  1497. {
  1498. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1499. {
  1500. if(pUpdateMsgRecv.cmd == 0x81)
  1501. {
  1502. if(pUpdateMsgRecv.data == 0x11)
  1503. {
  1504. updateStep = UPDATE_STEP_SEND_DATA_LEN;
  1505. errorCount = 0;
  1506. }
  1507. else
  1508. {
  1509. errorCount++;
  1510. }
  1511. }
  1512. else
  1513. {
  1514. errorCount++;
  1515. }
  1516. }
  1517. else
  1518. {
  1519. errorCount++;
  1520. }
  1521. }
  1522. else
  1523. {
  1524. errorCount++;
  1525. }
  1526. if(errorCount>10)
  1527. {
  1528. updateStep = UPDATE_STEP_RESET;
  1529. errorCount = 0;
  1530. }
  1531. #ifdef USING_PRINTF1
  1532. //printf("update step:%d\n",updateStep);
  1533. printf("query:");
  1534. for(j=0;j<updateMsgSendLen;j++)
  1535. {
  1536. printf("%x ",pUpdateMsgSend[j]);
  1537. }
  1538. printf("\nanswer:");
  1539. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1540. {
  1541. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1542. }
  1543. printf("\n");
  1544. printf("next update step:%d\n",updateStep);
  1545. #endif
  1546. osDelay(50);
  1547. break;
  1548. case UPDATE_STEP_SEND_DATA_LEN:
  1549. dataLen = 4;
  1550. BSP_QSPI_Read_Safe(&updateDataTotalByteLen,FLASH_BMS_FOTA_START_ADDR,4);
  1551. updateDataTotalByteLen = (((updateDataTotalByteLen)&0xFF)<<24)|(((updateDataTotalByteLen>>8)&0xFF)<<16)|(((updateDataTotalByteLen>>16)&0xFF)<<8)|(((updateDataTotalByteLen>>24)&0xFF));
  1552. updateMsgSendLen = 11;
  1553. pUpdateMsgSend[0] = 0xEB; //start flag
  1554. pUpdateMsgSend[1] = 0x01; //add flag
  1555. pUpdateMsgSend[2] = 0x00; //write
  1556. pUpdateMsgSend[3] = 0x07; //data len
  1557. pUpdateMsgSend[4] = 0x82; //cmd
  1558. pUpdateMsgSend[5] = (updateDataTotalByteLen>>24)&0xFF; //data: package byte len
  1559. pUpdateMsgSend[6] = (updateDataTotalByteLen>>16)&0xFF;
  1560. pUpdateMsgSend[7] = (updateDataTotalByteLen>>8)&0xFF;
  1561. pUpdateMsgSend[8] = (updateDataTotalByteLen)&0xFF;
  1562. pUpdateMsgSend[9] = SP_BMS_Update_CheckSUM(&pUpdateMsgSend[3], dataLen+2); //check sum
  1563. pUpdateMsgSend[10] = 0xF5; //end flag
  1564. memset((UINT8*)(&pUpdateMsgRecv),0,sizeof(BMS_Update_Recv_Msg_Type));
  1565. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1566. if(ret!=0)
  1567. {
  1568. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1569. {
  1570. if(pUpdateMsgRecv.cmd == 0x81)
  1571. {
  1572. if(pUpdateMsgRecv.data == 0x11)
  1573. {
  1574. updateStep = UPDATE_STEP_PREPARE_SEND_UPDATE_DATA;
  1575. errorCount = 0;
  1576. }
  1577. else
  1578. {
  1579. errorCount++;
  1580. }
  1581. }
  1582. else
  1583. {
  1584. errorCount++;
  1585. }
  1586. }
  1587. else
  1588. {
  1589. errorCount++;
  1590. }
  1591. }
  1592. else
  1593. {
  1594. errorCount++;
  1595. }
  1596. if(errorCount>10)
  1597. {
  1598. updateStep = UPDATE_STEP_RESET;
  1599. errorCount = 0;
  1600. }
  1601. #ifdef USING_PRINTF1
  1602. //printf("update step:%d\n",updateStep);
  1603. printf("query:");
  1604. for(j=0;j<updateMsgSendLen;j++)
  1605. {
  1606. printf("%x ",pUpdateMsgSend[j]);
  1607. }
  1608. printf("\nanswer:");
  1609. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1610. {
  1611. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1612. }
  1613. printf("\n");
  1614. printf("next update step:%d\n",updateStep);
  1615. #endif
  1616. osDelay(50);
  1617. break;
  1618. case UPDATE_STEP_PREPARE_SEND_UPDATE_DATA:
  1619. dataLen = 1;
  1620. updateMsgSendLen = 8;
  1621. pUpdateMsgSend[0] = 0xEB; //start flag
  1622. pUpdateMsgSend[1] = 0x01; //add flag
  1623. pUpdateMsgSend[2] = 0x00; //write
  1624. pUpdateMsgSend[3] = 0x04; //data len
  1625. pUpdateMsgSend[4] = 0x81; //cmd
  1626. pUpdateMsgSend[5] = 0x55; //data
  1627. pUpdateMsgSend[6] = 0xDA; //check
  1628. pUpdateMsgSend[7] = 0xF5; //end flag
  1629. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1630. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen,(UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1631. if(ret!=0)
  1632. {
  1633. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1634. {
  1635. if(pUpdateMsgRecv.cmd == 0x81)
  1636. {
  1637. if(pUpdateMsgRecv.data == 0x11)
  1638. {
  1639. updateStep = UPDATE_STEP_SEND_UPDATE_DATA;
  1640. errorCount = 0;
  1641. }
  1642. else
  1643. {
  1644. errorCount++;
  1645. }
  1646. }
  1647. else
  1648. {
  1649. errorCount++;
  1650. }
  1651. }
  1652. else
  1653. {
  1654. errorCount++;
  1655. }
  1656. }
  1657. else
  1658. {
  1659. errorCount++;
  1660. }
  1661. if(errorCount>10)
  1662. {
  1663. updateStep = UPDATE_STEP_RESET;
  1664. errorCount = 0;
  1665. }
  1666. #ifdef USING_PRINTF1
  1667. //printf("update step:%d\n",updateStep);
  1668. printf("query:");
  1669. for(j=0;j<updateMsgSendLen;j++)
  1670. {
  1671. printf("%x ",pUpdateMsgSend[j]);
  1672. }
  1673. printf("\nanswer:");
  1674. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1675. {
  1676. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1677. }
  1678. printf("\n");
  1679. printf("next update step:%d\n",updateStep);
  1680. #endif
  1681. osDelay(50);
  1682. break;
  1683. case UPDATE_STEP_SEND_UPDATE_DATA:
  1684. dataLen = 64;
  1685. updateMsgSendLen = 75;
  1686. for(currentPackage=0;currentPackage<updateDataTotalByteLen/64;currentPackage++)
  1687. {
  1688. currentPackageStartAddr = currentPackage*64;
  1689. pUpdateMsgSend[0] = 0xEB; //start flag
  1690. pUpdateMsgSend[1] = 0x01; //add flag
  1691. pUpdateMsgSend[2] = 0x00; //write
  1692. pUpdateMsgSend[3] = 0x47; //data len
  1693. pUpdateMsgSend[4] = 0x82; //cmd
  1694. pUpdateMsgSend[5] = (currentPackageStartAddr>>24)&0xFF;
  1695. pUpdateMsgSend[6] = (currentPackageStartAddr>>16)&0xFF;
  1696. pUpdateMsgSend[7] = (currentPackageStartAddr>>8)&0xFF;
  1697. pUpdateMsgSend[8] = currentPackageStartAddr&0xFF;
  1698. BSP_QSPI_Read_Safe(&pUpdateMsgSend[9], FLASH_BMS_FOTA_START_ADDR+4+currentPackage*dataLen, dataLen); //data
  1699. pUpdateMsgSend[8+dataLen+1] = SP_BMS_Update_CheckSUM(&pUpdateMsgSend[3], dataLen+6); //check sum
  1700. pUpdateMsgSend[8+dataLen+2] = 0xF5; //end flag
  1701. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1702. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1703. if(ret!=0)
  1704. {
  1705. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1706. {
  1707. if(pUpdateMsgRecv.cmd == 0x81)
  1708. {
  1709. if(pUpdateMsgRecv.data == 0x11)
  1710. {
  1711. if(currentPackage+1 == updateDataTotalByteLen/64)
  1712. {
  1713. updateStep = UPDATE_STEP_SEND_DATA_END;
  1714. }
  1715. errorCount = 0;
  1716. }
  1717. else
  1718. {
  1719. errorCount++;
  1720. }
  1721. }
  1722. else
  1723. {
  1724. errorCount++;
  1725. }
  1726. }
  1727. else
  1728. {
  1729. errorCount++;
  1730. }
  1731. }
  1732. else
  1733. {
  1734. errorCount++;
  1735. }
  1736. if(errorCount>10)
  1737. {
  1738. updateStep = UPDATE_STEP_RESET;
  1739. errorCount = 0;
  1740. break;
  1741. }
  1742. #ifdef USING_PRINTF1
  1743. //printf("update step:%d\n",updateStep);
  1744. printf("query:");
  1745. for(j=0;j<updateMsgSendLen;j++)
  1746. {
  1747. printf("%x ",pUpdateMsgSend[j]);
  1748. }
  1749. printf("\nanswer:");
  1750. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1751. {
  1752. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1753. }
  1754. printf("\n");
  1755. printf("next update step:%d\n",updateStep);
  1756. #endif
  1757. }
  1758. osDelay(50);
  1759. break;
  1760. case UPDATE_STEP_SEND_DATA_END:
  1761. dataLen = 1;
  1762. updateMsgSendLen = 8;
  1763. pUpdateMsgSend[0] = 0xEB; //start flag
  1764. pUpdateMsgSend[1] = 0x01; //add flag
  1765. pUpdateMsgSend[2] = 0x00; //write
  1766. pUpdateMsgSend[3] = 0x04; //data len
  1767. pUpdateMsgSend[4] = 0x81; //cmd
  1768. pUpdateMsgSend[5] = 0x66; //data
  1769. pUpdateMsgSend[6] = 0xEB; //check
  1770. pUpdateMsgSend[7] = 0xF5; //end flag
  1771. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1772. ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
  1773. if(ret!=0)
  1774. {
  1775. if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
  1776. {
  1777. if(pUpdateMsgRecv.cmd == 0x81)
  1778. {
  1779. if(pUpdateMsgRecv.data == 0x11)
  1780. {
  1781. updateStep = UPDATE_STEP_START_INSTALL;
  1782. errorCount = 0;
  1783. }
  1784. else
  1785. {
  1786. errorCount++;
  1787. }
  1788. }
  1789. else
  1790. {
  1791. errorCount++;
  1792. }
  1793. }
  1794. else
  1795. {
  1796. errorCount++;
  1797. }
  1798. }
  1799. else
  1800. {
  1801. errorCount++;
  1802. }
  1803. if(errorCount>10)
  1804. {
  1805. updateStep = UPDATE_STEP_RESET;
  1806. errorCount = 0;
  1807. }
  1808. #ifdef USING_PRINTF1
  1809. //printf("update step:%d\n",updateStep);
  1810. printf("query:");
  1811. for(j=0;j<updateMsgSendLen;j++)
  1812. {
  1813. printf("%x ",pUpdateMsgSend[j]);
  1814. }
  1815. printf("\nanswer:");
  1816. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1817. {
  1818. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1819. }
  1820. printf("\n");
  1821. printf("next update step:%d\n",updateStep);
  1822. #endif
  1823. osDelay(50);
  1824. break;
  1825. case UPDATE_STEP_START_INSTALL:
  1826. dataLen = 1;
  1827. updateMsgSendLen = 8;
  1828. pUpdateMsgSend[0] = 0xEB; //start flag
  1829. pUpdateMsgSend[1] = 0x01; //add flag
  1830. pUpdateMsgSend[2] = 0x00; //write
  1831. pUpdateMsgSend[3] = 0x04; //data len
  1832. pUpdateMsgSend[4] = 0x81; //cmd
  1833. pUpdateMsgSend[5] = 0x99; //data
  1834. pUpdateMsgSend[6] = 0x1E; //check
  1835. pUpdateMsgSend[7] = 0xF5; //end flag
  1836. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1837. SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1838. updateStep = UPDATE_STEP_END;
  1839. #ifdef USING_PRINTF1
  1840. //printf("update step:%d\n",updateStep);
  1841. printf("query:");
  1842. for(j=0;j<updateMsgSendLen;j++)
  1843. {
  1844. printf("%x ",pUpdateMsgSend[j]);
  1845. }
  1846. printf("\nanswer:");
  1847. for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
  1848. {
  1849. printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
  1850. }
  1851. printf("\n");
  1852. printf("next update step:%d\n",updateStep);
  1853. #endif
  1854. osDelay(50);
  1855. break;
  1856. case UPDATE_STEP_END:
  1857. updateStep = UPDATE_STEP_CHECK_VERSION;
  1858. printf("update end\n");
  1859. bmsUpdateFlag = 0;
  1860. break;
  1861. case UPDATE_STEP_RESET:
  1862. dataLen = 1;
  1863. updateMsgSendLen = 8;
  1864. pUpdateMsgSend[0] = 0xEB; //start flag
  1865. pUpdateMsgSend[1] = 0x01; //add flag
  1866. pUpdateMsgSend[2] = 0x00; //write
  1867. pUpdateMsgSend[3] = 0x04; //data len
  1868. pUpdateMsgSend[4] = 0x81; //cmd
  1869. pUpdateMsgSend[5] = 0xAA; //data
  1870. pUpdateMsgSend[6] = 0x2F; //check
  1871. pUpdateMsgSend[7] = 0xF5; //end flag
  1872. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1873. SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1874. osDelay(50);
  1875. resetCount++;
  1876. if(resetCount>=2)
  1877. {
  1878. updateStep = UPDATE_STEP_DOWNLOAD_BREAK_OFF;
  1879. resetCount = 0;
  1880. }
  1881. else
  1882. {
  1883. updateStep = UPDATE_STEP_PREPARE_SEND_DATA_LEN;
  1884. }
  1885. #ifdef USING_PRINTF
  1886. printf("update error!!\n rest and start send data lenth again!!\n continue update!\n");
  1887. #endif
  1888. break;
  1889. case UPDATE_STEP_DOWNLOAD_BREAK_OFF:
  1890. dataLen = 1;
  1891. updateMsgSendLen = 8;
  1892. pUpdateMsgSend[0] = 0xEB; //start flag
  1893. pUpdateMsgSend[1] = 0x01; //add flag
  1894. pUpdateMsgSend[2] = 0x00; //write
  1895. pUpdateMsgSend[3] = 0x04; //data len
  1896. pUpdateMsgSend[4] = 0x81; //cmd
  1897. pUpdateMsgSend[5] = 0xBB; //data
  1898. pUpdateMsgSend[6] = 0x40; //check
  1899. pUpdateMsgSend[7] = 0xF5; //end flag
  1900. memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
  1901. SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
  1902. osDelay(50);
  1903. updateStep = UPDATE_STEP_CHECK_VERSION;
  1904. Cycle_conut++;
  1905. break;
  1906. case UPDATE_STEP_ERROR:
  1907. updateStep = UPDATE_STEP_CHECK_VERSION;
  1908. printf("update error end\n");
  1909. bmsUpdateFlag = 0;
  1910. break;
  1911. default:
  1912. updateStep = UPDATE_STEP_CHECK_VERSION;
  1913. printf("update default end\n");
  1914. bmsUpdateFlag = 0;
  1915. break;
  1916. }
  1917. }
  1918. }
  1919. UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout)
  1920. {
  1921. UINT8 timeCount = 0;
  1922. UINT8 j=0;
  1923. USARTdrv->Send(pSend,sendLen);
  1924. #ifdef USING_PRINTF
  1925. printf("query in:");
  1926. for(j=0;j<sendLen;j++)
  1927. {
  1928. printf("%x ",*(pSend+j));
  1929. }
  1930. printf("\n");
  1931. #endif
  1932. if(readLen>0)
  1933. {
  1934. USARTdrv->Receive(pRead,readLen);
  1935. while((isRecvTimeout == false) && (isRecvComplete == false))
  1936. {
  1937. timeCount++;
  1938. osDelay(100);
  1939. if (timeCount>=timeout/100)
  1940. {
  1941. timeCount =0;
  1942. isRecvTimeout = true;
  1943. break;
  1944. }
  1945. }
  1946. #ifdef USING_PRINTF
  1947. printf("\nanswer in:");
  1948. for(j=0;j<readLen;j++)
  1949. {
  1950. printf("%x ",*(pRead+j));
  1951. }
  1952. printf("\n");
  1953. #endif
  1954. if (isRecvComplete == true)
  1955. {
  1956. isRecvComplete = false;
  1957. if(*(pRead+0)!=0xEB)
  1958. {
  1959. USARTdrv->Uninitialize();
  1960. osDelay(100);
  1961. USARTdrv->Initialize(USART_callback);
  1962. USARTdrv->PowerControl(ARM_POWER_FULL);
  1963. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  1964. ARM_USART_DATA_BITS_8 |
  1965. ARM_USART_PARITY_NONE |
  1966. ARM_USART_STOP_BITS_1 |
  1967. ARM_USART_FLOW_CONTROL_NONE, 9600);
  1968. #ifdef USING_PRINTF
  1969. printf("\nuart reset in \n");
  1970. #endif
  1971. return 0;
  1972. }
  1973. return readLen;
  1974. }
  1975. else
  1976. {
  1977. memset(pRead,0x00,readLen);
  1978. isRecvTimeout = false;
  1979. return 0;
  1980. }
  1981. }
  1982. else
  1983. {
  1984. return 1;
  1985. }
  1986. }
  1987. UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len)
  1988. {
  1989. UINT8 ret = 0;
  1990. UINT8 i=0;
  1991. for(i=0;i<len;i++)
  1992. {
  1993. ret +=*(pSendData+i);
  1994. }
  1995. return ret&0xFF;
  1996. }
  1997. //________________________________________________________________________________
  1998. updateBMSStatus MS_BMS_Update_Service() //美顺BMS升级服务
  1999. {
  2000. #ifdef USING_PRINTF
  2001. UINT8 ii = 0;
  2002. #endif
  2003. UINT8 errorCount = 0;
  2004. UINT16 currentPackage = 0;
  2005. UINT32 updateDataTotalByteLen = 0;
  2006. UINT16 updateDataPackageCount = 0;
  2007. UINT8 ReadNVMTemp[64];
  2008. UpdateStep_MS_BMS updateStep = MS_UPDATE_STEP_SEND_FIRMWARE_UPDATE_REQUEST_AND_JUMP_TO_BOOTLOADER;
  2009. UINT16 i,j=0;
  2010. UINT8 dataLen = 0;
  2011. UINT8 ret0 = 0;
  2012. updateBMSStatus ret = updateFailed;
  2013. UINT8 pUpdateMsgSend[80];
  2014. UINT32 updateMsgSendLen = 0;
  2015. UINT32 updateMsgReadLen = 0;
  2016. BOOL bmsUpdateFlag = TRUE;
  2017. UINT8 bmsAnswerMsg[8];
  2018. //static UpdateStep step = UPDATE_STEP_CHECK_VERSION;
  2019. UINT8 Cycle_conut = 0;
  2020. UINT16 CRCtemp = 0;
  2021. UINT8 headerLen = 5;
  2022. UINT8 checkSum = 0x00;
  2023. UINT8 checkSumCal = 0x00;
  2024. UINT8 tempLen = 0x00;
  2025. BSP_QSPI_Read_Safe(&checkSum,FLASH_BMS_FOTA_START_ADDR,1);
  2026. memset(ReadNVMTemp, 0, 64);
  2027. BSP_QSPI_Read_Safe(ReadNVMTemp, FLASH_BMS_FOTA_START_ADDR+1, 4); //data
  2028. updateDataTotalByteLen = ((ReadNVMTemp[0]<<24)&0xFF000000) | ((ReadNVMTemp[1]<<16)&0xFF0000) | ((ReadNVMTemp[2]<<8)&0xFF00) | (ReadNVMTemp[3]&0xFF) ;
  2029. updateDataPackageCount = (updateDataTotalByteLen+(64-1))/64; //进一法 e = (a+(b-1))/b
  2030. for(i=0; i<((updateDataTotalByteLen+4)+(64-1))/64;i++)
  2031. {
  2032. memset(ReadNVMTemp, 0, 64);
  2033. if((i+1)*64 < (updateDataTotalByteLen+4))
  2034. {
  2035. tempLen = 64;
  2036. BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+1+i*64,64);
  2037. }
  2038. else
  2039. {
  2040. tempLen = (updateDataTotalByteLen+4) - i*64;
  2041. BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+1+i*64,tempLen);
  2042. }
  2043. for(j = 0; j< tempLen; j++)
  2044. {
  2045. checkSumCal = (checkSumCal + ReadNVMTemp[j]) & 0xFF;
  2046. }
  2047. //osDelay(10);
  2048. }
  2049. if(checkSum != checkSumCal)
  2050. {
  2051. #ifdef USING_PRINTF
  2052. printf("checksum error: checksum = %x, checksumCal = %x\n",checkSum,checkSumCal);
  2053. #endif
  2054. ret = updateErrorCheckSumError;
  2055. return ret;
  2056. }
  2057. else
  2058. {
  2059. #ifdef USING_PRINTF
  2060. printf("checksum OK: checksum = %x, checksumCal = %x\n",checkSum,checkSumCal);
  2061. #endif
  2062. }
  2063. #ifdef USING_PRINTF
  2064. printf(" bmsUpdateFlag = %x, Cycle_conut = %x\n",bmsUpdateFlag,Cycle_conut);
  2065. #endif
  2066. while(bmsUpdateFlag && Cycle_conut<2)
  2067. {
  2068. #ifdef USING_PRINTF
  2069. printf("update ms bms step %d\n:",updateStep);
  2070. #endif
  2071. switch (updateStep)
  2072. {
  2073. case MS_UPDATE_STEP_SEND_FIRMWARE_UPDATE_REQUEST_AND_JUMP_TO_BOOTLOADER: //0x01
  2074. dataLen = 0x00;
  2075. updateMsgSendLen = 6+dataLen;
  2076. updateMsgReadLen = 8;
  2077. pUpdateMsgSend[0] = 0x01; //node byte
  2078. pUpdateMsgSend[1] = 0x40; //func byte
  2079. pUpdateMsgSend[2] = updateStep; //cmd byte
  2080. pUpdateMsgSend[3] = dataLen; //data len
  2081. //no data type
  2082. CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4);
  2083. pUpdateMsgSend[4] = (CRCtemp>>8)&0xFF; // CRC High
  2084. pUpdateMsgSend[5] = CRCtemp&0xFF; //CRC Low
  2085. memset((UINT8*)(bmsAnswerMsg) , 0, 8);
  2086. ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
  2087. #ifdef USING_PRINTF
  2088. printf("update step 1 answer,updateMsgReadLen = %x:\n",updateMsgReadLen);
  2089. for(ii=0;ii<updateMsgReadLen;ii++)
  2090. printf("%x ",bmsAnswerMsg[ii]);
  2091. printf("\nret0 = %d",ret0);
  2092. printf("\n");
  2093. #endif
  2094. if(ret0!=0)
  2095. {
  2096. if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40) // node and func byte
  2097. {
  2098. if(bmsAnswerMsg[2] == MS_UPDATE_STEP_FIRMWARE_UPDATE_REQUEST_ANSWER && bmsAnswerMsg[3] == 0x02) //answer cmd byte:0x02, answer data len:0x02
  2099. {
  2100. if(bmsAnswerMsg[4] == 0x00) //answer data byte1
  2101. {
  2102. if(bmsAnswerMsg[5] == 0x00) //answer data byte2
  2103. {
  2104. updateStep = MS_UPDATE_STEP_SEND_FIRMWARE_INFO;
  2105. errorCount = 0;
  2106. }
  2107. }
  2108. else if(bmsAnswerMsg[4] == 0x01) //不允许升级
  2109. {
  2110. if(bmsAnswerMsg[5] == 0x01)//电量过低
  2111. {
  2112. updateStep = MS_UPDATE_STEP_ERROR;
  2113. ret = updateErrorBMSPowerLow;
  2114. }
  2115. else if(bmsAnswerMsg[5] == 0x02)//电池存在保护状态不允许升级
  2116. {
  2117. updateStep = MS_UPDATE_STEP_ERROR;
  2118. ret = updateErrorBMSWarningProtect;
  2119. }
  2120. else if(bmsAnswerMsg[5] == 0x03) //不支持升级
  2121. {
  2122. updateStep = MS_UPDATE_STEP_ERROR;
  2123. ret = updateErrorBMSNotSurport;
  2124. }
  2125. else if(bmsAnswerMsg[5] == 0x04) //当前电池处于充放电状态
  2126. {
  2127. updateStep = MS_UPDATE_STEP_ERROR;
  2128. ret = updateErrorBMSWorkState;
  2129. }
  2130. else
  2131. {
  2132. errorCount++;
  2133. }
  2134. }
  2135. }
  2136. else
  2137. {
  2138. errorCount++;
  2139. }
  2140. }
  2141. else
  2142. {
  2143. errorCount++;
  2144. }
  2145. }
  2146. else
  2147. {
  2148. errorCount++;
  2149. }
  2150. if(errorCount>10)
  2151. {
  2152. updateStep = MS_UPDATE_STEP_ERROR;
  2153. errorCount = 0;
  2154. }
  2155. osDelay(50);
  2156. printf(" step 1 ret = %d\n",ret);
  2157. break;
  2158. case MS_UPDATE_STEP_SEND_FIRMWARE_INFO: //0x03
  2159. dataLen = 52;
  2160. updateMsgSendLen = 6+dataLen;
  2161. updateMsgReadLen = 7;
  2162. pUpdateMsgSend[0] = 0x01; //node byte
  2163. pUpdateMsgSend[1] = 0x40; //func byte
  2164. pUpdateMsgSend[2] = updateStep; //cmd byte
  2165. pUpdateMsgSend[3] = dataLen; //data len
  2166. memset(ReadNVMTemp, 0, 64);
  2167. BSP_QSPI_Read_Safe(ReadNVMTemp, FLASH_BMS_FOTA_START_ADDR+headerLen, 16); //data
  2168. MEMCPY(&pUpdateMsgSend[4], ReadNVMTemp, 16); //厂家信息,未开启校验
  2169. MEMCPY(&pUpdateMsgSend[4+16], ReadNVMTemp, 16); //保护板硬件序列号,未开启校验
  2170. pUpdateMsgSend[4+16*2 + 0] = (updateDataTotalByteLen>>24)&0xFF; //固件包大小
  2171. pUpdateMsgSend[4+16*2 + 1] = (updateDataTotalByteLen>>16)&0xFF;
  2172. pUpdateMsgSend[4+16*2 + 2] = (updateDataTotalByteLen>>8)&0xFF;
  2173. pUpdateMsgSend[4+16*2 + 3] = (updateDataTotalByteLen)&0xFF;
  2174. MEMCPY(&pUpdateMsgSend[4+16*2+4], ReadNVMTemp, 16); // 固件包头信息,未开启校验
  2175. CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4+dataLen);
  2176. pUpdateMsgSend[4+dataLen] = (CRCtemp>>8)&0xFF; // CRC High
  2177. pUpdateMsgSend[5+dataLen] = CRCtemp&0xFF; //CRC Low
  2178. memset((UINT8*)(bmsAnswerMsg) , 0, 8);
  2179. ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
  2180. #ifdef USING_PRINTF
  2181. printf("update step 3 answer:\n");
  2182. for(ii=0;ii<updateMsgReadLen;ii++)
  2183. printf("%x ",bmsAnswerMsg[ii]);
  2184. printf("\nret0 = %d",ret0);
  2185. printf("\n");
  2186. #endif
  2187. if(ret0!=0)
  2188. {
  2189. if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40) // node and func byte
  2190. {
  2191. if(bmsAnswerMsg[2] == MS_UPDATE_STEP_FIRMWARE_INFO_CHECK_AND_UPDATE_REQEST_ANSWER && bmsAnswerMsg[3] == 0x01) //answer cmd byte:0x04, answer data len:0x01
  2192. {
  2193. if(bmsAnswerMsg[4] == 0x00) //answer data byte1
  2194. {
  2195. updateStep = MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST;
  2196. errorCount = 0;
  2197. }
  2198. else if(bmsAnswerMsg[4] == 0x01) //厂家信息错误
  2199. {
  2200. errorCount++;
  2201. ret = updateErrorFirmwareInfoError;
  2202. }
  2203. else if(bmsAnswerMsg[4] == 0x02) //硬件序列号不匹配
  2204. {
  2205. errorCount++;
  2206. ret = updateErrorFirmwareInfoError;
  2207. }
  2208. else if(bmsAnswerMsg[4] == 0x03) //固件大小超出范围
  2209. {
  2210. errorCount++;
  2211. ret = updateErrorFirmwareSizeError;
  2212. }
  2213. else if(bmsAnswerMsg[4] == 0x04) //固件包头信息错误
  2214. {
  2215. errorCount++;
  2216. ret = updateErrorFirmwareInfoError;
  2217. }
  2218. else
  2219. {
  2220. errorCount++;
  2221. }
  2222. }
  2223. else
  2224. {
  2225. errorCount++;
  2226. }
  2227. }
  2228. else
  2229. {
  2230. errorCount++;
  2231. }
  2232. }
  2233. else
  2234. {
  2235. errorCount++;
  2236. }
  2237. if(errorCount>10)
  2238. {
  2239. updateStep = MS_UPDATE_STEP_ERROR;
  2240. errorCount = 0;
  2241. }
  2242. printf(" step 3 ret = %d\n",ret);
  2243. osDelay(50);
  2244. break;
  2245. case MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST: //0x05
  2246. dataLen = 0;
  2247. updateMsgSendLen = 6+dataLen;
  2248. updateMsgReadLen = 8;
  2249. pUpdateMsgSend[0] = 0x01; //node byte
  2250. pUpdateMsgSend[1] = 0x40; //func byte
  2251. pUpdateMsgSend[2] = updateStep; //cmd byte
  2252. pUpdateMsgSend[3] = dataLen; //data len
  2253. CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4+dataLen);
  2254. pUpdateMsgSend[4+dataLen] = (CRCtemp>>8)&0xFF; // CRC High
  2255. pUpdateMsgSend[5+dataLen] = CRCtemp&0xFF; //CRC Low
  2256. memset((UINT8*)(bmsAnswerMsg) , 0, 8);
  2257. ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
  2258. #ifdef USING_PRINTF
  2259. printf("update step 5 answer:\n");
  2260. for(ii=0;ii<updateMsgReadLen;ii++)
  2261. printf("%x ",bmsAnswerMsg[ii]);
  2262. printf("\nret0 = %d",ret0);
  2263. printf("\n");
  2264. #endif
  2265. if(ret0!=0)
  2266. {
  2267. if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40) // node and func byte
  2268. {
  2269. if(bmsAnswerMsg[2] == MS_UPDATE_STEP_EREASE_FLASH_ANSWER && bmsAnswerMsg[3] == 0x02) //answer cmd byte:0x06, answer data len:0x02
  2270. {
  2271. if(bmsAnswerMsg[4] == 0x00) //answer data byte1, erease successed
  2272. {
  2273. updateStep = MS_UPDATE_STEP_SEND_UPDATE_DATA; //0x07
  2274. errorCount = 0;
  2275. }
  2276. else if(bmsAnswerMsg[4] == 0x01) //擦除失败
  2277. {
  2278. errorCount++;
  2279. ret = updateErrorAppErease;
  2280. }
  2281. else
  2282. {
  2283. errorCount++;
  2284. }
  2285. }
  2286. else
  2287. {
  2288. errorCount++;
  2289. }
  2290. }
  2291. else
  2292. {
  2293. errorCount++;
  2294. }
  2295. }
  2296. else
  2297. {
  2298. errorCount++;
  2299. }
  2300. if(errorCount>10)
  2301. {
  2302. updateStep = MS_UPDATE_STEP_ERROR;
  2303. errorCount = 0;
  2304. }
  2305. osDelay(50);
  2306. break;
  2307. case MS_UPDATE_STEP_SEND_UPDATE_DATA: //0x07
  2308. updateMsgReadLen = 7;
  2309. pUpdateMsgSend[0] = 0x01; //node byte
  2310. pUpdateMsgSend[1] = 0x40; //func byte
  2311. pUpdateMsgSend[2] = updateStep; //cmd byte
  2312. for(i = 0; i < updateDataPackageCount ; i++ )
  2313. {
  2314. memset(ReadNVMTemp, 0, 64);
  2315. if((i+1)*64 < (updateDataTotalByteLen))
  2316. {
  2317. tempLen = 64;
  2318. BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+headerLen+i*64,64);
  2319. }
  2320. else
  2321. {
  2322. tempLen = (updateDataTotalByteLen+4) - i*64;
  2323. BSP_QSPI_Read_Safe(ReadNVMTemp,FLASH_BMS_FOTA_START_ADDR+headerLen+i*64,tempLen);
  2324. }
  2325. CRCtemp = MS_BMS_Update_CRC16(ReadNVMTemp, tempLen);
  2326. dataLen = tempLen+6; //data len =count(2+2 byte) + crc(2byte) + update data len
  2327. updateMsgSendLen = 6+dataLen; // updateMsgSendLen = data len + header len(6byte)
  2328. pUpdateMsgSend[3] = dataLen; //data len
  2329. pUpdateMsgSend[4] = ((i+1)>>8)&0xFF; //当前包序号,大端模式
  2330. pUpdateMsgSend[5] = (i+1)&0xFF;
  2331. pUpdateMsgSend[6] = (updateDataPackageCount>>8)&0xFF;
  2332. pUpdateMsgSend[7] = updateDataPackageCount&0xFF;
  2333. pUpdateMsgSend[8] = (CRCtemp>>8)&0xFF; // data CRC High
  2334. pUpdateMsgSend[9] = CRCtemp&0xFF; //data CRC Low
  2335. MEMCPY(&pUpdateMsgSend[4+6], ReadNVMTemp, 64); //升级数据,64字节
  2336. CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4+dataLen);
  2337. pUpdateMsgSend[4+dataLen] = (CRCtemp>>8)&0xFF; // CRC High
  2338. pUpdateMsgSend[5+dataLen] = CRCtemp&0xFF; //CRC Low
  2339. memset((UINT8*)(bmsAnswerMsg) , 0, 8);
  2340. ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
  2341. #ifdef USING_PRINTF
  2342. printf("update step 7 answer:\n");
  2343. for(ii=0;ii<updateMsgReadLen;ii++)
  2344. printf("%x ",bmsAnswerMsg[ii]);
  2345. printf("\nret0 = %d",ret0);
  2346. printf("\n");
  2347. #endif
  2348. if(ret0!=0)
  2349. {
  2350. if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40) // node and func byte
  2351. {
  2352. if(bmsAnswerMsg[2] == MS_UPDATE_STEP_UPDATE_DATA_WRITE_ANSWER && bmsAnswerMsg[3] == 0x01) //answer cmd byte:0x04, answer data len:0x01
  2353. {
  2354. if(bmsAnswerMsg[4] == 0x00) //answer data byte1,接收并操作成功
  2355. {
  2356. updateStep = MS_UPDATE_STEP_EREASE_APP_FLASH_REQUEST;
  2357. errorCount = 0;
  2358. }
  2359. else if(bmsAnswerMsg[4] == 0x01) //固件块校验失败
  2360. {
  2361. errorCount=10;
  2362. ret = updateErrorPackageCRC;
  2363. }
  2364. else if(bmsAnswerMsg[4] == 0x02) //烧写失败
  2365. {
  2366. errorCount=10;
  2367. ret = updateErrorPackageWrite;
  2368. }
  2369. else if(bmsAnswerMsg[4] == 0x03) //固件块编号异常
  2370. {
  2371. errorCount=10;
  2372. ret = updateErrorPackageNo;
  2373. }
  2374. else
  2375. {
  2376. errorCount=10;
  2377. }
  2378. }
  2379. else
  2380. {
  2381. errorCount=10;
  2382. }
  2383. }
  2384. else
  2385. {
  2386. errorCount=10;
  2387. }
  2388. }
  2389. else
  2390. {
  2391. errorCount=10;
  2392. }
  2393. if(errorCount>=10)
  2394. {
  2395. updateStep = MS_UPDATE_STEP_ERROR;
  2396. errorCount = 0;
  2397. i--;
  2398. break;
  2399. }
  2400. osDelay(50);
  2401. }
  2402. if(i == updateDataPackageCount)
  2403. {
  2404. updateStep = MS_UPDATE_STEP_SEND_UPDATE_DATA_END_AND_JUMP_TO_APP;
  2405. }
  2406. break;
  2407. case MS_UPDATE_STEP_SEND_UPDATE_DATA_END_AND_JUMP_TO_APP: //0x09
  2408. dataLen = 0x00;
  2409. updateMsgSendLen = 6+dataLen;
  2410. updateMsgReadLen = 7;
  2411. pUpdateMsgSend[0] = 0x01; //node byte
  2412. pUpdateMsgSend[1] = 0x40; //func byte
  2413. pUpdateMsgSend[2] = updateStep; //cmd byte
  2414. pUpdateMsgSend[3] = dataLen; //data len
  2415. //no data type
  2416. CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4);
  2417. pUpdateMsgSend[4] = (CRCtemp>>8)&0xFF; // CRC High
  2418. pUpdateMsgSend[5] = CRCtemp&0xFF; //CRC Low
  2419. memset((UINT8*)(bmsAnswerMsg) , 0, 8);
  2420. ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
  2421. #ifdef USING_PRINTF
  2422. printf("update step 9 answer:\n");
  2423. for(ii=0;ii<updateMsgReadLen;ii++)
  2424. printf("%x ",bmsAnswerMsg[ii]);
  2425. printf("\nret0 = %d",ret0);
  2426. printf("\n");
  2427. #endif
  2428. if(ret0!=0)
  2429. {
  2430. if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40) // node and func byte
  2431. {
  2432. if(bmsAnswerMsg[2] == MS_UPDATE_STEP_JUMP_TO_APP_ANSWER && bmsAnswerMsg[3] == 0x01) //answer cmd byte:0x0A, answer data len:0x01
  2433. {
  2434. if(bmsAnswerMsg[4] == 0x00) //answer data byte1, update succeed
  2435. {
  2436. errorCount = 0;
  2437. updateStep = MS_UPDATE_STEP_READ_CURRENT_RUNNING_MODE; //0x0B
  2438. }
  2439. else if(bmsAnswerMsg[4] == 0x01) //升级失败
  2440. {
  2441. errorCount = 10;
  2442. ret = updateFailed;
  2443. }
  2444. }
  2445. else
  2446. {
  2447. errorCount++;
  2448. }
  2449. }
  2450. else
  2451. {
  2452. errorCount++;
  2453. }
  2454. }
  2455. else
  2456. {
  2457. errorCount++;
  2458. }
  2459. if(errorCount>=10)
  2460. {
  2461. updateStep = MS_UPDATE_STEP_ERROR;
  2462. errorCount = 0;
  2463. }
  2464. osDelay(50);
  2465. break;
  2466. case MS_UPDATE_STEP_READ_CURRENT_RUNNING_MODE: //0x0B
  2467. dataLen = 0x00;
  2468. updateMsgSendLen = 6+dataLen;
  2469. updateMsgReadLen = 8;
  2470. pUpdateMsgSend[0] = 0x01; //node byte
  2471. pUpdateMsgSend[1] = 0x40; //func byte
  2472. pUpdateMsgSend[2] = updateStep; //cmd byte
  2473. pUpdateMsgSend[3] = dataLen; //data len
  2474. //no data type
  2475. CRCtemp = MS_BMS_Update_CRC16(pUpdateMsgSend, 4);
  2476. pUpdateMsgSend[4] = (CRCtemp>>8)&0xFF; // CRC High
  2477. pUpdateMsgSend[5] = CRCtemp&0xFF; //CRC Low
  2478. memset((UINT8*)(bmsAnswerMsg) , 0, 8);
  2479. ret0 = MS_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(bmsAnswerMsg), updateMsgReadLen, 500);
  2480. #ifdef USING_PRINTF
  2481. printf("update step A answer:\n");
  2482. for(ii=0;ii<updateMsgReadLen;ii++)
  2483. printf("%x ",bmsAnswerMsg[ii]);
  2484. printf("\nret0 = %d",ret0);
  2485. printf("\n");
  2486. #endif
  2487. if(ret0!=0)
  2488. {
  2489. if(bmsAnswerMsg[0] == 0x01 && bmsAnswerMsg[1] == 0x40) // node and func byte
  2490. {
  2491. if(bmsAnswerMsg[2] == MS_UPDATE_STEP_CURRENT_RUNNING_MODE_ANSWER && bmsAnswerMsg[3] == 0x02) //answer cmd byte:0x0C, answer data len:0x02
  2492. {
  2493. if(bmsAnswerMsg[4] == 0x01) //answer data byte1, update succeed, app is running
  2494. {
  2495. errorCount = 0;
  2496. updateStep = MS_UPDATE_STEP_END;
  2497. }
  2498. else if(bmsAnswerMsg[4] == 0x00) //update failed , boot is running,error
  2499. {
  2500. errorCount = 10;
  2501. }
  2502. }
  2503. else
  2504. {
  2505. errorCount++;
  2506. }
  2507. }
  2508. else
  2509. {
  2510. errorCount++;
  2511. }
  2512. }
  2513. else
  2514. {
  2515. errorCount++;
  2516. }
  2517. if(errorCount>=3)
  2518. {
  2519. updateStep = MS_UPDATE_STEP_ERROR;
  2520. errorCount = 0;
  2521. }
  2522. osDelay(50);
  2523. break;
  2524. case MS_UPDATE_STEP_END: //0x0D
  2525. errorCount = 0;
  2526. bmsUpdateFlag = FALSE;
  2527. ret = updateOK;
  2528. break;
  2529. case MS_UPDATE_STEP_ERROR: //0x0E
  2530. errorCount = 0;
  2531. bmsUpdateFlag = true;
  2532. Cycle_conut++;
  2533. if(Cycle_conut>2)
  2534. {
  2535. ret = updateErrorTimeout;
  2536. bmsUpdateFlag = FALSE;
  2537. }
  2538. break;
  2539. default:
  2540. bmsUpdateFlag = FALSE;
  2541. break;
  2542. }
  2543. }
  2544. #ifdef USING_PRINTF
  2545. printf("last ret = %x\n",ret);
  2546. #endif
  2547. return ret;
  2548. }
  2549. UINT8 MS_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout)
  2550. {
  2551. UINT8 timeCount = 0;
  2552. UINT8 j=0;
  2553. USARTdrv->Send(pSend,sendLen);
  2554. #ifdef USING_PRINTF
  2555. printf("query in:");
  2556. for(j=0;j<sendLen;j++)
  2557. {
  2558. printf("%x ",*(pSend+j));
  2559. }
  2560. printf("\n");
  2561. #endif
  2562. if(readLen>0)
  2563. {
  2564. USARTdrv->Receive(pRead,readLen);
  2565. while((isRecvTimeout == false) && (isRecvComplete == false))
  2566. {
  2567. timeCount++;
  2568. osDelay(100);
  2569. if (timeCount>=timeout/100)
  2570. {
  2571. timeCount =0;
  2572. isRecvTimeout = true;
  2573. break;
  2574. }
  2575. }
  2576. #ifdef USING_PRINTF
  2577. printf("\nanswer in:");
  2578. for(j=0;j<readLen;j++)
  2579. {
  2580. printf("%x ",*(pRead+j));
  2581. }
  2582. printf("\n");
  2583. #endif
  2584. if (isRecvComplete == true)
  2585. {
  2586. isRecvComplete = false;
  2587. if(*(pRead+0)!=0x01)
  2588. {
  2589. USARTdrv->Uninitialize();
  2590. osDelay(100);
  2591. USARTdrv->Initialize(USART_callback);
  2592. USARTdrv->PowerControl(ARM_POWER_FULL);
  2593. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  2594. ARM_USART_DATA_BITS_8 |
  2595. ARM_USART_PARITY_NONE |
  2596. ARM_USART_STOP_BITS_1 |
  2597. ARM_USART_FLOW_CONTROL_NONE, 9600);
  2598. #ifdef USING_PRINTF
  2599. printf("\nuart reset in \n");
  2600. #endif
  2601. return 0;
  2602. }
  2603. return readLen;
  2604. }
  2605. else
  2606. {
  2607. memset(pRead,0x00,readLen);
  2608. isRecvTimeout = false;
  2609. return 0;
  2610. }
  2611. }
  2612. else
  2613. {
  2614. return 1;
  2615. }
  2616. }
  2617. static void __invert_uint8(UINT8* dBuf, UINT8* srcBuf)
  2618. {
  2619. int i;
  2620. UINT8 tmp[4];
  2621. tmp[0] = 0;
  2622. for (i = 0;i < 8;i++)
  2623. {
  2624. if(srcBuf[0] & (1 << i))
  2625. {
  2626. tmp[0] |= 1<<(7-i);
  2627. }
  2628. }
  2629. dBuf[0] = tmp[0];
  2630. }
  2631. static void __invert_uint16(UINT16* dBuf, UINT16* srcBuf)
  2632. {
  2633. int i;
  2634. UINT16 tmp[4];
  2635. tmp[0] = 0;
  2636. for (i = 0;i < 16;i++)
  2637. {
  2638. if(srcBuf[0] & (1 << i))
  2639. {
  2640. tmp[0] |= 1 << (15 - i);
  2641. }
  2642. }
  2643. dBuf[0] = tmp[0];
  2644. }
  2645. UINT16 MS_BMS_Update_CRC16(UINT8* pSendData,UINT16 len)
  2646. {
  2647. UINT16 wCRCin = 0xFFFF;
  2648. UINT16 wCPoly = 0x8005;
  2649. UINT8 wChar = 0;
  2650. UINT16 crc_rslt = 0;
  2651. int i;
  2652. while (len--)
  2653. {
  2654. wChar = *(pSendData++);
  2655. __invert_uint8(&wChar, &wChar);
  2656. wCRCin ^= (wChar << 8);
  2657. for (i = 0;i < 8;i++)
  2658. {
  2659. if(wCRCin & 0x8000)
  2660. {
  2661. wCRCin = (wCRCin << 1) ^ wCPoly;
  2662. }
  2663. else
  2664. {
  2665. wCRCin = wCRCin << 1;
  2666. }
  2667. }
  2668. }
  2669. __invert_uint16(&wCRCin, &wCRCin);
  2670. crc_rslt = ((wCRCin << 8) & 0xFF00) | ((wCRCin >> 8) & 0x00FF);
  2671. return (crc_rslt);
  2672. }
  2673. UINT8 BmsErrorDecode(UINT32 battWarningState)
  2674. {
  2675. UINT16 ErrorNumTemp;
  2676. UINT8 ret;
  2677. if(battWarningState==0)
  2678. {
  2679. return 0;
  2680. }
  2681. else
  2682. {
  2683. if(osOK==osMutexAcquire(Error_Mutex, 100))
  2684. {
  2685. ret = ((battWarningState) & 0x01) == 1 ;
  2686. if (ret)
  2687. {
  2688. ErrorNumTemp = 7;
  2689. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2690. //str += "ERROR:存在电芯过放告警故障!!\n";单体电压过低
  2691. }
  2692. ret = ((battWarningState >> 1) & 0x01) == 1 ;
  2693. if (ret)
  2694. {
  2695. ErrorNumTemp = 10;
  2696. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2697. //str += "ERROR:存在总电压过放告警故障!!\n";总电压过低
  2698. }
  2699. ret = ((battWarningState >> 2) & 0x01) == 1 ;
  2700. if (ret)
  2701. {
  2702. ErrorNumTemp = 8;
  2703. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2704. //str += "ERROR:存在电芯过压告警故障!!\n";
  2705. }
  2706. ret = ((battWarningState >> 3) & 0x01) == 1 ;
  2707. if (ret)
  2708. {
  2709. ErrorNumTemp = 11;
  2710. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2711. //str += "ERROR:存在总电压过压告警故障!!\n";
  2712. }
  2713. ret = ((battWarningState >> 4) & 0x01) == 1 ;
  2714. if (ret)
  2715. {
  2716. ErrorNumTemp = 12;
  2717. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2718. //str += "ERROR:存在放电过流告警故障!!\n";
  2719. }
  2720. ret = ((battWarningState >> 5) & 0x01) == 1 ;
  2721. if (ret)
  2722. {
  2723. ErrorNumTemp = 13;
  2724. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2725. //str += "ERROR:存在充电过流告警故障!!\n";
  2726. }
  2727. ret = ((battWarningState >> 6) & 0x01) == 1 ;
  2728. if (ret)
  2729. {
  2730. ErrorNumTemp = 2;
  2731. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2732. //str += "ERROR:存在放电过温告警故障!!\n";
  2733. }
  2734. ret = ((battWarningState >> 7) & 0x01) == 1 ;
  2735. if (ret)
  2736. {
  2737. ErrorNumTemp = 2;
  2738. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2739. //str += "ERROR:存在充电过温告警故障!!\n";
  2740. }
  2741. ret = ((battWarningState >> 8) & 0x01) == 1 ;
  2742. if (ret)
  2743. {
  2744. //str += "ERROR:存在环境高温告警故障!!\n";
  2745. }
  2746. ret = ((battWarningState >> 9) & 0x01) == 1 ;
  2747. if (ret)
  2748. {
  2749. //str += "ERROR:存在环境低温告警故障!!\n";
  2750. }
  2751. ret = ((battWarningState >> 10) & 0x01) == 1 ;
  2752. if (ret)
  2753. {
  2754. ErrorNumTemp = 27;
  2755. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2756. //str += "ERROR:存在battSOC低告警故障!!\n";
  2757. }
  2758. ret = ((battWarningState >> 11) & 0x01) == 1 ;
  2759. if (ret)
  2760. {
  2761. ErrorNumTemp = 3;
  2762. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2763. //str += "ERROR:存在MOS高温告警故障!!\n";
  2764. }
  2765. ret = ((battWarningState >> 16) & 0x01) == 1;
  2766. if (ret)
  2767. {
  2768. ErrorNumTemp = 18;
  2769. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2770. //str += "ERROR:存在温度采集失效/传感器故障!!\n";
  2771. }
  2772. ret = ((battWarningState >> 17) & 0x01) == 1;
  2773. if (ret)
  2774. {
  2775. ErrorNumTemp = 19;
  2776. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2777. //str += "ERROR:存在电压采集失效/断线故障!!\n";
  2778. }
  2779. ret = ((battWarningState >> 18) & 0x01) == 1;
  2780. if (ret)
  2781. {
  2782. ErrorNumTemp = 17;
  2783. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2784. //str += "ERROR:存在放电MOS失效故障!!\n";
  2785. }
  2786. ret = ((battWarningState >> 19) & 0x01) == 1;
  2787. if (ret)
  2788. {
  2789. ErrorNumTemp = 16;
  2790. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2791. //str += "ERROR:存在充电MOS失效故障!!\n";
  2792. }
  2793. ret = ((battWarningState >> 20) & 0x01) == 1;
  2794. if (ret)
  2795. {
  2796. ErrorNumTemp = 22;
  2797. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2798. //str += "ERROR:存在电芯不均衡告警!!\n";
  2799. }
  2800. ret = ((battWarningState >> 22) & 0x01) == 1;
  2801. if (ret)
  2802. {
  2803. ErrorNumTemp = 1;
  2804. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2805. //str += "ERROR:存在放电低温告警故障!!\n";
  2806. }
  2807. ret = ((battWarningState >> 23) & 0x01) == 1 ;
  2808. if (ret)
  2809. {
  2810. ErrorNumTemp = 1;
  2811. PutErrorNum((UINT16 *)ErrorNum,sizeof(ErrorNum),ErrorNumTemp);
  2812. //str += "ERROR:存在充电低温告警故障!!\n";
  2813. }
  2814. }
  2815. else
  2816. {
  2817. #ifdef USING_PRINTF
  2818. printf("get Muxtex error\n");
  2819. #endif
  2820. }
  2821. osMutexRelease(Error_Mutex);
  2822. }
  2823. return 1;
  2824. }