3. 诊断通信底层基础
UDS(ISO 14229)定义的是诊断服务语义,它本身并不关心报文如何从诊断仪送到ECU。真正把一条长度可达数千字节的诊断请求拆成总线可承载的帧、并在接收端还原回来的,是传输层协议。在CAN/CAN FD上这一层是ISO 15765-2(俗称ISO-TP),在以太网上则是ISO 13400(DoIP)。理解这两条路径的帧结构、流控与重组机制,是后续读懂刷写时序、定位超时与丢包问题的前提。
一、CAN与CAN FD帧结构差异
经典CAN帧由帧起始、仲裁段(含11位或29位标识符)、控制段(DLC,0~8字节)、数据段、CRC、ACK与帧结束组成。CAN FD在控制段引入FDF位区分格式、BRS位切换数据段波特率、ESI位指示错误状态,DLC采用非线性编码,可表达0~8、12、16、20、24、32、48、64字节。对诊断而言,最直接的影响是单帧可携带的有效数据量:经典CAN一帧最多8字节,CAN FD最多64字节。
ISO-TP在两种帧格式下的寻址方式一致:11位标识符时用物理寻址(如0x7E0发、0x7E8收)与功能寻址(如0x7DF);29位标识符时通过标识符中的地址扩展字段区分源与目标。诊断报文的首字节是PCI(协议控制信息),高4位为帧类型,低4位配合后续字节表达长度或序号。
二、ISO-TP四种帧类型与分包重组
ISO-TP定义了四种PCI类型:单帧(SF,0x0)、首帧(FF,0x1)、连续帧(CF,0x2)、流控帧(FC,0x3)。当数据长度不超过单帧容量(经典CAN为7字节,CAN FD在普通寻址下为62字节)时用SF直接发送;超长时发送方先发FF,其中12位(经典CAN)或32位(CAN FD)长度字段声明总长度,接收方回FC,发送方再按序发CF。
流控帧包含三个关键参数:FS(流状态,0=CTS继续发送、1=WAIT等待、2=OVFLW溢出)、BS(Block Size,允许连续发送的CF数量,0表示不再需要流控)、STmin(连续帧最小间隔,单位ms或100µs)。接收方通过BS和STmin控制发送节奏,避免接收缓冲区溢出。发送方每发完BS个CF后必须等待下一个FC,CF的序号SN在0~15之间循环,接收端据此检测丢帧。
上图为一次典型的多帧请求过程。需要特别注意的是,STmin 与 BS 由接收方决定,发送方必须遵守;若接收方处理能力弱,可先回 FS=1(WAIT),发送方需等待下一个 FC 再继续。若接收缓冲区不足,回 FS=2(OVFLW),本次传输终止。工程中常见的“刷写到 90% 卡死”,多数是 BS/STmin 配置与 ECU 接收能力不匹配,或 CF 序号错乱导致接收端静默丢弃。
三、DoIP在Continental新一代EE架构中的角色
随着域集中式与中央计算架构的普及,Continental 新一代 EE 架构普遍采用“中央网关 + 域控制器 + 区域控制器”的拓扑,诊断入口从 OBD 口的 CAN 逐步转向以太网。DoIP(ISO 13400)在 TCP/IP 之上承载 UDS,报文由 DoIP 头(协议版本、反码、载荷类型、载荷长度)加 UDS 数据组成,常见载荷类型包括 0x8001 车辆识别请求/响应、0x8002 带激活线的诊断报文、0x8003 诊断报文。相比 ISO-TP,DoIP 单包可携带数 KB 数据,天然适合大容量刷写与远程诊断。
选型依据可归纳为三点:一是带宽,CAN FD 理论 8Mbps 但实际有效载荷受仲裁与流控限制,而 100BASE-TX 可稳定提供数十 Mbps,刷写 20MB 固件的时间从数十分钟缩短到数分钟;二是拓扑适配,中央计算架构下 ECU 不再共享一条总线,DoIP 通过 IP 寻址天然支持跨域路由;三是可扩展性,DoIP 支持车辆发现、路由激活、多客户端并发,便于产线并行刷写与 OTA 场景。但 DoIP 并非完全取代 CAN,安全气囊、底盘等对确定性与成本敏感的节点仍保留 CAN/CAN FD 诊断,形成“以太网为主干、CAN 为末端”的混合诊断链路。
四、关键参数速查
| 参数 | 经典CAN | CAN FD | DoIP |
|---|---|---|---|
| 单帧最大有效数据 | 7 字节(普通寻址) | 62 字节(普通寻址) | 受 TCP 窗口与 MTU 限制,通常数 KB |
| 长度字段位宽 | 12 位(FF) | 32 位(FF) | DoIP 头 32 位载荷长度 |
| 流控机制 | FC 帧 BS/STmin | FC 帧 BS/STmin | TCP 滑动窗口 + DoIP 路由激活 |
| 典型诊断标识符 | 0x7E0/0x7E8 | 0x7E0/0x7E8 | 逻辑地址 + IP:port |
掌握上述帧结构、流控参数与 DoIP 定位后,再去看刷写流程中的 0x34/0x36/0x37 服务时序,就能理解为什么每个 Block 之间要等待流控、为什么 STmin 设置过小会导致 ECU 返回 NRC 0x21(busyRepeatRequest),以及为什么在 DoIP 链路上需要关注 TCP 重传与路由激活超时。这些底层细节,正是后续排障与性能调优的抓手。