123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- #include "can_process.h"
- #include "usart.h"
- /**********局部函数定义**********/
- uint8_t cd_ReadChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
- {
- uint8_t ucData;
- uint16_t i;
- i = ucNum;
- if ((*ptCANRx).ucBufCnt >= ucNum)
- {
- i += (*ptCANRx).ucBufRdInde;
- if (i >= (*ptCANRx).ucBufSize)
- {
- i -=((*ptCANRx).ucBufSize);
- }
- }
- else
- {
- i=0;
- }
- ucData = *((*ptCANRx).pcBufAddr + i);
- return ucData;
- }
- void cd_DelChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)
- {
- uint16_t i;
- if ((*ptCANRx).ucBufCnt >= ucNum)
- {
- __HAL_CAN_DISABLE_IT(&hcan, CAN_IT_FMP0);//关接收中断
- (*ptCANRx).ucBufCnt -= ucNum;
- __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
- i = ucNum;
- i += (*ptCANRx).ucBufRdInde;
- if (i >= (*ptCANRx).ucBufSize)
- {
- i -= (*ptCANRx).ucBufSize;
- }
- (*ptCANRx).ucBufRdInde = i;
- }
- else
- {
- __HAL_CAN_DISABLE_IT(&hcan, CAN_IT_FMP0);//关接收中断
- i = (*ptCANRx).ucBufCnt;
- (*ptCANRx).ucBufCnt = 0;
- __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
- i += (*ptCANRx).ucBufRdInde;
- if (i >= (*ptCANRx).ucBufSize)
- {
- i -= (*ptCANRx).ucBufSize;
- }
- (*ptCANRx).ucBufRdInde = i;
- }
- }
- //数据解析处理
- void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
- {
- uint8_t DataLength;
-
- DataLength = (uint8_t)(Cmd &0x00FF);
-
- switch(ID)
- {
- //处理MC发送的指令
- case ID_MC_BC:
- case ID_MC_TO_PBU:
- {
- PowerOn_flag=1;
- MC_Online_Flag=1;
- MC_Online_TimeCnt=SysTime_5ms;
- switch(Cmd)
- {
- //MC广播的指令
- case 0x1020://MC广播运行信息
- {
- memcpy((uint8_t*)&MC_RunInfo.BikeSpeed, Data, sizeof(MC_RunInfo_Struct_t));
- break;
- }
- case 0x1104://MC广播故障码
- {
- MC_error_cnt=0;
- memcpy((uint8_t*)&MC_ErrorCode.Code, Data, sizeof(MC_ErrorCode_Struct_t));
- break;
- }
- case 0x1305://MC关机就绪
- {
- if(strncmp("READY", (char*)Data, DataLength) == 0)
- {
- PBU_PowerOff_Process.Ready_Status.Status_Bit.MC = 1;
- }
- break;
- }
- //MC发送给PBU的指令
- case 0x5009://在线检测
- {
- if(strncmp("HANDSHAKE", (char*)Data, DataLength) == 0)
- {
- SendData(ID_PBU_TO_MC, MODE_REPORT, 0x3105, (uint8_t*)"READY");
- }
- break;
- }
- case 0x5100://查询物理ID
- {
- SendData(ID_PBU_BC, MODE_REPORT, 0x120C, (uint8_t*)PBU_CheckInfo.MAC_ID);
- break;
- }
- case 0x5200://查询校验码
- {
- SendData(ID_PBU_BC, MODE_REPORT, 0x130C, (uint8_t*)PBU_CheckInfo.CheckCode);
- break;
- }
- case 0x5303://用户参数配置反馈
- {
- if(strncmp("ACK", (char*)Data, DataLength) == 0)
- {
- PBU_MC_Cfg.MC_ACK_Flag = TRUE;
- }
- break;
- }
- default:break;
- }
- break;
- }
- //处理BMS发送的指令
- case ID_BMS_BC:
- case ID_BMS_TO_PBU:
- {
- BMS_Online_Flag = 1;
- BMS_Online_TimeCnt=SysTime_5ms;
- switch(Cmd)
- {
- //BMS广播的指令
- case 0x1010://BMS广播运行信息
- {
- memcpy((uint8_t*)&BMS_RunInfo.Voltage, Data, sizeof(BMS_RunInfo_Struct_t));
- if(BMS_RunInfo.Status.Status_Bit.Charge == 0x01) //电池连续发送7次进入充电状态,按键才进入充电状态
- {
- BMS_Charging_count++;
- if(BMS_Charging_count>6)
- {
- BMS_Charging_count=0;
- BMS_ChargingFlag = TRUE;
- }
- }
- else
- {
- BMS_Charging_count=0;
- BMS_ChargingFlag = FALSE;
- }
- break;
- }
- case 0x1204://BMS广播故障码
- {
- memcpy((uint8_t*)&BMS_ErrorCode.Code, Data, sizeof(BMS_ErrorCode_Struct_t));
- break;
- }
- case 0x1308://BMS广播关机指令
- {
- if(strncmp("SHUTDOWN", (char*)Data, DataLength) == 0)
- {
- //...处理存储关键信息
- SendData(ID_PBU_BC, MODE_REPORT, 0x1405, (uint8_t*)"READY");
- }
- break;
- }
- }
-
- break;
- }
- //处理HMI发送的指令
- case ID_HMI_BC:
- case ID_HMI_TO_PBU:
- //处理CDL发送的指令
- case ID_CDL_BC:
- case ID_CDL_TO_PBU:
- {
- switch(Cmd)
- {
- case 0x5000://查询PBU物理ID
- {
- SendData(ID_PBU_BC, MODE_REPORT, 0x120C, (uint8_t*)(PBU_CheckInfo.MAC_ID));
- break;
- }
- case 0x5100://查询校验码
- {
- SendData(ID_PBU_BC, MODE_REPORT, 0x130C, (uint8_t*)PBU_CheckInfo.CheckCode);
- break;
- }
- case 0x520C://写入校验码
- {
- if(strncmp((char*)PBU_CheckInfo.CheckCode, (char*)Data, DataLength) != 0)
- {
- memcpy(PBU_CheckInfo.CheckCode, Data, 12);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x5300://查询PBU生产信息
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9420, (uint8_t*)PBU_MacInfo.Manufacturer);
- break;
- }
- case 0x5400://查询PBU版本信息
- {
- SendData(ID_PBU_BC, MODE_REPORT, 0x1140, (uint8_t*)PBU_VerInfo.Mode);
- break;
- }
- case 0x5504://进入按键测试模式
- {
- if(strncmp("STAR", (char*)Data, DataLength) == 0)
- {
- PBU_RunMode = PBU_RunMode_CDL_KeyTest;
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- }
- else if(strncmp("STOP", (char*)Data, DataLength) == 0)
- {
- PBU_RunMode = PBU_RunMode_MC_AssisitCtrl;
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- }
- break;
- }
- case 0x5600://查询PBU历史信息
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9310, (uint8_t*)&PBU_RunLog.RunTime);
- break;
- }
- case 0x5700://查询PBU出厂参数
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9210, &PBU_ConfigParam.RatedVoltage);
- break;
- }
- case 0x5810://写入PBU出厂参数
- {
- if(strncmp((char*)&PBU_ConfigParam.RatedVoltage, (char*)Data, DataLength) != 0)
- {
- memcpy(&PBU_ConfigParam.RatedVoltage, Data, 16);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x5900://查询自定义字符串1
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9510, (uint8_t*)UserString1);
- break;
- }
- case 0x5A10://写入自定义字符串1
- {
- if(strncmp((char*)UserString1, (char*)Data, DataLength) != 0)
- {
- memcpy(UserString1, Data, 16);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x5B00://查询自定义字符串2
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9610, (uint8_t*)UserString2);
- break;
- }
- case 0x5C10://写入自定义字符串2
- {
- if(strncmp((char*)UserString2, (char*)Data, DataLength) != 0)
- {
- memcpy(UserString2, Data, 16);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x5D00://查询自定义字符串3
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9710, (uint8_t*)UserString3);
- break;
- }
- case 0x5E10://写入自定义字符串3
- {
- if(strncmp((char*)UserString3, (char*)Data, DataLength) != 0)
- {
- memcpy(UserString3, Data, 16);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x5F20://写入生产信息
- {
- if(strncmp((char*)PBU_MacInfo.Manufacturer, (char*)Data, DataLength) != 0)
- {
- memcpy(PBU_MacInfo.Manufacturer, Data, 32);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x6010://写入Mode
- {
- if(strncmp((char*)PBU_VerInfo.Mode, (char*)Data, DataLength) != 0)
- {
- memcpy(PBU_VerInfo.Mode, Data, 16);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x6110://写入SN
- {
- if(strncmp((char*)PBU_VerInfo.SN_Num, (char*)Data, DataLength) != 0)
- {
- memcpy(PBU_VerInfo.SN_Num, Data, 16);
- EEPROM_DataUpdate();
- }
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- break;
- }
- case 0x6205://复位指令
- {
- if(strncmp("RESET", (char*)Data, DataLength) == 0)
- {
- SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9003, (uint8_t*)"ACK");
- HAL_Delay(200);
- __set_FAULTMASK(1);//关闭所有中断
- HAL_NVIC_SystemReset();
- }
- break;
- }
- }
- break;
- }
- case ID_CDL_TO_PBU_TE://0x653
- {
- switch(Cmd)
- {
- case 0x6205://复位指令
- case 0xA10B://升级指令
- PBU_TE_Status = UPDATE_ING;
- PBU_RunMode = PBU_RunMode_Updating;
- break;
- default:
- break;
- }
- SendUartDataToTE(ID_CDL_TO_PBU_TE,Mode, Cmd, Data);
- break;
- }
- default:
- break;
- }
- }
- /*********************End*******************/
- /************全局函数定义*******************/
- void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
- {
- uint8_t Mode, CmdLength, DataLength, Data[150], CRC_Buf[150];
- uint16_t Cmd, i;
- uint32_t CrcResult, CrcData;
- uint8_t FrameBegin1, FrameBegin2;
-
- if(ptCANRx->ucBufCnt >= 11)
- {
- //读取帧头
- FrameBegin1 = cd_ReadChar(ptCANRx, 0);
- CRC_Buf[0] = FrameBegin1;
- FrameBegin2 = cd_ReadChar(ptCANRx, 1);
- CRC_Buf[1] = FrameBegin2;
- if((FrameBegin1 == FRAME_BEGIN1) && (FrameBegin2 == FRAME_BEGIN2))
- {
- CRC_Buf[2] = (uint8_t)((ptCANRx->ucBufID >> 8) & 0xFF);
- CRC_Buf[3] = (uint8_t)(ptCANRx->ucBufID & 0xFF);
- //读取帧模式
- Mode = cd_ReadChar(ptCANRx, 2);
- CRC_Buf[4] = Mode;
- if((Mode == MODE_READ) || (Mode == MODE_WRITE) || (Mode == MODE_REPORT))
- {
- //读取命令段长度和命令字
- CmdLength = cd_ReadChar(ptCANRx, 3);
- CRC_Buf[5] = CmdLength;
- Cmd = (cd_ReadChar(ptCANRx, 4) << 8) + cd_ReadChar(ptCANRx, 5);
- CRC_Buf[6] = (uint8_t)((Cmd >> 8) & 0xFF);
- CRC_Buf[7] = (uint8_t)(Cmd & 0xFF);
- DataLength = cd_ReadChar(ptCANRx, 5);
- if((CmdLength - DataLength) == 2)
- {
- if(ptCANRx->ucBufCnt < (CmdLength + 9))//帧头2bytes + 模式1byte + 命令段长度1byte + 校验位4bytes + 帧尾1byte
- {
- if(ptCANRx->IsWaitRX_Flag == FALSE)
- {
- ptCANRx->DelayTimeCnt = HAL_GetTick();
- ptCANRx->IsWaitRX_Flag = TRUE;
- }
- if((HAL_GetTick() - ptCANRx->DelayTimeCnt) > TimeOutCnt)//超时,单位ms
- {
- cd_DelChar(ptCANRx, ptCANRx->ucBufCnt);
- ptCANRx->IsWaitRX_Flag = FALSE;
- }
- return;
- }
- else
- {
- ptCANRx->IsWaitRX_Flag = FALSE;
- //接收到完整正确数据包
- for(i=0; i<DataLength; i++)//读取数据段
- {
- Data[i] = cd_ReadChar(ptCANRx, 6 + i);
- CRC_Buf[8 + i] = Data[i];
- }
- CrcData = (cd_ReadChar(ptCANRx, 6 + DataLength) << 24) + \
- (cd_ReadChar(ptCANRx, 7 + DataLength) << 16) + \
- (cd_ReadChar(ptCANRx, 8 + DataLength) << 8) + \
- cd_ReadChar(ptCANRx, 9 + DataLength);
- CrcResult = CRC32_Calculate(CRC_Buf, 8 + DataLength);
- if((CrcData - CrcResult) == 0) // 比较校验
- {
- //数据处理
- DataProcess(ptCANRx->ucBufID, Mode, Cmd, Data);//Mode为帧模式,Cmd为命令字,Data为数据段
- cd_DelChar(ptCANRx, CmdLength + 9);
- return;
- }
- cd_DelChar(ptCANRx, 1);
- }
- }
- else
- {
- cd_DelChar(ptCANRx, 1);
- }
- }
- else
- {
- cd_DelChar(ptCANRx, 1);
- }
- }
- else
- {
- cd_DelChar(ptCANRx, 1);
- }
- }
- }
- //数据解析,忽略命令字表示的数据长度
- void CAN_RxData_Process_Temp(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt)
- {
- uint8_t Mode, CmdLength, DataLength, Data[150], CRC_Buf[150];
- uint16_t Cmd, i;
- uint32_t CrcResult, CrcData;
- uint8_t FrameBegin1, FrameBegin2;
-
- if(ptCANRx->ucBufCnt >= 11)
- {
- //读取帧头
- FrameBegin1 = cd_ReadChar(ptCANRx, 0);
- CRC_Buf[0] = FrameBegin1;
- FrameBegin2 = cd_ReadChar(ptCANRx, 1);
- CRC_Buf[1] = FrameBegin2;
- if((FrameBegin1 == FRAME_BEGIN1) && (FrameBegin2 == FRAME_BEGIN2))
- {
- CRC_Buf[2] = (uint8_t)((ptCANRx->ucBufID >> 8) & 0xFF);
- CRC_Buf[3] = (uint8_t)(ptCANRx->ucBufID & 0xFF);
- //读取帧模式
- Mode = cd_ReadChar(ptCANRx, 2);
- CRC_Buf[4] = Mode;
- if((Mode == MODE_READ) || (Mode == MODE_WRITE) || (Mode == MODE_REPORT))
- {
- //读取命令段长度和命令字
- CmdLength = cd_ReadChar(ptCANRx, 3);
- CRC_Buf[5] = CmdLength;
- Cmd = (cd_ReadChar(ptCANRx, 4) << 8) + cd_ReadChar(ptCANRx, 5);
- CRC_Buf[6] = (uint8_t)((Cmd >> 8) & 0xFF);
- CRC_Buf[7] = (uint8_t)(Cmd & 0xFF);
- DataLength = CmdLength - 2;
- if(ptCANRx->ucBufCnt < (CmdLength + 9))//帧头2bytes + 模式1byte + 命令段长度1byte + 校验位4bytes + 帧尾1byte
- {
- if(ptCANRx->IsWaitRX_Flag == FALSE)
- {
- ptCANRx->DelayTimeCnt = HAL_GetTick();
- ptCANRx->IsWaitRX_Flag = TRUE;
- }
- if((HAL_GetTick() - ptCANRx->DelayTimeCnt) > TimeOutCnt)//超时,单位ms
- {
- cd_DelChar(ptCANRx, ptCANRx->ucBufCnt);
- ptCANRx->IsWaitRX_Flag = FALSE;
- }
- return;
- }
- else
- {
- ptCANRx->IsWaitRX_Flag = FALSE;
- //接收到完整正确数据包
- for(i=0; i<DataLength; i++)//读取数据段
- {
- Data[i] = cd_ReadChar(ptCANRx, 6 + i);
- CRC_Buf[8 + i] = Data[i];
- }
- CrcData = (cd_ReadChar(ptCANRx, 6 + DataLength) << 24) + \
- (cd_ReadChar(ptCANRx, 7 + DataLength) << 16) + \
- (cd_ReadChar(ptCANRx, 8 + DataLength) << 8) + \
- cd_ReadChar(ptCANRx, 9 + DataLength);
- CrcResult = CRC32_Calculate(CRC_Buf, 8 + DataLength);
- if((CrcData - CrcResult) == 0) // 比较校验
- {
- //数据处理
- DataProcess(ptCANRx->ucBufID, Mode, Cmd, Data);//Mode为帧模式,Cmd为命令字,Data为数据段
- cd_DelChar(ptCANRx, CmdLength + 9);
- return;
- }
- cd_DelChar(ptCANRx, 1);
- }
- }
- else
- {
- cd_DelChar(ptCANRx, 1);
- }
- }
- else
- {
- cd_DelChar(ptCANRx, 1);
- }
- }
- }
- void SendData(uint16_t ID, uint8_t Mode, uint16_t Command, uint8_t* Data)
- {
- uint8_t SendBuf[150] = {0};
- uint8_t CRC_Buf[150] = {0};
- uint32_t CRC_Result = 0x00000000;
- uint8_t i;
- uint8_t DataLength;
-
- DataLength = (uint8_t)(Command & 0xFF);
- SendBuf[0] = FRAME_BEGIN1;
- CRC_Buf[0] = SendBuf[0];
- SendBuf[1] = FRAME_BEGIN2;
- CRC_Buf[1] = SendBuf[1];
- CRC_Buf[2] = (uint8_t)((ID >> 8) & 0xFF);
- CRC_Buf[3] = (uint8_t)(ID & 0xFF);
- SendBuf[2] = Mode;
- CRC_Buf[4] = SendBuf[2];
- SendBuf[3] = DataLength + 2;
- CRC_Buf[5] = SendBuf[3];
- SendBuf[4] = (uint8_t)((Command >> 8) & 0xFF);
- CRC_Buf[6] = SendBuf[4];
- SendBuf[5] = DataLength;
- CRC_Buf[7] = SendBuf[5];
-
- for(i = 0;i< DataLength;i++)
- {
- SendBuf[6 + i] = Data[i];
- CRC_Buf[8 + i] = SendBuf[6 + i];
- }
-
- CRC_Result = CRC32_Calculate(CRC_Buf, DataLength + 8);//帧头 2bytes + ID 2bytes + 模式 1byte + 命令段长度 1byte + 命令字 2bytes
-
- SendBuf[6 + DataLength] = (uint8_t)((CRC_Result >> 24) & 0xFF);
- SendBuf[7 + DataLength] = (uint8_t)((CRC_Result >> 16) & 0xFF);
- SendBuf[8 + DataLength] = (uint8_t)((CRC_Result >> 8) & 0xFF);
- SendBuf[9 + DataLength] = (uint8_t)(CRC_Result & 0xFF);
-
- SendBuf[10 + DataLength] = FRAME_END;
-
- CAN_SendData(ID, SendBuf, DataLength + 11);
- }
- /********************End********************/
|