1. 项目背景与核心需求
最近在工业控制领域完成了一个基于DSP28335的CAN总线固件升级系统开发,这个项目最大的特点是从底层Bootloader到上位机软件全部采用自主开发模式。之所以选择完全自研路线,主要考虑到工业现场对设备可靠性和协议可控性的严苛要求。
在传统工业设备维护中,固件升级往往需要拆机后用JTAG或串口连接,这种操作既影响产线效率又存在安全隐患。我们设计的这套系统实现了以下核心功能:
- 通过CAN总线完成DSP28335程序烧录
- 支持断点续传和校验重传机制
- 具备版本回滚功能
- 上位机可记录完整的升级日志
这套系统目前已在某大型生产线上的电机控制器批量应用,实测单节点升级时间控制在90秒内(1MB固件),误码率低于0.001%。下面具体拆解各模块的实现要点。
2. 系统架构设计
2.1 整体通信流程
采用主从式架构,上位机作为主节点,DSP设备作为从节点。通信过程分为四个阶段:
- 握手阶段(波特率自适应)
- 元数据传输(固件大小/版本号)
- 数据分包传输(每包512字节)
- 校验与跳转
c复制// DSP端状态机示例
typedef enum {
BOOT_WAIT_HANDSHAKE,
BOOT_RECV_METADATA,
BOOT_RECV_DATA,
BOOT_VERIFY,
BOOT_JUMP
} BootState;
2.2 协议栈设计
在CAN2.0B基础上自定义应用层协议:
- 帧ID分配:
- 0x180:上位机→DSP(命令帧)
- 0x181:DSP→上位机(响应帧)
- 数据帧结构:
- Byte0:包类型(0x01握手/0x02数据/0x03校验)
- Byte1-2:包序号(大端序)
- Byte3-7:数据载荷
注意:工业现场CAN总线负载率建议控制在30%以下,我们的方案采用动态间隔发送(基础间隔5ms,根据总线负载自动调整)
3. Bootloader实现细节
3.1 启动流程优化
DSP28335的Bootloader存储在FLASH Sector0(0x3F8000-0x3FFFFF),上电后执行流程:
- 初始化PLL和时钟(60MHz→120MHz)
- 配置CAN控制器(1Mbps,使用GPIO30/31)
- 检查升级触发条件(检测特定GPIO电平)
- 进入通信等待或直接跳转APP
assembly复制; 关键跳转指令(在RAM中执行)
MOVW DP, #_AppEntryAddr
MOVL XAR7, @_AppEntryAddr
LCR *XAR7
3.2 内存管理策略
采用双Bank设计防止升级失败变砖:
- BankA:当前运行版本(0x000000-0x1FFFFF)
- BankB:新版本缓存区(0x200000-0x3D7FFF)
- 使用FLASH API实现页擦除和编程:
c复制Flash_Erase(BANK_B_START, SECTOR_SIZE);
Flash_Program((Uint32*)dataBuf, targetAddr, len);
3.3 安全机制
- 固件签名:ECDSA-P256算法验证
- 完整性校验:每包CRC16+整体SHA256
- 看门狗防护:独立WDT监控通信超时
4. 上位机开发要点
4.1 开发框架选择
采用Qt5+C++实现跨平台支持,主要模块:
- CAN通信层(使用PCAN-USB库)
- 协议解析引擎
- 图形界面(显示进度/错误代码)
- 日志系统(SQLite本地存储)
cpp复制// CAN消息发送示例
TPCANMsg msg;
msg.ID = 0x180;
msg.LEN = 8;
msg.MSGTYPE = MSGTYPE_STANDARD;
CAN_Write(PCAN_USBBUS1, &msg);
4.2 断点续传实现
通过三个关键文件保证升级可恢复:
- 任务配置文件(.cfg):记录目标节点列表
- 进度文件(.progress):实时保存各节点传输进度
- 校验文件(.verify):存储各包CRC校验值
5. 文件系统规范
5.1 固件打包格式
使用自定义.binpack格式,包含:
- 16字节文件头(含版本/时间戳)
- 2MB程序段(按512字节分块)
- 64字节签名区
- 32字节尾校验
code复制文件结构示例:
[HEADER][DATA_BLOCK0]...[DATA_BLOCKN][SIGNATURE][FOOTER]
5.2 版本管理规则
版本号定义:V<主版本>.<次版本>.<修订号>-<编译日期>
示例:V2.1.8-230815表示2023年8月15日编译的第2大版本第1小版本第8次修订
6. 实测问题与解决方案
6.1 典型故障案例
-
问题:产线EMI导致CAN通信丢包
解决:增加硬件滤波(共模扼流圈)+软件重试(最多3次) -
问题:DSP FLASH写入失败
解决:在编程前增加50ms延时,确保电荷泵稳定 -
问题:上位机卡死在99%
解决:优化进度回调机制,采用双线程更新UI
6.2 性能优化记录
通过以下调整将升级速度提升40%:
- CAN报文从标准帧改为扩展帧(增加有效载荷)
- DSP端DMA接收改为中断模式
- 上位机采用批量发送(每次发5包后等待ACK)
7. 工程管理建议
-
版本控制:Git仓库包含以下分支
- master:发布版本
- dev:功能开发
- hotfix:紧急修复
-
测试流程:
- 单元测试(CppUTest)
- 硬件在环测试(CANoe仿真)
- 现场老化测试(连续72小时运行)
-
文档规范:
- 代码注释必须包含修改记录
- 关键算法需有流程图说明
- 版本发布时附带测试报告
这套系统经过半年实际验证,已完成超过2000次现场升级操作。对于需要自主开发CAN升级方案的工程师,建议重点关注Bootloader的鲁棒性和上位机的异常处理机制,这两个环节往往决定整个系统的可靠性水平。