提交 b5ec882a 作者: wysheng

TCU升级

上级 e01d7680
#include "TCU_Update.h"
u8 TcuUpDateBuffer[1024]; //TCU升级数据缓存
void TCUUpDateHeartHandle(StructTCUSend * pPgnRecv)
{
......@@ -28,10 +28,12 @@ void TCUUpDateHeartHandle(StructTCUSend * pPgnRecv)
typedef struct
{
u8 type; //设备类型
u8 addr; //设备通信地址
u8 sno; //程序内部编号
u16 ver; //升级目标版本
u8 type;//设备类型
u8 addr;//设备通信地址
u8 sno;//程序内部编号
u16 ver;//升级目标版本
u8 result; //00H:允许下载 01H:禁止下载其它:无效
u8 reason; //00H:无 01H:本身不支持此功能 02H:数据合法性校验失败
} StructStartDownload;
......@@ -62,6 +64,25 @@ void TCUStartDownloadHandle(StructTCUSend * pPgnRecv)
tmp = tmp << 8;
tmp |= pPgnRecv->Data[5];
StartDownload.ver = tmp;
if(StartDownload.type == 0x01) //0x01 --- 直流充电控制器
{
/*if(StartDownload.ver != TCUControlInfo.HardwareVersion) //V5版本
{
StartDownload.result = 0x01;//01H:禁止下载
StartDownload.reason = 0x02;//02H:数据合法性校验失败
}
else*/
{
StartDownload.result = 0x00;//00H:允许下载
StartDownload.reason = 0x00;//
}
}
else
{
StartDownload.result = 0x01;//01H:禁止下载
StartDownload.reason = 0x01;//01H:本身不支持此功能
}
}
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
{
......@@ -74,6 +95,9 @@ void TCUStartDownloadHandle(StructTCUSend * pPgnRecv)
tmp = tmp << 8;
tmp |= pPgnRecv->Data[5];
StartDownload_B.ver = tmp;
StartDownload_B.result = 0x01;
StartDownload_B.reason = 0x01;
}
}
......@@ -90,55 +114,60 @@ void StartDownloadAck(u8 ChgNum)
{
Data[1] = StartDownload.type;
Data[2] = StartDownload.addr;
if(StartDownload.type == 0x01) //0x01 --- 直流充电控制器
{
/*if(StartDownload.ver != 0x0500) //V5版本
{
Data[3] = 0x01;//01H:禁止下载
Data[6] = 0x02;//02H:数据合法性校验失败
}
else*/
{
Data[3] = 0x00;//00H:允许下载
Data[6] = 0x00;//
}
}
else
{
Data[3] = 0x01;//01H:禁止下载
Data[6] = 0x01;//01H:本身不支持此功能
}
Data[3] = StartDownload.result;
Data[4] = 0x03;//0x03:BIN格式
Data[5] = 0x01;//0x01:校验码方案A
Data[6] = StartDownload.reason;
TCUSinglePackSendMsg(Data, 8, eCmd_startDownloadAck, 4, ChargerCont1939Addr);
}
else if (ChgNum == 2)
{
Data[1] = StartDownload_B.type;
Data[2] = StartDownload_B.addr;
Data[3] = 0x01;//01H:禁止下载
Data[3] = StartDownload_B.result;//01H:禁止下载
Data[4] = 0x03;//0x03:BIN格式
Data[5] = 0x01;//0x01:校验码方案A
Data[6] = 0x01;//01H:本身不支持此功能
Data[6] = StartDownload_B.reason;//01H:本身不支持此功能
TCUSinglePackSendMsg(Data, 8, eCmd_startDownloadAck, 4, ChargerCont1939Addr_B);
}
}
typedef struct
{
u8 type;//设备类型
u8 addr;//设备通信地址
u32 ProgramSize;//BIN格式:程序文件总字节数
} StructRequestInterval;
StructRequestInterval RequestIntervalData =
{
0
};
void TCURequestIntervalHandle(StructTCUSend * pPgnRecv)
{
u8 addr = 0;
u32 ProgramSize = 0;
u8 Date[8] = {0};
if (pPgnRecv->DA == ChargerCont1939Addr)
{
if(pPgnRecv->Data[1] == 0x01 )//0x01 --- 直流充电控制器
{
addr = pPgnRecv->Data[2];
memcpy(&ProgramSize,&pPgnRecv->Data[3],4);
RequestIntervalData.type = pPgnRecv->Data[1];
RequestIntervalData.addr = pPgnRecv->Data[2];
memcpy(&(RequestIntervalData.ProgramSize),&(pPgnRecv->Data[3]),4);
TCUCommuStatus.CommStage = RequestIntervalStage;
}
}
}
void TCURequestIntervalAck(void)
{
u8 Date[8] = {0};
//ack1
Date[1] = 0x01;
Date[2] = addr;
Date[1] = RequestIntervalData.type;
Date[2] = RequestIntervalData.addr;
Date[3] = 0x01;
TCUSinglePackSendMsg(Date, 8, eCmd_RequestIntervalAck1, 4, ChargerCont1939Addr);
//ack2
......@@ -146,32 +175,45 @@ void TCURequestIntervalHandle(StructTCUSend * pPgnRecv)
u32 tmp = 480 * 1024;
memcpy(&Date[4],&tmp,4);
TCUSinglePackSendMsg(Date, 8, eCmd_RequestIntervalAck2, 4, ChargerCont1939Addr);
}
}
}
u8 TcuUpDateBuffer[1024];
u32 PackageAddr = 0;
typedef struct
{
u8 type;//设备类型
u8 addr;//设备通信地址
u32 PackageAddr;//分组的首地址
} StructStartPackage;
StructStartPackage StartPackageData =
{
0
};
void TCUStartPackageHandle(StructTCUSend * pPgnRecv)
{
u8 addr = 0;
u8 Date[8] = {0};
if (pPgnRecv->DA == ChargerCont1939Addr)
{
if(pPgnRecv->Data[1] == 0x01 )//0x01 --- 直流充电控制器
{
addr = pPgnRecv->Data[2];
memcpy(&PackageAddr,&pPgnRecv->Data[3],4);
StartPackageData.type = pPgnRecv->Data[1];
StartPackageData.addr = pPgnRecv->Data[2];
memcpy(&StartPackageData.PackageAddr,&pPgnRecv->Data[3],4);
Date[1] = 0x01;
Date[2] = addr;
memcpy(&Date[3],&PackageAddr,4);
TCUSinglePackSendMsg(Date, 8, eCmd_StartPackageAck, 4, ChargerCont1939Addr);
TCUCommuStatus.CommStage = StartPackageStage;
}
}
}
void TCUStartPackageAck(void)
{
u8 Date[8] = {0};
Date[1] = StartPackageData.type;
Date[2] = StartPackageData.addr;
memcpy(&Date[3],&(StartPackageData.PackageAddr),4);
TCUSinglePackSendMsg(Date, 8, eCmd_StartPackageAck, 4, ChargerCont1939Addr);
}
void TCUSendDateHandle(StructTCUSend * pPgnRecv)
{
......@@ -188,6 +230,8 @@ void TCUSendDateHandle(StructTCUSend * pPgnRecv)
}
index = 4*pPgnRecv->Data[3];
memcpy(&TcuUpDateBuffer[index],&(pPgnRecv->Data[4]),4);
TCUCommuStatus.CommStage = SendDateStage;
}
}
}
......@@ -197,102 +241,357 @@ u32 TCUGetPackageChecksum(void)
u32 TCUGetProgramChecksum(void)
{}
typedef struct
{
u8 type;//设备类型
u8 addr;//设备通信地址
u8 result;//0x55:校验失败;0xAA:校验成功;0xFF:擦除失败。
u32 checksum;//整包校验码
} StructCompletePackage;
StructCompletePackage CompletePackageData =
{
0
};
void TCUCompletePackageHandle(StructTCUSend * pPgnRecv)
{
u8 addr = 0;
u32 checksum = 0;
int ret = 0;
u8 Date[8] = {0};
if (pPgnRecv->DA == ChargerCont1939Addr)
{
if(pPgnRecv->Data[1] == 0x01 )//0x01 --- 直流充电控制器
{
addr = pPgnRecv->Data[2];
memcpy(&checksum,&(pPgnRecv->Data[3]),4);
CompletePackageData.type = pPgnRecv->Data[1];
CompletePackageData.addr = pPgnRecv->Data[2];
memcpy(&(CompletePackageData.checksum),&(pPgnRecv->Data[3]),4);
Date[1] = 0x01;
Date[2] = addr;
if(checksum == TCUGetPackageChecksum())
{
Date[3] = 0xaa;//0xAA:校验成功
//write to flash
ret = CopyCode(BakStartAddr+PackageAddr,(u32)TcuUpDateBuffer, 1024);
TCUCommuStatus.CommStage = CompletePackageStage;
if(ret == 0)
{
memcpy(&Date[4],&(PackageAddr),4);
}
else
{
Date[3] = 0xff;//0xFF:擦除失败
}
}
}
else
void TCUCompletePackageAck(void)
{
u8 Date[8] = {0};
Date[1] = CompletePackageData.type;
Date[2] = CompletePackageData.addr;
if(CompletePackageData.result == 0x55)
{
Date[3] = 0x55;//0x55:校验失败
memcpy(&Date[4],&(PackageAddr),4);
memcpy(&Date[4],&(StartPackageData.PackageAddr),4);
}
else if(CompletePackageData.result == 0xAA)
{
Date[3] = 0xaa;//0xAA:校验成功
memcpy(&Date[4],&(StartPackageData.PackageAddr),4);
}
else if(CompletePackageData.result == 0xFF)
{
Date[3] = 0xff;//0xFF:擦除失败
}
TCUSinglePackSendMsg(Date, 8, eCmd_CompletePackageAck, 4, ChargerCont1939Addr);
}
typedef struct
{
u8 type;//设备类型
u8 addr;//设备通信地址
u8 result;//00H:成功 01H:失败 其它:无效
u32 checksum;//需要更新整个程序的校验码
} StructProgramVerification;
StructProgramVerification ProgramVerificationData =
{
0
};
void TCUProgramVerificationHandle(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->DA == ChargerCont1939Addr)
{
if(pPgnRecv->Data[1] == 0x01 )//0x01 --- 直流充电控制器
{
ProgramVerificationData.type = pPgnRecv->Data[1];
ProgramVerificationData.addr = pPgnRecv->Data[2];
memcpy(&(ProgramVerificationData.checksum),&(pPgnRecv->Data[3]),4);
TCUCommuStatus.CommStage = ProgramVerificationStage;
}
}
}
void TCUProgramVerificationHandle(StructTCUSend * pPgnRecv)
void TCUProgramVerificationAck(void)
{
u8 addr = 0;
u32 ProgramChecksum = 0;
u8 Date[8] = {0};
Date[1] = ProgramVerificationData.type;
Date[2] = ProgramVerificationData.addr;
Date[3] = ProgramVerificationData.result;
TCUSinglePackSendMsg(Date, 8, eCmd_ProgramVerificationAck, 4, ChargerCont1939Addr);
}
typedef struct
{
u8 type;//设备类型
u8 addr;//设备通信地址
u8 result;//00H:成功 01H:失败 其它:无效
u8 cmd;//AAH:代表立即重启 其他:无效。
} StructReset;
StructReset TCURest = {0};
void TCUResetHandle(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->DA == ChargerCont1939Addr)
{
if(pPgnRecv->Data[1] == 0x01 )//0x01 --- 直流充电控制器
{
addr = pPgnRecv->Data[2];
TCURest.type = pPgnRecv->Data[1];
TCURest.addr = pPgnRecv->Data[2];
if(pPgnRecv->Data[2] == 0xAA)//AAH:代表立即重启
{
TCURest.cmd = 0xAA;
TCUCommuStatus.CommStage = ResetStage;
}
}
}
memcpy(&ProgramChecksum,&(pPgnRecv->Data[3]),4);
}
void TCUResetAck(void)
{
u8 Date[8] = {0};
Date[1] = TCURest.type;
Date[2] = TCURest.addr;
Date[1] = 0x01;
Date[2] = addr;
Date[2] = TCURest.cmd;//
if(ProgramChecksum == TCUGetProgramChecksum())
TCUSinglePackSendMsg(Date, 8, eCmd_resetAck, 4, ChargerCont1939Addr);
}
void TCUUpdateHandle(void)
{
static EnumTCUCommStage oldStage;
static u32 sendTick = 0;
static u8 sendTimes = 0;
u32 SystemTick = GetSystemTick();
if(oldStage != TCUCommuStatus.CommStage)
{
sendTick = 0;
sendTimes = 0;
oldStage = TCUCommuStatus.CommStage;
}
if ((TCUCommuStatus.CommStage == StartDownloadStage))
{
if(SystemTick - sendTick >= 500)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
TCUCommuStatus.ErrData.Value.DataRequestSend = 1;
}
else
{
Date[3] = 0x01;//01H:失败
StartDownloadAck(1);
}
}
}
TCUSinglePackSendMsg(Date, 8, eCmd_ProgramVerificationAck, 4, ChargerCont1939Addr);
if ((TCUCommuStatus.CommStage == RequestIntervalStage))
{
if(SystemTick - sendTick >= 500)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
//TCUCommuStatus.ErrData.Value.DataRequestSend = 1;
}
else
{
TCURequestIntervalAck();
}
}
}
}
if ((TCUCommuStatus.CommStage == StartPackageStage))
{
if(SystemTick - sendTick >= 500)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
void TCUResetHandle(StructTCUSend * pPgnRecv)
{
u8 addr = 0;
u8 Date[8] = {0};
if (pPgnRecv->DA == ChargerCont1939Addr)
//TCUCommuStatus.ErrData.Value.DataRequestSend = 1;
}
else
{
if(pPgnRecv->Data[1] == 0x01 )//0x01 --- 直流充电控制器
TCUStartPackageAck();
}
}
}
if ((TCUCommuStatus.CommStage == SendDateStage))
{
addr = pPgnRecv->Data[2];
TCUCommuStatus.CommStage = SendDateWaitStage;
}
else if(TCUCommuStatus.CommStage == SendDateWaitStage)
{
if(SystemTick - sendTick >= 100)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 1000/100)
{
TCUCommuStatus.CommStage = HeartStage;
Date[1] = 0x01;
Date[2] = addr;
TCUCommuStatus.ErrData.Value.DataSend = 1;
}
if(pPgnRecv->Data[2] == 0xAA)//AAH:代表立即重启
}
}
if ((TCUCommuStatus.CommStage == CompletePackageStage))
{
if(sendTick == 0)
{
if(CompletePackageData.checksum == TCUGetPackageChecksum())
{
CompletePackageData.result = 0xaa;//0xAA:校验成功
//write to flash
int ret = 0;
ret = CopyCode(BakStartAddr+StartPackageData.PackageAddr,(u32)TcuUpDateBuffer, 1024);
if(ret != 0)
{
CompletePackageData.result = 0xff;//0xFF:擦除失败
}
}
else
{
Date[2] = 0xAA;//
CompletePackageData.result = 0x55;//0x55:校验失败
}
}
TCUSinglePackSendMsg(Date, 8, eCmd_resetAck, 4, ChargerCont1939Addr);
if(SystemTick - sendTick >= 500)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
//TCUCommuStatus.ErrData.Value.DataRequestSend = 1;
}
else
{
TCUCompletePackageAck();
}
}
}
if ((TCUCommuStatus.CommStage == ProgramVerificationStage))
{
if(sendTick == 0)
{
if(ProgramVerificationData.checksum == TCUGetProgramChecksum())
{
ProgramVerificationData.result = 0x00;
}
else
{
ProgramVerificationData.result = 0x01;//01H:失败
}
}
if(SystemTick - sendTick >= 500)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
TCUCommuStatus.ErrData.Value.ProgramVerification = 1;
}
else
{
TCUProgramVerificationAck();
}
}
}
if ((TCUCommuStatus.CommStage == ResetStage))
{
if(SystemTick - sendTick >= 500)
{
sendTimes++;
sendTick = SystemTick;
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
//升级成功
UpdateFlagSet(0x414E4747);
osDelay(500);
NVIC_SystemReset();
while(1);
}
else
{
TCUResetAck();
}
}
}
}
void TCUUpdateHandle_B(void)
{
static EnumTCUCommStage oldStage;
static u32 sendTick = 0;
static u8 sendTimes = 0;
if(oldStage != TCUCommuStatus_B.CommStage)
{
sendTick = 0;
sendTimes = 0;
oldStage = TCUCommuStatus_B.CommStage;
}
if ((TCUCommuStatus_B.CommStage == StartDownloadStage))
{
if(GetSystemTick() - sendTick >= 500)
{
sendTimes++;
sendTick = GetSystemTick();
if(sendTimes > 2000/500)
{
TCUCommuStatus_B.CommStage = HeartStage;
}
else
{
StartDownloadAck(2);
}
}
}
}
......@@ -15,5 +15,7 @@ void TCUCompletePackageHandle(StructTCUSend * pPgnRecv);
void TCUProgramVerificationHandle(StructTCUSend * pPgnRecv);
void TCUResetHandle(StructTCUSend * pPgnRecv);
void TCUUpdateHandle(void);
void TCUUpdateHandle_B(void);
#endif /*__TCU_UPDATE_H__*/
......@@ -254,7 +254,7 @@ void ConEMSend(void)
static u32 ConEMSendTick_B = 0;
static u32 ConEMSendEcount_B = 0;
if (TCUCommuStatus.ConEMSendFlag == 1)
if (TCUCommuStatus.ErrData.Mult)
{
if (GetSystemTick() -ConEMSendTick >= 250)
{
......@@ -268,8 +268,17 @@ void ConEMSend(void)
{
ConEMSendTick = 0;
ConEMSendEcount = 0;
if(TCUCommuStatus.ErrData.Value.DCTCUInfor
|| TCUCommuStatus.ErrData.Value.DCTCUMeasu)
{
memset(&TCUCommuStatus, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
}
else
{
TCUCommuStatus.ErrData.Mult = 0;
}
}
}
}
else
......@@ -278,7 +287,7 @@ void ConEMSend(void)
ConEMSendEcount = 0;
}
if (TCUCommuStatus_B.ConEMSendFlag == 1)
if (TCUCommuStatus_B.ErrData.Mult)
{
if (GetSystemTick() -ConEMSendTick_B >= 250)
{
......@@ -292,8 +301,17 @@ void ConEMSend(void)
{
ConEMSendTick_B = 0;
ConEMSendEcount_B = 0;
if(TCUCommuStatus_B.ErrData.Value.DCTCUInfor
|| TCUCommuStatus_B.ErrData.Value.DCTCUMeasu)
{
memset(&TCUCommuStatus_B, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
}
else
{
TCUCommuStatus_B.ErrData.Mult = 0;
}
}
}
}
else
......@@ -587,22 +605,6 @@ void CommutionRunStage(void)
}
if ((TCUCommuStatus.CommStage == StartDownloadStage))
{
if(GetSystemTick() - sendTick >= 500)
{
sendTimes++;
sendTick = GetSystemTick();
if(sendTimes > 2000/500)
{
TCUCommuStatus.CommStage = HeartStage;
}
else
{
StartDownloadAck(1);
}
}
}
oldStage = TCUCommuStatus.CommStage;
}
......@@ -710,24 +712,6 @@ void CommutionRunStage_B(void)
}
if ((TCUCommuStatus_B.CommStage == StartDownloadStage))
{
if(GetSystemTick() - sendTick_B >= 500)
{
sendTimes_B++;
sendTick_B = GetSystemTick();
if(sendTimes_B > 2000/500)
{
TCUCommuStatus_B.CommStage = HeartStage;
}
else
{
StartDownloadAck(2);
}
}
}
oldStage_B = TCUCommuStatus_B.CommStage;
}
......@@ -1218,13 +1202,15 @@ void TCUComm(void const * argument)
DCMeasuring();//遥测
TCUCurChgRecordInterface_A();//启停逻辑处理
VehicleVerificationHandle();
TCUUpdateHandle();
}
if(TCUCommuStatus_B.CommStage < HeartStage)
{
if(TCUCommuStatus_B.ConnectFlag != CONNECT_TIMEOUT)
{
CommutionConfigurationStage_B(); //配置阶段
CommutionConfigurationStage_B();//配置阶段
}
}
......@@ -1236,6 +1222,8 @@ void TCUComm(void const * argument)
DCMeasuring_B(); //遥测
TCUCurChgRecordInterface_B();//启停逻辑处理
VehicleVerificationHandle_B();
TCUUpdateHandle_B();
}
......
......@@ -19,7 +19,16 @@ typedef enum {
ElectLockStage = 6,
PowerControlStage = 7,
ChgInfornQueryStage = 8,
StartDownloadStage = 9,
StartDownloadStage,
RequestIntervalStage,
StartPackageStage,
SendDateStage,
SendDateWaitStage,
CompletePackageStage,
ProgramVerificationStage,
ResetStage,
} EnumTCUCommStage;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论