CAN包装
协议基础依然相同,不再过多介绍,必须先阅读基础消息结构。
针对 CAN 通信,由于有总线仲裁机制的存在,可以不必考虑总线竞争问题,天然支持单对多总线烧录。
对CAN总线的限制
基于协议基础,必须以拓展帧收发 CAN 消息,控制消息(4字节)对应 CAN 帧 ID,额外信息(n字节)对应 CAN 帧数据最多为8个字节。
请求单帧结构
控制消息(4字节) | 额外消息(n字节) |
---|---|
基础消息结构 | 基础消息结构 |
示例帧
/* 控制信息 */
05 FA 04 01 // 此为CAN帧ID
/* 额外消息,无实际意义,握手时控制信息已经可以表达所有有效信息 */
00 01 00 00 00 00 00 00 // 此为CAN帧数据
回复单帧结构
控制消息(4字节) | 回复状态(8字节) |
---|---|
基础消息结构 | 基础消息结构 |
示例帧 对上面握手消息的回复为
/* 控制信息 */
00 FA 80 41 // 此为CAN帧ID
/* 回复状态 */
00 01 00 06 00 00 00 00 // 此为CAN帧数据
单对单烧录流程
沿用基础消息结构中介绍过的最简烧录流程
- 0xFA 命令烧录(或者其他特有命令),此时需要从APP跳入OTA程序
- 0xFA 再次命令烧录,作为ping功能,区别在于回复状态的头两个字节,跳转回复是00 01,而ping是00 02,表达已经在OTA程序中
- 0xF4 擦除指示,将固件需要的部分ROM全部擦掉
- 0xF7 首包指示,指示接下来的烧录起始、烧录长度、烧录校验
- 许多 0xF5 包,符合指示的长度,但是 OTA 会寄存最开始数个字节而不烧录,使得 APP 不完整。
- 反复进行 3、4 直到上位机认为完成
- 此时 OTA 程序自校验是否长度、校验都符合,写入最开始的数个字节,使得 APP 完整。
- 0xF8 上位机发起重启跳转,接收到确认回复,完成烧录
单对多广播烧录流程
在总线上广播烧录,需要解决总线抢占和非烧录机器的静默问题。非烧录机应该进行特定自有的静默态,仅监控接收而不在总线上发送消息,仅对退出静默态的命令进行处理。
- 0xFA 命令烧录(或者其他特有命令),此时需要被烧录机从APP跳入OTA程序,非烧录机进入总线静默。
- 0xF3 命令统计记录,对实际需要烧录的机器进行记录,便于回复的校验。
- 0xFA 再次命令烧录,作为ping功能,区别在于回复状态的头两个字节,跳转回复是00 01,而ping是00 02,表达已经在OTA程序中
- 0xF4 擦除指示,将固件需要的部分ROM全部擦掉
- 0xF7 首包指示,指示接下来的烧录起始、烧录长度、烧录校验
- 许多 0xF5 包,符合指示的长度,但是 OTA 会寄存最开始数个字节而不烧录,使得 APP 不完整。
- 反复进行 3、4 直到上位机认为完成
- 此时 OTA 程序自校验是否长度、校验都符合,写入最开始的数个字节,使得 APP 完整。
- 0xF8 上位机发起重启跳转,接收到确认回复,完成烧录