|
@@ -24,16 +24,10 @@ static UINT8 Uart_WriteCmd_func(UartWriteData_S UartWriteData);
|
|
|
void USART_callback(uint32_t event);
|
|
|
static UINT16 crc_chk(UINT8* data, UINT8 length);
|
|
|
UINT8 Uart_Encrypt_Send(void);
|
|
|
+void Uart_Cmd_Control(QueueHandle_t UartWriteCmdHandle,UartWriteData_S UartWriteData,UartAnswerData_S UartAnswerData);
|
|
|
static UINT8 Uart_DataRecv_func(UartQueryType Uart_Read_Msg_Fun,UINT8* Uart_Recv_Buffer_Fun);
|
|
|
static void UartTask(void* arg)
|
|
|
{
|
|
|
- USARTdrv->Initialize(USART_callback);
|
|
|
- USARTdrv->PowerControl(ARM_POWER_FULL);
|
|
|
- USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
|
|
|
- ARM_USART_DATA_BITS_8 |
|
|
|
- ARM_USART_PARITY_NONE |
|
|
|
- ARM_USART_STOP_BITS_1 |
|
|
|
- ARM_USART_FLOW_CONTROL_NONE, 9600);
|
|
|
|
|
|
UINT16 Uart_Uds_LEN;
|
|
|
UINT16 Reg_Num = 0;
|
|
@@ -43,11 +37,10 @@ static void UartTask(void* arg)
|
|
|
memset(&(Uart_Read_Msg),0x00,sizeof(Uart_Read_Msg));
|
|
|
UartAnswerData_S UartAnswerData;//应答数据初始化
|
|
|
memset(&(UartAnswerData),0x00,sizeof(UartAnswerData_S));
|
|
|
- UartWriteData_S UartWriteData;
|
|
|
+ UartWriteData_S UartWriteData;
|
|
|
memset(&(UartWriteData),0x00,sizeof(UartWriteData_S));//Uart控制命令初始化
|
|
|
- PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
|
|
|
+ PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_INTI);
|
|
|
UINT8 ret = 0x00;
|
|
|
- UINT8 HeatSwitch = 0;
|
|
|
if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
|
|
|
{
|
|
|
UartWriteCmdHandle = osMessageQueueNew(1,sizeof(UartWriteData_S), NULL);
|
|
@@ -56,6 +49,18 @@ static void UartTask(void* arg)
|
|
|
{
|
|
|
switch (gProcess_Uart_Task)
|
|
|
{
|
|
|
+ case PROCESS_UART_STATE_INTI:
|
|
|
+ {
|
|
|
+ USARTdrv->Initialize(USART_callback);
|
|
|
+ USARTdrv->PowerControl(ARM_POWER_FULL);
|
|
|
+ USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
|
|
|
+ ARM_USART_DATA_BITS_8 |
|
|
|
+ ARM_USART_PARITY_NONE |
|
|
|
+ ARM_USART_STOP_BITS_1 |
|
|
|
+ ARM_USART_FLOW_CONTROL_NONE, 9600);
|
|
|
+ PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
|
|
|
+ break;
|
|
|
+ }
|
|
|
case PROCESS_UART_STATE_ENCRYPT:
|
|
|
{
|
|
|
UINT8 EncryptFlag=0x00;
|
|
@@ -71,6 +76,7 @@ static void UartTask(void* arg)
|
|
|
case PROCESS_UART_STATE_IDLE:
|
|
|
{
|
|
|
osDelay(100);
|
|
|
+ Uart_Cmd_Control(UartWriteCmdHandle,UartWriteData,UartAnswerData);//电池锁定,继电器锁定,加热控制
|
|
|
if(TimeCounter%10==0 && gProcess_app==WORK)
|
|
|
{
|
|
|
#ifdef USING_PRINTF1
|
|
@@ -100,47 +106,6 @@ static void UartTask(void* arg)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if(battWorkState ==0x00 && AppDataInfo.BattLock==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x02)//try to lock lock the discharge
|
|
|
- {
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("try to lock\n");
|
|
|
- #endif
|
|
|
- UartWriteData.WriteCmd = 0x01;
|
|
|
- UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
|
|
|
- UartWriteData.Data[1] = 0x02;
|
|
|
- osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
- }
|
|
|
- else if (battWorkState ==0x00 && AppDataInfo.BattLock==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x03 ) // try to unlock
|
|
|
- {
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("try to unlock\n");
|
|
|
- #endif
|
|
|
- UartWriteData.WriteCmd = 0x01;
|
|
|
- UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
|
|
|
- UartWriteData.Data[1] = 0x03;
|
|
|
- osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
- }
|
|
|
- if(AppDataInfo.RelayControl==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x00)//继电器断开
|
|
|
- {
|
|
|
- UartWriteData.WriteCmd = 0x04;
|
|
|
- UartWriteData.Data[0] = 0x80;
|
|
|
- UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
|
|
|
- osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
- }
|
|
|
- else if(AppDataInfo.RelayControl==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x80)//继电器闭合
|
|
|
- {
|
|
|
- UartWriteData.WriteCmd = 0x04;
|
|
|
- UartWriteData.Data[0] = 0x00;
|
|
|
- UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
|
|
|
- osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
- }
|
|
|
- if(TimeCounter%50==0 && BattHeaterSwitch(&HeatSwitch,10,5,10)==TRUE)
|
|
|
- {
|
|
|
- UartWriteData.WriteCmd = 0x02;
|
|
|
- UartWriteData.Data[0] = 0x00;
|
|
|
- UartWriteData.Data[1] = HeatSwitch&0xFF;
|
|
|
- osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
- }
|
|
|
break;
|
|
|
}
|
|
|
case PROCESS_UART_STATE_READ:
|
|
@@ -162,23 +127,34 @@ static void UartTask(void* arg)
|
|
|
#ifdef USING_PRINTF1
|
|
|
printf("[%d]Uart_Recv_buffer-%d: ",__LINE__,Uart_Recv_LEN);
|
|
|
#endif
|
|
|
- if(Uart_Recv_LEN>0)
|
|
|
+ if(Uart_Recv_LEN>5)
|
|
|
{
|
|
|
UartRecvFlag = 1;
|
|
|
UartAnswerData.len = Uart_Recv_LEN;
|
|
|
uartBattInfoDecode(UartAnswerData.data);
|
|
|
+ clrbit(PadInterrupt,1);
|
|
|
+ PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
|
|
|
+ break;
|
|
|
}
|
|
|
- else
|
|
|
+ else if(Uart_Recv_LEN==1)//接收的数据校验不过
|
|
|
{
|
|
|
+ osDelay(100);
|
|
|
UartRecvFlagCounter++;
|
|
|
- if(UartRecvFlagCounter>=3)
|
|
|
- {
|
|
|
- UartRecvFlag = 0;
|
|
|
- UartRecvFlagCounter = 0;
|
|
|
- }
|
|
|
+ clrbit(PadInterrupt,1);
|
|
|
}
|
|
|
- clrbit(PadInterrupt,1);
|
|
|
- PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
|
|
|
+ else//没有接收到数据
|
|
|
+ {
|
|
|
+ osDelay(100);
|
|
|
+ UartRecvFlagCounter++;
|
|
|
+ clrbit(PadInterrupt,1);
|
|
|
+ }
|
|
|
+ if(UartRecvFlagCounter>=3)
|
|
|
+ {
|
|
|
+ UartRecvFlag = 0;
|
|
|
+ UartRecvFlagCounter = 0;
|
|
|
+ PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_INTI);
|
|
|
+ break;
|
|
|
+ }
|
|
|
#ifdef USING_PRINTF1
|
|
|
printf("[%d]Uart_Recv_buffer-%d: ",__LINE__,Uart_Recv_LEN);
|
|
|
for(int i=0;i<Uart_Recv_LEN;i++)
|
|
@@ -198,7 +174,7 @@ static void UartTask(void* arg)
|
|
|
}
|
|
|
case PROCESS_UART_STATE_UPDATE:
|
|
|
{
|
|
|
- UartRecvFlag = FALSE;
|
|
|
+ UartRecvFlag = 0;
|
|
|
#if BMS_MANUFACTURE==1
|
|
|
{
|
|
|
SP_BMS_Update_Service();
|
|
@@ -216,18 +192,11 @@ static void UartTask(void* arg)
|
|
|
printf("Uart silence begin\n");
|
|
|
#endif
|
|
|
UartRecvFlag = 0;
|
|
|
+ USARTdrv->PowerControl(ARM_POWER_LOW);
|
|
|
while (gProcess_app==LISTEN)
|
|
|
{
|
|
|
- osDelay(1000);
|
|
|
+ osDelay(100);
|
|
|
}
|
|
|
- PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_ENCRYPT);
|
|
|
- USARTdrv->Initialize(USART_callback);
|
|
|
- USARTdrv->PowerControl(ARM_POWER_FULL);
|
|
|
- USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
|
|
|
- ARM_USART_DATA_BITS_8 |
|
|
|
- ARM_USART_PARITY_NONE |
|
|
|
- ARM_USART_STOP_BITS_1 |
|
|
|
- ARM_USART_FLOW_CONTROL_NONE, 9600);
|
|
|
break;
|
|
|
}
|
|
|
default:
|
|
@@ -350,6 +319,52 @@ static UINT8 Uart_WriteCmd_func(UartWriteData_S UartWriteData)
|
|
|
return 0x00;
|
|
|
}
|
|
|
}
|
|
|
+void Uart_Cmd_Control(QueueHandle_t UartWriteCmdHandle,UartWriteData_S UartWriteData,UartAnswerData_S UartAnswerData)
|
|
|
+{
|
|
|
+ UINT8 HeatSwitch = 0;
|
|
|
+ if(TimeCounter%10==0 && BattHeaterSwitch(&HeatSwitch,10,5,10)==TRUE)
|
|
|
+ {
|
|
|
+ UartWriteData.WriteCmd = 0x02;
|
|
|
+ UartWriteData.Data[0] = 0x00;
|
|
|
+ UartWriteData.Data[1] = HeatSwitch&0xFF;
|
|
|
+ osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
+ }
|
|
|
+ if(battWorkState ==0x00 && AppDataInfo.BattLock==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x02)//try to lock lock the discharge
|
|
|
+ {
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("try to lock\n");
|
|
|
+ #endif
|
|
|
+ UartWriteData.WriteCmd = 0x01;
|
|
|
+ UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
|
|
|
+ UartWriteData.Data[1] = 0x02;
|
|
|
+ osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
+ }
|
|
|
+ else if (battWorkState ==0x00 && AppDataInfo.BattLock==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1])&0x03)!=0x03 ) // try to unlock
|
|
|
+ {
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("try to unlock\n");
|
|
|
+ #endif
|
|
|
+ UartWriteData.WriteCmd = 0x01;
|
|
|
+ UartWriteData.Data[0] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2]);
|
|
|
+ UartWriteData.Data[1] = 0x03;
|
|
|
+ osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(AppDataInfo.RelayControl==TRUE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x00)//继电器断开
|
|
|
+ {
|
|
|
+ UartWriteData.WriteCmd = 0x04;
|
|
|
+ UartWriteData.Data[0] = 0x80;
|
|
|
+ UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
|
|
|
+ osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
+ }
|
|
|
+ else if(AppDataInfo.RelayControl==FALSE && ((UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2])&0x80)==0x80)//继电器闭合
|
|
|
+ {
|
|
|
+ UartWriteData.WriteCmd = 0x04;
|
|
|
+ UartWriteData.Data[0] = 0x00;
|
|
|
+ UartWriteData.Data[1] = 0x00|(UartAnswerData.data[(0x1B+AppNVMData.BattCellCount + AppNVMData.BattTempCount + BMS_OTHER_TEMP)*2+1]);
|
|
|
+ osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,0);
|
|
|
+ }
|
|
|
+}
|
|
|
//Uart发送接收函数
|
|
|
static UINT8 Uart_DataRecv_func(UartQueryType Uart_Read_Msg_Fun,UINT8* Uart_Recv_Buffer_Fun)
|
|
|
{
|
|
@@ -398,23 +413,15 @@ static UINT8 Uart_DataRecv_func(UartQueryType Uart_Read_Msg_Fun,UINT8* Uart_Recv
|
|
|
}
|
|
|
else //接收数据的校验不过
|
|
|
{
|
|
|
- osDelay(5000);
|
|
|
- USARTdrv->Initialize(USART_callback);
|
|
|
- USARTdrv->PowerControl(ARM_POWER_FULL);
|
|
|
- USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
|
|
|
- ARM_USART_DATA_BITS_8 |
|
|
|
- ARM_USART_PARITY_NONE |
|
|
|
- ARM_USART_STOP_BITS_1 |
|
|
|
- ARM_USART_FLOW_CONTROL_NONE, 9600);
|
|
|
- memset(Uart_Recv_Buffer_Fun,0xff,Data_Len);
|
|
|
- return 0;
|
|
|
+ memset(Uart_Recv_Buffer_Fun,0x00,Data_Len);
|
|
|
+ return 1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
memset(Uart_Recv_Buffer_Fun,0x00,Data_Len);
|
|
|
isRecvTimeout = false;
|
|
|
- return 0;
|
|
|
+ return 2;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|