|
@@ -29,6 +29,7 @@
|
|
|
#include "MainTask.h"
|
|
|
#include "app.h"
|
|
|
#include "numeric.h"
|
|
|
+#include "Fota.h"
|
|
|
|
|
|
//全局变量输入区
|
|
|
extern UINT32 Timer_count;
|
|
@@ -63,6 +64,10 @@ void battErrorStateDisplay(void);
|
|
|
void battLockStateDisplay(UINT8 lockState);
|
|
|
void SP_BMS_Update_Service(void);
|
|
|
BOOL BattHeaterSwitch(UINT8* heaterSwitch);
|
|
|
+//BMS升级函数声明
|
|
|
+UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len);
|
|
|
+void SP_BMS_Update_Service();
|
|
|
+UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout);
|
|
|
|
|
|
//Uart线程任务区
|
|
|
static void UartTask(void* arg)
|
|
@@ -133,7 +138,6 @@ static void UartTask(void* arg)
|
|
|
{
|
|
|
uartReadSuccessFlag = true;
|
|
|
}
|
|
|
-
|
|
|
if(Timer_count-currentTimerCount >= 1)
|
|
|
{
|
|
|
if(AppNVMData.isBattLocked != 0)
|
|
@@ -147,6 +151,10 @@ static void UartTask(void* arg)
|
|
|
}
|
|
|
}
|
|
|
currentTimerCount = Timer_count;
|
|
|
+ if(BMS_Fota_update_flag)
|
|
|
+ {
|
|
|
+ PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_UPDATE);
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
case PROCESS_UART_STATE_READ:
|
|
@@ -181,6 +189,11 @@ static void UartTask(void* arg)
|
|
|
PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
|
|
|
break;
|
|
|
}
|
|
|
+ case PROCESS_UART_STATE_UPDATE:
|
|
|
+ SP_BMS_Update_Service();
|
|
|
+ PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
|
|
|
+ BMS_Fota_update_flag = FALSE;
|
|
|
+ break;
|
|
|
case PROCESS_UART_STATE_SLEEP:
|
|
|
{
|
|
|
USARTdrv->PowerControl(ARM_POWER_LOW);
|
|
@@ -812,13 +825,786 @@ UINT16 encryptionAlgorithm (UINT8 plainText)
|
|
|
}
|
|
|
return cipherText;
|
|
|
}
|
|
|
+
|
|
|
+void SP_BMS_Update_Service() //超力源BMS升级服务
|
|
|
+{
|
|
|
+
|
|
|
+ UINT8 errorCount = 0;
|
|
|
+ UINT8 resetCount = 0;
|
|
|
+ UINT16 currentPackage = 0;
|
|
|
+ UINT32 updateDataTotalByteLen = 0;
|
|
|
+ UpdateStep updateStep = UPDATE_STEP_CHECK_VERSION;
|
|
|
+
|
|
|
+ UINT8 i,j,ret=0;
|
|
|
+ UINT8 dataLen = 0;
|
|
|
+
|
|
|
+ UINT8 pUpdateMsgSend[80];
|
|
|
+ UINT32 updateMsgSendLen = 0;
|
|
|
+ UINT32 currentPackageStartAddr = 0;
|
|
|
+ BMS_Update_Recv_Msg_Type pUpdateMsgRecv;
|
|
|
+ UINT8 bmsUpdateFlag = 1;
|
|
|
+ //BMS_Update_Recv_Msg_Type bmsMsg;
|
|
|
+ //static UpdateStep step = UPDATE_STEP_CHECK_VERSION;
|
|
|
+ while(bmsUpdateFlag)
|
|
|
+ {
|
|
|
+ switch (updateStep)
|
|
|
+ {
|
|
|
+ case UPDATE_STEP_CHECK_VERSION:
|
|
|
+
|
|
|
+ dataLen = 0;
|
|
|
+ updateMsgSendLen = 7;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x01; //read
|
|
|
+ pUpdateMsgSend[3] = 0x03; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x90; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x93; //checksum
|
|
|
+ pUpdateMsgSend[6] = 0xF5; //end flag
|
|
|
+ //printf("updateMsgSendLen0 = %x\n",updateMsgSendLen);
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv),sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ //printf("updateMsgSendLen1 = %x\n",updateMsgSendLen);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x90)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data != 0xFF)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_REQUEST_UPDATE;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_SET_BAUD_RATE;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPDATE_STEP_REQUEST_UPDATE:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x80; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x22; //data
|
|
|
+ pUpdateMsgSend[6] = 0xA6; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x80)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x33)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_START_UPDATE;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPDATE_STEP_START_UPDATE:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x80; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x55; //data
|
|
|
+ pUpdateMsgSend[6] = 0xD9; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
|
|
|
+ //updateStep = UPDATE_STEP_SET_BAUD_RATE;
|
|
|
+ updateStep = UPDATE_STEP_SET_BAUD_RATE;
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_SET_BAUD_RATE:
|
|
|
+ printf("start step %d\n",updateStep);
|
|
|
+ dataLen = 4;
|
|
|
+ updateMsgSendLen = 12;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x08; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x33; //data
|
|
|
+ pUpdateMsgSend[6] = 0x00; //baud rate:9600
|
|
|
+ pUpdateMsgSend[7] = 0x00;
|
|
|
+ pUpdateMsgSend[8] = 0x25;
|
|
|
+ pUpdateMsgSend[9] = 0x80;
|
|
|
+ pUpdateMsgSend[10] = 0x61; //check
|
|
|
+ pUpdateMsgSend[11] = 0xF5; //end flag
|
|
|
+
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ printf("ret = %d\n",ret);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x81)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x11)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_PREPARE_SEND_DATA_LEN;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+
|
|
|
+
|
|
|
+ case UPDATE_STEP_PREPARE_SEND_DATA_LEN:
|
|
|
+ printf("start step %d\n",updateStep);
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x44; //data
|
|
|
+ pUpdateMsgSend[6] = 0xC9; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x81)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x11)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_SEND_DATA_LEN;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_SEND_DATA_LEN:
|
|
|
+
|
|
|
+ dataLen = 4;
|
|
|
+ BSP_QSPI_Read_Safe(&updateDataTotalByteLen,FLASH_BMS_FOTA_START_ADDR,4);
|
|
|
+ updateDataTotalByteLen = (((updateDataTotalByteLen)&0xFF)<<24)|(((updateDataTotalByteLen>>8)&0xFF)<<16)|(((updateDataTotalByteLen>>16)&0xFF)<<8)|(((updateDataTotalByteLen>>24)&0xFF));
|
|
|
+ updateMsgSendLen = 11;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x07; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x82; //cmd
|
|
|
+ pUpdateMsgSend[5] = (updateDataTotalByteLen>>24)&0xFF; //data: package byte len
|
|
|
+ pUpdateMsgSend[6] = (updateDataTotalByteLen>>16)&0xFF;
|
|
|
+ pUpdateMsgSend[7] = (updateDataTotalByteLen>>8)&0xFF;
|
|
|
+ pUpdateMsgSend[8] = (updateDataTotalByteLen)&0xFF;
|
|
|
+ pUpdateMsgSend[9] = SP_BMS_Update_CheckSUM(&pUpdateMsgSend[3], dataLen+2); //check sum
|
|
|
+ pUpdateMsgSend[10] = 0xF5; //end flag
|
|
|
+
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv),0,sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x81)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x11)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_PREPARE_SEND_UPDATE_DATA;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPDATE_STEP_PREPARE_SEND_UPDATE_DATA:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x55; //data
|
|
|
+ pUpdateMsgSend[6] = 0xDA; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen,(UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x81)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x11)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_SEND_UPDATE_DATA;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_SEND_UPDATE_DATA:
|
|
|
+ dataLen = 64;
|
|
|
+ updateMsgSendLen = 75;
|
|
|
+
|
|
|
+ for(currentPackage=0;currentPackage<updateDataTotalByteLen/64;currentPackage++)
|
|
|
+ {
|
|
|
+ currentPackageStartAddr = currentPackage*64;
|
|
|
+
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x47; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x82; //cmd
|
|
|
+ pUpdateMsgSend[5] = (currentPackageStartAddr>>24)&0xFF;
|
|
|
+ pUpdateMsgSend[6] = (currentPackageStartAddr>>16)&0xFF;
|
|
|
+ pUpdateMsgSend[7] = (currentPackageStartAddr>>8)&0xFF;
|
|
|
+ pUpdateMsgSend[8] = currentPackageStartAddr&0xFF;
|
|
|
+ BSP_QSPI_Read_Safe(&pUpdateMsgSend[9], FLASH_BMS_FOTA_START_ADDR+4+currentPackage*dataLen, dataLen); //data
|
|
|
+ pUpdateMsgSend[8+dataLen+1] = SP_BMS_Update_CheckSUM(&pUpdateMsgSend[3], dataLen+6); //check sum
|
|
|
+ pUpdateMsgSend[8+dataLen+2] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x81)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x11)
|
|
|
+ {
|
|
|
+ if(currentPackage+1 == updateDataTotalByteLen/64)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_SEND_DATA_END;
|
|
|
+ }
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_RESET;
|
|
|
+ errorCount = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ }
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPDATE_STEP_SEND_DATA_END:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x66; //data
|
|
|
+ pUpdateMsgSend[6] = 0xEB; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ ret = SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), sizeof(BMS_Update_Recv_Msg_Type), 500);
|
|
|
+ if(ret!=0)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.startFlag == 0xEB && pUpdateMsgRecv.endFlag == 0xF5)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.cmd == 0x81)
|
|
|
+ {
|
|
|
+ if(pUpdateMsgRecv.data == 0x11)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_START_INSTALL;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(errorCount>10)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ errorCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPDATE_STEP_START_INSTALL:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0x99; //data
|
|
|
+ pUpdateMsgSend[6] = 0x1E; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
|
|
|
+
|
|
|
+ updateStep = UPDATE_STEP_END;
|
|
|
+
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ //printf("update step:%d\n",updateStep);
|
|
|
+ printf("query:");
|
|
|
+ for(j=0;j<updateMsgSendLen;j++)
|
|
|
+ {
|
|
|
+ printf("%x ",pUpdateMsgSend[j]);
|
|
|
+ }
|
|
|
+ printf("\nanswer:");
|
|
|
+ for(j=0;j<sizeof(BMS_Update_Recv_Msg_Type);j++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(((UINT8*)&pUpdateMsgRecv)+j));
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ printf("next update step:%d\n",updateStep);
|
|
|
+ #endif
|
|
|
+ osDelay(50);
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_END:
|
|
|
+ updateStep = UPDATE_STEP_CHECK_VERSION;
|
|
|
+ printf("update end\n");
|
|
|
+ bmsUpdateFlag = 0;
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_RESET:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0xAA; //data
|
|
|
+ pUpdateMsgSend[6] = 0x2F; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
|
|
|
+ osDelay(50);
|
|
|
+
|
|
|
+ resetCount++;
|
|
|
+ if(resetCount>=2)
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_DOWNLOAD_BREAK_OFF;
|
|
|
+ resetCount = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ updateStep = UPDATE_STEP_PREPARE_SEND_DATA_LEN;
|
|
|
+ }
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("update error!!\n rest and start send data lenth again!!\n continue update!\n");
|
|
|
+ #endif
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_DOWNLOAD_BREAK_OFF:
|
|
|
+ dataLen = 1;
|
|
|
+ updateMsgSendLen = 8;
|
|
|
+ pUpdateMsgSend[0] = 0xEB; //start flag
|
|
|
+ pUpdateMsgSend[1] = 0x01; //add flag
|
|
|
+ pUpdateMsgSend[2] = 0x00; //write
|
|
|
+ pUpdateMsgSend[3] = 0x04; //data len
|
|
|
+ pUpdateMsgSend[4] = 0x81; //cmd
|
|
|
+ pUpdateMsgSend[5] = 0xBB; //data
|
|
|
+ pUpdateMsgSend[6] = 0x40; //check
|
|
|
+ pUpdateMsgSend[7] = 0xF5; //end flag
|
|
|
+ memset((UINT8*)(&pUpdateMsgRecv) , 0, sizeof(BMS_Update_Recv_Msg_Type));
|
|
|
+ SP_BMS_Update_Query(pUpdateMsgSend, updateMsgSendLen, (UINT8*)(&pUpdateMsgRecv), 0, 500);
|
|
|
+ osDelay(50);
|
|
|
+ updateStep = UPDATE_STEP_ERROR;
|
|
|
+ break;
|
|
|
+ case UPDATE_STEP_ERROR:
|
|
|
+ updateStep = UPDATE_STEP_CHECK_VERSION;
|
|
|
+ printf("update error end\n");
|
|
|
+ bmsUpdateFlag = 0;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ updateStep = UPDATE_STEP_CHECK_VERSION;
|
|
|
+ printf("update default end\n");
|
|
|
+ bmsUpdateFlag = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout)
|
|
|
+{
|
|
|
+ UINT8 timeCount = 0;
|
|
|
+ UINT8 j=0;
|
|
|
+ USARTdrv->Send(pSend,sendLen);
|
|
|
+ if(readLen>0)
|
|
|
+ {
|
|
|
+ USARTdrv->Receive(pRead,readLen);
|
|
|
+ while((isRecvTimeout == false) && (isRecvComplete == false))
|
|
|
+ {
|
|
|
+ timeCount++;
|
|
|
+ osDelay(100);
|
|
|
+ if (timeCount>=timeout/100)
|
|
|
+ {
|
|
|
+ timeCount =0;
|
|
|
+ isRecvTimeout = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isRecvComplete == true)
|
|
|
+ {
|
|
|
+ isRecvComplete = false;
|
|
|
+ return readLen;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memset(pRead,0x00,readLen);
|
|
|
+ isRecvTimeout = false;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len)
|
|
|
{
|
|
|
UINT8 ret = 0;
|
|
|
UINT8 i=0;
|
|
|
for(i=0;i<len;i++)
|
|
|
{
|
|
|
- ret +=*(pSendData+i);
|
|
|
+ ret +=*(pSendData+i);
|
|
|
}
|
|
|
return ret&0xFF;
|
|
|
-}
|
|
|
+}
|