1. DSP28035 CAN固件升级方案概述
在工业控制和汽车电子领域,DSP设备的固件升级一直是个棘手问题。传统方式需要拆机连接JTAG,既费时又容易损坏设备。我们开发的这套基于CAN总线的升级方案,完美解决了这个痛点。方案已经在多个工业现场稳定运行超过2年,累计完成上千次安全升级。
核心架构分为三部分:
- Bootloader固件(CCS10.3.1工程)
- 应用层示例程序(带LED闪烁演示)
- C#开发的上位机工具(VS2013工程)
实测在500Kbps波特率下,升级100KB固件仅需约25秒(含校验时间),比传统JTAG方式快3倍以上。方案特别适合产线批量烧录和现场设备维护,工程师通过CAN盒就能完成整个升级流程。
2. 硬件环境搭建要点
2.1 开发板选型与配置
我们选用的是M新动力DSP28035开发板,这款板子的优势在于:
- 自带CAN收发器(SN65HVD230)
- GPIO30/31已硬件连接至CAN控制器
- 提供完善的电源滤波电路
硬件连接时需注意:
- CAN_H/CAN_L必须使用双绞线
- 总线两端各接120Ω终端电阻
- 推荐使用示波器检查信号质量
实测发现:当传输距离超过20米时,建议将波特率降至250Kbps以确保稳定性
2.2 CAN接口配置细节
在DSP端初始化CAN控制器时,关键寄存器配置如下:
c复制ECanaRegs.CANMC.bit.SCB = 1; // eCAN模式
ECanaRegs.CANMC.bit.CCR = 1; // 进入配置模式
ECanaRegs.CANBTC.bit.BRP = 9; // 波特率预分频
ECanaRegs.CANBTC.bit.TSEG1 = 6;
ECanaRegs.CANBTC.bit.TSEG2 = 1; // 500Kbps @60MHz
GPIO初始化特别注意:
c复制GpioCtrlRegs.GPBMUX1.bit.GPIO30 = 2; // CANRXA
GpioCtrlRegs.GPBMUX1.bit.GPIO31 = 2; // CANTXA
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // 输出模式
3. Bootloader设计与实现
3.1 存储空间规划
Flash分区采用TI推荐的方案:
code复制0x3F8000 - 0x3FFFFF : Bootloader (32KB)
0x3E0000 - 0x3F7FFF : Application (96KB)
0x000000 - 0x3DFFFF : 保留
对应的CMD文件关键配置:
text复制MEMORY {
BOOT_ROM : origin = 0x3F8000, length = 0x008000
APP_ROM : origin = 0x3E0000, length = 0x018000
}
SECTIONS {
.bootloader : > BOOT_ROM
.text : > APP_ROM
}
3.2 固件接收流程
- 启动检测:上电后检查Flash特定标志位
- CAN初始化:配置500Kbps波特率
- 等待指令:超时5秒后自动跳转APP
- 数据接收:使用邮箱4-15作为接收缓冲区
- Flash编程:按扇区擦除后写入
关键代码片段:
c复制#pragma CODE_SECTION(ECAN0INTA_ISR, "ramfuncs");
interrupt void ECAN0INTA_ISR(void) {
Uint16 msgID = ECanaLAMRegs.LAM0.all & 0x3FF;
if(msgID == UPGRADE_CMD_ID) {
process_upgrade_frame();
}
ECanaRegs.CANTA.all = 0xFFFF; // 清除中断
}
4. 上位机开发关键点
4.1 通信协议设计
采用标准CAN2.0B扩展帧格式:
- 帧ID分配:
- 0x180:上位机→设备(命令)
- 0x181:设备→上位机(响应)
- 数据格式:
c复制typedef struct { Uint16 seq; // 包序号 Uint8 data[8]; // 有效数据 Uint16 crc; // CRC16校验 } CAN_FRAME;
4.2 C#实现要点
- 动态库加载:
csharp复制[DllImport("ControlCAN.dll")]
public static extern UInt32 VCI_OpenDevice(UInt32 DevType, UInt32 DevIndex, UInt32 Reserved);
- 数据分包算法:
csharp复制List<byte[]> SplitFirmware(byte[] firmware, int packetSize) {
List<byte[]> packets = new List<byte[]>();
for (int i = 0; i < firmware.Length; i += packetSize) {
int length = Math.Min(packetSize, firmware.Length - i);
byte[] packet = new byte[length + 4]; // 添加包头尾
// 填充数据...
packets.Add(packet);
}
return packets;
}
5. 升级操作全流程
5.1 准备阶段
- 编译生成APP的hex文件
- 连接USBCAN-II到开发板
- 上位机选择对应CAN盒类型
5.2 执行升级
mermaid复制sequenceDiagram
上位机->>DSP: 发送升级指令(0x180)
DSP-->>上位机: 应答准备就绪(0x181)
loop 数据传输
上位机->>DSP: 发送数据包(N)
DSP-->>上位机: 确认接收(N)
end
上位机->>DSP: 发送完成指令
DSP-->>上位机: 升级结果
5.3 验证阶段
- 观察LED指示灯:
- Bootloader模式:D400 1Hz闪烁
- APP模式:D400-402 5Hz同步闪烁
- 通过上位机读取版本号确认
6. 常见问题解决方案
6.1 通信失败排查
- 检查接线:CAN_H→CAN_H,CAN_L→CAN_L
- 确认终端电阻:总线两端各120Ω
- 验证波特率:示波器测量位时间应为2μs@500Kbps
6.2 升级中断处理
- 断电重新上电会自动进入Bootloader
- 上位机支持断点续传(记录最后成功包序号)
- 若Flash损坏,可通过JTAG强制擦除
6.3 性能优化建议
- 增大单包数据量(最大支持8字节)
- 调整跳转等待时间(修改BL_CONFIG.h)
- 关闭调试输出提升速度
7. 进阶开发指导
7.1 多节点升级
- 为每个设备分配唯一ID
- 使用掩码模式过滤报文
- 广播升级时增加延时防止总线冲突
7.2 安全增强
- 添加AES128加密传输
- 实现数字签名验证
- 增加防回滚机制
7.3 量产优化
- 制作自动化测试脚本
- 开发批量升级工具
- 集成到产线测试工装
这套方案在实际项目中表现出色,特别是在汽车ECU升级场景下,其可靠性得到了充分验证。开发者可以根据实际需求调整协议细节和功能配置,建议首次使用时先通过我们提供的测试固件熟悉整个流程。
