4. 刷写升级基础

刷写升级(Flashing / Reprogramming)是指通过车辆外部或内部通信接口,将新的应用程序、标定数据或完整固件映像写入 ECU 非易失性存储器的过程。在 AURIX 平台上,它通常意味着对 PFlash(程序 Flash)与 DFlash(数据 Flash)进行擦除、编程与校验,并可能涉及 UCB、HSM 或 Bootloader 自身区域的更新。理解刷写升级,不能只停留在“把 hex 文件烧进去”,而要同时看清三条主线:诊断协议如何描述操作、传输层如何搬运数据、刷写流程如何分阶段推进。

一、刷写升级的定义与边界

从工程视角看,刷写升级包含三个层次:

  • 逻辑层:由 UDS 诊断服务定义“做什么”,例如进入编程会话、请求下载、传输数据、退出传输、检查完整性。
  • 传输层:由 CAN、CAN-FD 或 Ethernet 承载诊断报文,解决分包、流控、寻址与超时问题。
  • 执行层:由 AURIX 内部 Flash 驱动、Bootloader 与安全机制完成擦除、写入、校验和跳转。

因此,刷写升级不是单一工具行为,而是“诊断协议 + 传输层 + 目标端 Bootloader + Flash 驱动”的协同结果。任何一层不匹配,都会表现为刷写失败、校验错误或升级后无法启动。

二、UDS/OBD 诊断协议在刷写中的角色

OBD 更偏向排放与法规相关的通用诊断,而 UDS(ISO 14229)是刷写升级中最核心的应用层协议。UDS 通过服务标识符(SID)和子功能组织操作,刷写场景中常见服务如下:

UDS 服务 SID 刷写中的作用
DiagnosticSessionControl 0x10 切换到编程会话(0x02),使 ECU 进入可刷写状态
ECUReset 0x11 复位 ECU,跳转到 Bootloader 或新程序
SecurityAccess 0x27 通过种子-密钥解锁刷写权限
RequestDownload 0x34 声明数据长度与地址,准备接收固件
TransferData 0x36 分块传输固件数据
RequestTransferExit 0x37 结束数据传输
RoutineControl 0x31 执行擦除、校验、依赖检查等例程

这些服务通常以请求-响应方式交互,正响应为 SID+0x40,负响应为 0x7F 加 NRC 错误码。刷写工具必须根据 NRC 判断是重试、降速还是终止流程。

三、CAN / CAN-FD / Ethernet 传输层对比

UDS 报文本身不能直接在总线上无限长传输,必须由传输层适配。经典 CAN 使用 ISO-TP(ISO 15765-2),单帧最多 8 字节;CAN-FD 将数据场扩展到 64 字节,显著提升吞吐;Ethernet 则通常使用 DoIP(ISO 13400)承载 UDS,适合大文件高速刷写。

刷写升级三层协同:诊断服务 → 传输承载 → AURIX 执行 UDS 应用层 ISO 14229 0x10 编程会话 0x27 安全访问 0x34/0x36/0x37 下载 0x31 擦除/校验 0x11 ECU 复位 传输层 承载与分包 CAN / ISO-TP 单帧 ≤ 8 字节 CAN-FD / ISO-TP 数据场 ≤ 64 字节 Ethernet / DoIP 大文件高速刷写 AURIX 执行层 Bootloader + Flash PFlash 擦除/编程 DFlash 标定数据 UCB / HSM 配置 CRC / 签名校验 跳转新应用 UDS 报文 数据流 响应 / NRC 反馈

选择传输层时,需要同时考虑固件大小、刷写时间窗口、总线负载和 ECU 支持能力。CAN-FD 在 2 Mbps 数据段下比经典 CAN 快数倍,而 DoIP 在 100 Mbps 以太网上更适合几十 MB 级固件。

四、刷写流程概览与典型阶段

一次完整的刷写升级通常分为以下阶段:

  1. 预编程:读取车辆信息、检查电压、关闭无关通信,确保刷写条件满足。
  2. 进入编程会话:发送 0x10 0x02,ECU 切换到 Bootloader 或编程模式。
  3. 安全解锁:通过 0x27 获取种子并计算密钥,获得擦写权限。
  4. 擦除与下载:使用 0x31 擦除目标区域,0x34 声明地址与长度,0x36 分块传输,0x37 结束。
  5. 校验与复位:执行 CRC、签名或依赖检查,最后 0x11 复位并跳转新程序。

典型刷写日志片段:

10 02           -> 50 02       进入编程会话
27 01           -> 67 01 5A 3C 请求种子
27 02 9F 21     -> 67 02       发送密钥,解锁成功
31 01 FF 00     -> 71 01 FF 00 擦除例程
34 00 44 00 00 20 00 00 -> 74 20 00 20 请求下载 2MB
36 01 ...       -> 76 01       传输数据块
37              -> 77          退出传输
31 01 FF 01     -> 71 01 FF 01 校验例程
11 01           -> 51 01       复位 ECU

五、案例与常见误区

某项目使用 CAN-FD 刷写 AURIX TC3xx,工具在 TransferData 阶段频繁收到 NRC 0x73(块序号错误)。排查发现,工具在收到流控帧后连续发送了多个连续帧,但未按 STmin 间隔发送,导致 ECU 接收缓冲区溢出。将 STmin 从 0 调整为 2 ms 后,刷写稳定通过。这说明传输层参数与 ECU 接收能力必须匹配。

常见误区:

  • 只关注 UDS 服务顺序,忽略 ISO-TP 的流控与超时参数。
  • 在编程会话中未关闭应用报文,导致总线负载过高、刷写超时。
  • 擦除范围覆盖了 Bootloader 自身或 UCB,造成 ECU 无法再次进入刷写模式。
  • 校验只做长度检查,未做 CRC 或签名验证,导致“刷写成功但运行异常”。

复盘要点:刷写升级的稳定性来自三层对齐——UDS 服务序列正确、传输层参数匹配、AURIX Flash 操作与安全机制一致。调试时应先确认会话与安全访问,再检查传输层流控,最后验证擦写与校验结果。