
前言
版本V1.1
支持硬件:PCAN、创芯科技、周立功两种





升级协议四种
CAN协议三种
1、V0.0模式CAN2.0,最大承载容量256kB
2、V0.1模式CAN2.0,最大承载容量16GB
3、V1.0模式CANFD,最大承载容量128GB
串口协议一种
V0.0模式串口,最大承载容量128GB
但是当前上位机默认容量16MB(给普通的单片机足够用,优点是小巧,对电脑要求小)
调试模式支持串口的XCP(我包装了一下,可以用于RS485总线模式,对指定的地址进行调试控制,类似Debug模式)
CAN通道支持CCP调试
正文

嵌入式固件升级IAP
软件帮助文档 | 当前版本操作与协议参考
|-------------------------------------------------------------------|
| 文档定位本手册说明当前 C# WinForms 程序的实际界面、默认参数、固件加载规则、升级协议、调试功能和常见排错方法。 |
| 项目 | 当前实现 |
|---|---|
| 运行平台 | Windows,程序按 x86 构建 |
| 升级通信 | 串口 / RS485、CAN;CAN 默认使用 PEAK PCAN-USB |
| 调试通信 | 串口 XCP、CAN CCP |
| 固件格式 | HEX、MOT/S-record、ELF、AXF、BIN、COD |
| 文档修订 | 2026-08-10 |
**使用提示:**升级前确认目标板上的 Bootloader 与本手册所述协议版本一致。
章节导航
- 快速开始:从通信配置到升级完成。
- 主界面与参数:串口、CAN、PCAN 和固件边界设置。
- 固件文件:各格式的解析、地址和容量规则。
- 升级协议:串口 52 字节帧与 CAN 8 字节帧。
- 调试模式:变量解析、XCP/CCP 自动读写、工程和记录。
- 故障排查:连接失败、持续重发、变量读取失败等问题。
1. 软件概览
程序用于通过串口 / RS485 或 CAN 总线向目标单片机发送固件。升级采用逐页确认机制:程序发送当前页,收到目标设备返回的匹配 ACK 后才推进到下一页;没有收到有效 ACK 时,按界面设定的等待时间重发当前页。
当前主界面可配置串口 / RS485 和 CAN。项目中保留 USB HID 底层兼容代码,但当前参数设置界面不提供 USB HID 选择;以太网只保留未实现提示,不应作为实际通信方式使用。
|-------------------------------------------------------------------------------------|
| 重要本程序按 x86 构建,ControlCAN.dll、usbcan.dll、hidapi.dll 和 PCANBasic.dll 必须使用 32 位版本。 |
2. 快速开始
- 连接目标板和通信适配器,确认目标板已运行匹配协议的 APP 或 Bootloader。
- 打开"参数设置",选择"串口 / RS485"或"CAN",设置端口、驱动、通道和波特率。
- 在主界面检查设备信息和状态指示,点击"连接";连接成功后状态点变为绿色。
- 点击"选择固件",载入 HEX、MOT、ELF、AXF、BIN 或 COD 文件,查看日志中的字节数和地址范围。
- CAN 模式下核对发送 ID、接收 ID、各自 IDE 和"CAN 帧间隔 (ms)";串口模式下核对板卡代号、位号、软件协议和 ACK 超时。
- 点击"开始升级",等待进度条达到 100% 且日志显示升级完成。升级过程中不要断开设备、关闭程序或修改通信参数。
3. 主界面与参数设置
3.1 主界面控件
| 控件 | 用途 |
|---|---|
| 参数设置 | 打开通信与固件边界设置。连接建立后不能修改,需先断开。 |
| 连接 / 断开 | 打开或关闭当前通信通道,并显示设备描述、端口和波特率。 |
| 选择固件 | 加载并校验固件文件;地址型文件会显示地址范围。 |
| 开始升级 | 创建升级会话,按页发送并等待 ACK。 |
| 升级进度 | 按有效 ACK 推进,显示当前页数、总页数和百分比。 |
| 日志、导出日志、清空日志 | 显示连接、解析、重发、协议错误和完成信息;日志可保存为 TXT。 |
| 调试模式 | 隐藏升级主界面,打开变量调试窗口;调试窗口点击"返回"或"X"后恢复主界面。 |
3.2 串口 / RS485 参数
| 参数 | 当前规则 |
|---|---|
| 串口 | 从系统串口列表读取,显示 COM 号和设备的 FriendlyName / DeviceDesc。 |
| 波特率 | 预置 110、300、600、1200、2400、4800、9600、14400、19200、38400、57600、115200、230400、460800、921600;输入框也允许自定义正整数。单位 bps 固定显示在选项外。 |
| 电路板代号 | 十进制输入,范围 0 到 0xFFFFFF,占总线地址高 24 位。默认 0。 |
| 电路板位号 | 十进制输入,范围 0 到 255,占总线地址低 8 位。默认 0。 |
| 总线地址 | 计算方式为 (电路板代号 << 8) + 电路板位号,在线路上按 32 位小端发送。 |
| 软件协议 | 当前界面仅提供 V0.0,对应协议字段 0。 |
| ACK 超时 | 串口首帧或当前页未收到有效 ACK 时的重发等待,范围 50 到 60000 ms,默认 100 ms。 |
3.3 CAN / PCAN 参数
| 参数 | 当前规则 |
|---|---|
| 设备 | 创芯科技 ControlCAN、周立功 usbcan、PEAK PCAN-USB;当前默认 PEAK PCAN-USB。 |
| 通道 | PCAN 支持通道 1 到 16;其他驱动按设备提供的通道数显示。 |
| 波特率 | 50、100、125、250、500、1000 Kbps,默认 500 Kbps;单位固定为 Kbps。 |
| 发送 CAN ID / IDE | 升级数据帧使用。标准帧 IDE=0 时范围 0x000-0x7FF;扩展帧 IDE=1 时范围 0x00000000-0x1FFFFFFF。 |
| 接收 CAN ID / IDE | ACK 帧使用。必须同时匹配 ID 和 IDE,其他总线帧会被忽略。 |
| CAN 帧间隔 (ms) | 未收到有效 ACK 时的等待 / 重发时间,范围 0 到 60000 ms,当前默认 100 ms;收到有效 ACK 后下一页立即具备发送条件。 |
|----------------------------------------------------------------------------------------------------|
| 默认 CAN首次启动默认模式为 CAN、设备为 PEAK PCAN-USB、波特率 500 Kbps;升级主界面发送 ID 默认 0xF1、接收 ID 默认 0xF2,IDE 默认扩展帧。 |
3.4 固件边界参数
| 参数 | 默认值与作用 |
|---|---|
| APP 起始地址 | 0x08020000。地址型固件的起始地址必须与该值一致;选择地址型固件后程序会按文件起始地址自动更新。 |
| APP 最大容量 | 0x1C0000 字节。用于限制升级镜像;选择地址型固件后当前程序按实际镜像长度更新该值。 |
| 最大读取大小 | 0x1000000 字节,即 16 MiB,用于限制固件文件读取和地址跨度。 |
4. 固件文件与解析规则
| 格式 | 当前实现 |
|---|---|
| Intel HEX (.hex) | 校验每行记录,支持扩展线性地址和扩展段地址;数据按最小地址到最大地址生成连续镜像,空洞填充 0xFF。 |
| Motorola S-record (.mot/.s19/.s28/.s37) | 支持 S1、S2、S3 数据记录;S0、S5、S6、S7、S8、S9 按记录类型处理并校验每行和。 |
| ELF / AXF | 支持 32 位小端 ELF;读取可装载段和已分配节,地址冲突或文件结构越界会拒绝。 |
| BIN (.bin) | 按原始字节读取,不包含起始地址;使用"APP 起始地址"和"APP 最大容量"进行发送边界检查。 |
| COD (.cod) | 按密文二进制读取并保留密文标志;新的串口 IAP 协议拒绝密文固件,CAN/USB 代码路径可继续处理字节流。 |
- 文件扩展名不区分大小写;不要只修改扩展名来转换固件格式。
- 同一地址出现不同数据时视为文件冲突并拒绝载入。
- 地址型文件的连续镜像会包含地址空洞,空洞内容为 0xFF。
- 串口每页 32 字节;CAN 每帧携带 4 字节。协议页数和实际容量还受目标 Bootloader 分区限制。
5. 串口 / RS485 升级协议
串口升级帧采用小端格式。程序以 0xAA 作为帧头,接收端支持拆包、粘包和连续帧;CRC 不正确或字段不匹配的 ACK 不会推进进度。
5.1 上位机发送帧:52 字节
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0 | 帧头 | 固定 0xAA。 |
| 1-4 | 总线地址 | 32 位小端;高 24 位为电路板代号,低 8 位为电路板位号。 |
| 5-6 | 总帧长度 | 固定 52,16 位小端。 |
| 7 | 协议版本 | V0.0 对应 0。 |
| 8 | 命令 | 0 表示升级数据帧。 |
| 9-12 | 总页数 | 32 位小端。 |
| 13-16 | 当前页数 | 从 0 开始,32 位小端。 |
| 17-48 | 程序数据 | 最多 32 字节;最后一页不足部分填 0xFF。 |
| 49 | 有效字节数 | 从 1 到 32,表示本页前部有效数据长度。 |
| 50-51 | CRC16 | 对字节 0 到 49 计算,结果按小端发送。 |
5.2 下位机 ACK:19 字节
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0 | 帧头 | 固定 0xAA。 |
| 1-4 | 总线地址 | 必须与当前升级目标一致。 |
| 5-6 | 总帧长度 | 固定 19,16 位小端。 |
| 7 | 协议版本 | 必须与发送帧一致。 |
| 8 | 状态 | 0:本页接收成功;1:请求重发当前页。 |
| 9-12 | 总页数 | 应与上位机当前会话一致。 |
| 13-16 | 当前页数 | 应与上位机等待确认的页一致。 |
| 17-18 | CRC16 | 对字节 0 到 16 计算,结果按小端发送。 |
5.3 串口会话流程
- 上位机发送当前页;发送首帧时日志会显示完整 52 字节内容及字段解析。
- 在 ACK 超时时间内持续接收串口数据,按帧头和长度字段组帧。
- 校验地址、长度、版本、状态、总页数、当前页和 CRC;全部匹配后进度加 1。
- ACK 状态为 1 或超时,则保持当前页并按 ACK 超时设置重发。
- 最后一页 ACK 有效后进度变为 100%,日志显示完成。
|--------------------------------------------------------------------------|
| 协议提示首帧可能触发目标板擦除 APP 区,ACK 可能明显晚于普通数据页;应通过 ACK 超时和重发机制等待,不要在擦除期间强制退出。 |
6. CAN 升级协议
6.1 发送数据帧:8 字节
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0-1 | 总页数 | 16 位小端。 |
| 2-3 | 当前页数 | 16 位小端,从 0 开始。 |
| 4-7 | 程序数据 | 每帧 4 字节;最后一帧不足部分填 0xFF。 |
6.2 ACK 帧:4 字节
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0-1 | 总页数 | 应与发送帧一致。 |
| 2-3 | 当前页数 | 应与上位机当前等待页一致。 |
6.3 CAN 会话规则
- 发送帧使用界面设置的发送 ID 和发送 IDE,ACK 使用接收 ID 和接收 IDE。
- 接收帧 ID 或 IDE 不匹配时直接忽略,不会误推进页面。
- CAN 页面字段为 16 位,因此当前协议的页数上限为 65535 页;按每页 4 字节计算,单次 CAN 镜像理论上限约 256 KiB,实际还受目标 APP 分区约束。
- "CAN 帧间隔"主要控制未收到有效 ACK 时的重发等待;收到正确 ACK 后下一页立即发送。驱动、目标响应和系统负载会使实际间隔增加。
7. 调试模式
在升级主界面点击"调试模式"后,主界面隐藏并打开"调试"窗口。调试窗口点击"返回"或右上角"X"都会返回升级界面,已有表格、映射文件和工程数据不因返回而清空。
7.1 解析变量地址文件
- 点击"选择解析文件",选择 .a2l、.elf、.axf、.map 或整理好的 .txt。
- 解析成功后,程序生成或加载四列 TXT 映射表:变量名、地址、数据类型、数组维度。
- 点击"地址映射表"可用系统默认程序打开生成的 TXT 文件。
- 新解析文件不会自动把前 5 个变量填入表格;右键表格可执行"添加变量""修改变量""删除变量"。
| 文件 | 可解析内容 |
|---|---|
| A2L | MEASUREMENT、CHARACTERISTIC、AXIS_PTS、BLOB 等定义;可读取常见数据类型和 MATRIX_DIM。 |
| ELF / AXF | 符号地址、DWARF 类型、结构体成员、数组成员和成员路径。 |
| MAP | 数据段、BSS、只读数据和常见链接器符号地址。 |
| TXT | 推荐制表符分隔四列;也兼容两列"变量名 地址"格式。后两列可为空。 |
7.2 变量配置
| 配置项 | 规则 |
|---|---|
| 显示名称 | 可重命名,支持简体中文;只改变调试界面显示,不改变实际符号地址。 |
| 类型 | Boolean、uint_8、int8、uint16、int16、uint32、int32、uint64、int64、single、double。 |
| 权限 | 只读或读写。只有读写变量的值单元格允许编辑。 |
| 单位 | 显示在值的右侧,可填写工程单位。 |
| 读取间隔 | 支持 ms 和 s,换算后最快不得低于 50 ms。 |
| 启用 | 勾选后连接时自动轮询;未勾选的变量保留在表格中但不自动读取。 |
|-----------------------------------------------------------------------------------|
| 写入行为修改"值"单元格并结束编辑后只发送一次写入命令;写入成功会安排一次读取,用下位机实际值刷新显示。读写命令串行执行,避免半双工总线同时发送多条命令。 |
7.3 串口 XCP
串口调试使用当前工程定义的 XCP 传输封装,地址与升级地址相同:高 24 位为电路板代号,低 8 位为电路板位号,全部多字节字段采用小端。
| 传输字段 | 长度 | 说明 |
|---|---|---|
| 帧头 | 2 | 固定 0x55 0xAA。 |
| 版本 | 1 | 当前传输版本 0x01。 |
| 地址 | 4 | 32 位小端板卡地址。 |
| 帧类型 | 1 | 当前命令/响应使用 CTO 类型 0。 |
| 序号 | 1 | 每条命令递增,用于匹配响应。 |
| 负载长度 | 2 | 16 位小端。 |
| XCP 负载 | 1-256 | 包含 PID 和命令参数。 |
| CRC16 | 2 | 覆盖头部和负载,低字节先发送。 |
- 连接命令 PID:0xFF;断开命令 PID:0xFE。
- 读变量使用 SHORT_UPLOAD PID 0xF4,单次读取 1 到 56 字节。
- 写变量使用 SHORT_DOWNLOAD PID 0xED,单次写入 1 到 56 字节。
- 正常响应 PID 为 0xFF,错误响应 PID 为 0xFE;响应必须匹配地址、帧类型和序号。
7.4 CAN CCP
CAN 调试使用 CCP 客户端,当前发送和接收均按标准帧处理,发送 ID 默认 0x7E8,接收 ID 默认 0x7EA。命令响应使用 8 字节 CAN 数据区,并通过字节 1 的计数器匹配请求。
| 命令 | PID | 用途 |
|---|---|---|
| CONNECT | 0x01 | 建立 CCP 会话。 |
| SET_MTA | 0x02 | 设置读写地址。 |
| DNLOAD | 0x03 | 写入数据。 |
| SHORT_UP | 0x0F | 读取数据。 |
| DISCONNECT | 0x07 | 结束 CCP 会话。 |
8. 调试工程与数据记录
8.1 调试工程 (.iapdbg)
- 点击"保存调试工程"保存当前通信参数、解析符号、变量显示名、类型、权限、间隔、启用状态和值。
- 双击 .iapdbg 文件可启动软件并恢复调试界面;程序会注册当前用户范围的文件关联,不需要管理员权限。
- 工程文件内嵌符号映射,因此原始 ELF/A2L/MAP 移动后,已经添加的变量仍可恢复;若需要继续搜索新变量,需保证映射源文件仍可访问。
- 调试窗口关闭时,如果已经打开过工程,会自动保存当前工程。
8.2 记录导出
- 在调试表格勾选需要记录的变量,点击"开始记录";再次点击停止并写入 XLSX。
- 记录文件默认保存到解析文件所在目录,命名格式为"调试yyyy.MM.dd.HH.mm.ss.xlsx"。
- XLSX 中包含时间、序号、变量名称、单位、数据类型和读取间隔;超过单表行数上限时自动分片。
- "打开记录"可打开最近一次生成的记录文件。
9. 日志、进度与错误处理
| 日志内容 | 含义 |
|---|---|
| 连接成功 | 显示驱动、端口/通道和波特率。 |
| 固件载入 | 显示文件名、字节数、地址范围和密文状态。 |
| 开始升级 | 显示总包数、通信 ID/IDE、等待时间或串口地址和 ACK 超时。 |
| 首帧发送内容 | 串口升级首次发送时显示完整 52 字节和字段解析,便于 APP 检测复位帧。 |
| 帧错误 | 记录 CRC 错误、ACK 状态错误、页号不匹配、ID/IDE 不匹配和超时重发。 |
| 升级完成 | 最后一页有效 ACK 后显示完成包数和错误摘要。 |
|------------------------------------------------------------------------------|
| 进度显示进度以有效 ACK 为准。程序后台持续处理通信,界面进度更新按约 50 ms 节流,因此不会因为每个 ACK 都立即刷新窗口而阻塞发送。 |
10. 故障排查
| 现象 | 常见原因 | 处理方法 |
|---|---|---|
| 连接失败 / 找不到串口 | 端口被其他程序占用、驱动未安装或端口号已变化。 | 关闭占用串口的程序,重新插拔设备,在"参数设置"中重新选择带设备信息的 COM 项。 |
| PCAN 初始化失败 | PCAN 驱动、PCANBasic.dll 位数或通道号不匹配。 | 安装 32 位 PCAN-Basic,确认程序为 x86,选择正确的 PCAN 通道和波特率。 |
| CAN 持续重发 | 发送 ID/IDE、接收 ID/IDE、波特率或目标协议不一致。 | 先用 500 Kbps,逐项核对四个 ID/IDE;查看是否收到目标 ACK。 |
| 串口持续重发第 0 页 | 目标正在擦除 APP、总线地址错误、协议版本错误或 APP 未按首帧复位。 | 等待首帧擦除完成;核对代号/位号、V0.0 和 CRC;检查下位机是否收到 0xAA 首帧并跳转 Bootloader。 |
| 固件载入失败 | 格式校验失败、地址冲突、地址跨度过大或文件超过最大读取大小。 | 重新导出真实格式文件,检查 HEX/MOT 校验和和 ELF/AXF 是否为 32 位小端。 |
| 调试连接超时 | 目标未运行 XCP/CCP、调试地址或 CAN ID 错误。 | 先确认目标程序已注册对应协议处理函数,再核对 XCP 板卡地址或 CCP 收发 ID。 |
| 变量读取报地址或长度错误 | 变量地址超过 32 位、类型长度与实际内存不一致或结构体成员地址无效。 | 重新解析 ELF/AXF/A2L,修改变量类型和数组维度,确认目标程序链接地址与下载地址一致。 |
| 写入后值立即变化 | 目标程序周期任务又改写了变量,或变量被配置为只读/受保护。 | 确认变量权限为读写,暂停目标周期写入逻辑,观察写入后自动回读值。 |
11. 使用前检查清单
- 目标板供电稳定,通信线 A/B 或 CANH/CANL 接线正确,地线共地。
- 串口:COM 号、波特率、板卡代号、位号、协议 V0.0 和 ACK 超时正确。
- CAN:PCAN 通道、波特率、发送/接收 ID、发送/接收 IDE 正确。
- 固件:格式真实有效,起始地址与 APP 分区匹配,文件大小未超过目标容量。
- 升级期间:不要切换窗口中的通信参数,不要让其他软件占用同一通信设备。
- 调试期间:变量地址来自当前构建产物,类型和数组长度与下位机声明一致。
|---------------------------------------------------------------------------------------------------|
| 版本边界本手册描述的是当前 C# WinForms 工程的实际实现。若下位机更改帧布局、CRC、APP 起始地址、CAN 页字段或 XCP/CCP 命令处理,必须同步更新上位机和本手册。 |
12. V1.1 版本设置
本版本保留经典 CAN V0.0、经典 CAN V0.1 和 CAN FD V1.0 升级协议。主界面的"版本号"用于选择升级协议;"关于"窗口显示上位机软件版本 V1.1。
12.1 CAN FD 数据波特率
在"参数设置 → CAN"中,周立功 USBCANFD-200U 的 CAN FD 数据波特率新增 8000 Kbps。只有"调试模式 CAN FD"选择"启用"时,才显示"CAN FD 数据波特率"选项;选择"不启用"时隐藏该选项。隐藏不会清除已保存的数据波特率。仲裁波特率仍由"波特率"单独设置。
12.2 经典 CAN V0.1 的 ACK 应答时间
主界面选择 CAN V0.1 后,显示"CAN 帧间隔 (ms)"和"ACK 应答时间 (ms)"。ACK 应答时间与串口要求一致:50~60000 ms,默认 100 ms。发送前置帧、起始帧或数据帧后,超过 ACK 应答时间仍未收到正确反馈时,重发当前帧。收到正确反馈后,按 CAN 帧间隔控制相邻发送帧的最短间隔,再发送下一帧。
13. 经典 CAN V0.1 升级协议
协议版本号为 0x01,使用经典 CAN 2.0 的 8 字节数据帧。上位机采用已设置的发送 CAN ID 和 IDE,下位机反馈采用已设置的接收 CAN ID 和 IDE。先进行前置帧确认,再发送起始帧和固件数据帧;每步收到与当前发送帧完全匹配的反馈后才能继续。V0.0 协议保持独立可用。
13.1 前置帧 上位机发送与下位机反馈
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0 | 帧头 | 固定 0xAA。 |
| 1 | 协议版本 | 固定 0x01,表示经典 CAN V0.1。 |
| 2--4 | 电路板代号 | 24 位小端:低位字节在前,高位字节在后。 |
| 5 | 电路板位号 | 8 位无符号整数。 |
| 6--7 | CRC16 | 对字节 0--5 计算;计算方法见第 15 章,结果按 16 位小端写入。 |
反馈必须逐字节回显完整的 8 字节前置帧,包括 CRC16。CRC、板号、位号或版本不匹配时,不发送起始帧;等待正确反馈或在 ACK 应答时间到期后重发前置帧。
13.2 起始帧 上位机发送与下位机反馈
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0--3 | 当前页号 | 32 位小端,固定为 0。 |
| 4--7 | 固件数据帧总数 | 32 位小端;N = 固件字节数向上取整除以 4,不包含前置帧和起始帧。 |
下位机反馈须逐字节回显该 8 字节起始帧。只有页号为 0 且总帧数与本次升级一致,才发送第 1 帧固件数据。
13.3 数据帧 上位机发送与下位机反馈
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0--3 | 当前页号 | 32 位小端;数据帧从 1 开始编号,依次为 1 至 N。 |
| 4--7 | 固件数据 | 每帧 4 字节;最后一帧不足 4 字节时,其余位置填 0xFF。 |
下位机反馈须逐字节回显当前 8 字节数据帧。页号或数据不一致时保持当前页,不推进进度;ACK 应答时间到期后重发。最后一帧的正确反馈收到后,升级完成。
13.4 会话与时间参数
ACK 应答时间为 50~60000 ms,默认 100 ms。每次发送后等待正确反馈;等待超时则重发同一帧。CAN 帧间隔为相邻两次发送之间的最短时间,范围 0~60000 ms,默认 100 ms;收到正确反馈后也须满足这一间隔才发送下一帧。第 13 章各帧均为 8 字节,起始帧和数据帧自身没有 CRC 字段。
14. CAN FD V1.0 升级协议
协议版本号为 0x10。该协议将原有串口 IAP 帧原样承载在 CAN FD 数据区中,使用主界面设置的发送和接收 CAN ID、IDE;仲裁波特率与数据波特率分别设置。每页承载最多 32 字节固件数据,页号从 0 开始。
14.1 上位机发送帧 52 字节协议数据
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0 | 帧头 | 固定 0xAA。 |
| 1--4 | 目标地址 | 32 位小端;高 24 位为电路板代号,低 8 位为电路板位号。 |
| 5--6 | 协议帧长度 | 16 位小端,固定 52。 |
| 7 | 协议版本 | 固定 0x10。 |
| 8 | 命令 | 固定 0,表示升级数据帧。 |
| 9--12 | 总页数 | 32 位小端;固件字节数向上取整除以 32。 |
| 13--16 | 当前页号 | 32 位小端,从 0 开始。 |
| 17--48 | 固件数据 | 最多 32 字节;末页不足部分填 0xFF。 |
| 49 | 有效字节数 | 当前页实际固件字节数,范围 1~32,不计填充。 |
| 50--51 | CRC16 | 对协议字节 0--49 计算;计算方法见第 15 章,结果按 16 位小端写入。 |
CAN FD 的有效物理载荷长度没有 52 字节档位,因此发送时扩展至 64 字节,协议字节 52--63 填 0xFF。CRC 只覆盖 52 字节协议帧的前 50 字节,不包含 CRC 字段或物理填充。
14.2 下位机 ACK 19 字节协议数据
| 字节范围 | 字段 | 说明 |
|---|---|---|
| 0 | 帧头 | 固定 0xAA。 |
| 1--4 | 目标地址 | 32 位小端,必须与当前目标一致。 |
| 5--6 | 协议帧长度 | 16 位小端,固定 19。 |
| 7 | 协议版本 | 固定 0x10。 |
| 8 | 状态 | 0 为接收成功;1 为请求重发当前页。其他值无效。 |
| 9--12 | 总页数 | 32 位小端,必须与本次升级一致。 |
| 13--16 | 当前页号 | 32 位小端,必须对应当前等待确认的页。 |
| 17--18 | CRC16 | 对协议字节 0--16 计算;计算方法见第 15 章,结果按 16 位小端写入。 |
ACK 在 CAN FD 总线上使用 20 字节物理载荷;协议只检查前 19 字节,尾部 1 字节为物理填充。只有 ID、IDE、地址、帧长、版本、CRC、总页数和页号匹配且状态为 0 时才推进一页。状态 1 请求重发当前页;没有有效 ACK 时按 ACK 应答时间重发。
14.3 会话规则
每次只发送当前页并等待反馈。ACK 应答时间为 50~60000 ms,默认 100 ms;超时后重发同一页。最后一页得到有效成功 ACK 后,进度达到 100%。CAN FD V1.0 与经典 CAN V0.0、V0.1 由主界面的版本号分别选择。
15. CRC16 计算方法
V0.1 前置帧和 V1.0 协议帧沿用现有 CRC16 算法。初值为 0xFFFF,逐字节处理,低位在先;每个字节先与当前 CRC 的低 8 位异或,再循环 8 次:若当前 CRC 最低位为 1,则右移 1 位后与 0xA001 异或;否则仅右移 1 位。每一步结果限制为 16 位。全部输入字节处理结束后,交换结果的高、低字节,再以 16 位小端写入帧的 CRC 字段。
示例:输入 ASCII "123456789" 的 9 个字节,逐位计算后为 0x4B37;交换后返回 0x374B;按小端写入的两个 CRC 字节为 0x4B、0x37。不能直接把未交换的 0x4B37 按小端写入。
| 字节范围 | 字段 | 说明 |
|---|---|---|
| V0.1 前置帧 | 字节 0--5 | CRC 写在字节 6--7。 |
| V1.0 发送帧 | 字节 0--49 | CRC 写在字节 50--51;64 字节物理填充不参加计算。 |
| V1.0 ACK | 字节 0--16 | CRC 写在字节 17--18;20 字节物理填充不参加计算。 |