2、UDS协议栈:从物理层到应用层的完整拆解
做诊断开发这些年,我见过不少工程师一上来就盯着应用层的DID和DTC,结果遇到通信问题就抓瞎。说白了,UDS能跑起来,靠的是下面几层协议栈的默契配合。今天我就带你把这五层结构拆开看看。
2.1 协议栈全景:五层架构
UDS协议栈遵循OSI七层模型的简化版,在汽车领域我们通常只看五层。我习惯把它比作一个快递系统——物理层是公路,数据链路层是交通规则,网络层是分拣中心,会话层是客服,应用层才是你填的快递单。
这张图我建议你存下来。每次遇到诊断通信问题,先定位是哪一层出的问题,比瞎猜高效得多。
2.2 物理层:信号的基础
物理层负责把0和1变成电信号。在CAN总线里,就是CAN_H和CAN_L两根线的差分电压。说白了,这一层不关心你传的是什么数据,只关心信号能不能从A点完整到B点。
| 参数 | 高速CAN(ISO 11898-2) | 低速CAN(ISO 11898-3) |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 总线长度 | ≤ 40 m @ 1 Mbps | ≤ 500 m |
| 显性电平 | CAN_H ≈ 3.5V, CAN_L ≈ 1.5V | CAN_H ≈ 3.6V, CAN_L ≈ 1.4V |
| 隐性电平 | CAN_H ≈ 2.5V, CAN_L ≈ 2.5V | CAN_H ≈ 1.5V, CAN_L ≈ 3.6V |
| 终端电阻 | 120 Ω(两端) | 无固定终端 |
2.3 数据链路层:CAN帧的规矩
数据链路层负责把物理层的比特流组织成有意义的帧。CAN 2.0标准定义了两种帧格式:标准帧(11位ID)和扩展帧(29位ID)。UDS诊断通常使用扩展帧,因为需要更多的地址空间。
一个CAN数据帧的结构是这样的:
SOF | 仲裁场(11/29位ID + RTR + IDE) | 控制场(4位DLC) | 数据场(0-8字节) | CRC场(15位) | ACK场 | EOF
嗯,这里要注意:UDS的请求和响应,就是塞在数据场这0-8个字节里的。如果诊断数据超过8字节,就得靠网络层来分包了。
2.4 网络层:ISO 15765-2的核心
网络层是UDS协议栈里最容易被忽视、但也是最容易出问题的一层。它负责把超过8字节的诊断消息拆成多个CAN帧发送,再在接收端重组。这个机制叫多帧传输。
ISO 15765-2定义了四种协议数据单元(PDU)类型:
- 单帧(SF):数据长度 ≤ 7字节,一帧搞定
- 首帧(FF):多帧传输的第一帧,包含总数据长度
- 连续帧(CF):后续的数据帧,带序列号
- 流控制帧(FC):接收方告诉发送方“慢点发”或“继续发”
多帧传输的流程,我画了个图:
2.5 会话层:状态机与定时器
会话层管理诊断会话的状态。UDS定义了三种会话:默认会话(Default Session)、扩展会话(Extended Session)和编程会话(Programming Session)。ECU上电后默认在默认会话,只有切换到扩展或编程会话才能执行某些敏感服务(比如写入数据、刷写固件)。
会话层还负责三个定时器:
| 定时器 | 默认值 | 作用 |
|---|---|---|
| P2_Server | 50 ms | ECU处理请求的最大时间(正常响应) |
| P2*_Server | 5000 ms | ECU处理请求的最大时间(需要额外时间时,先发NRC 0x78) |
| S3_Server | 5000 ms | 会话超时时间,超时后自动回到默认会话 |
2.6 应用层:UDS服务
应用层就是我们最熟悉的UDS服务了。ISO 14229-1定义了六大类服务,每个服务用一个SID(Service Identifier)标识:
- 诊断和通信管理(0x10~0x3E):会话控制、ECU复位、安全访问、通信控制等
- 数据传输(0x22~0x2E):读取/写入DID、读取内存等
- 存储数据传输(0x14~0x19):读取/清除DTC、读取DTC信息等
- 输入输出控制(0x2F):控制外部输出信号
- 例程(0x31):启动/停止/请求例程结果
- 上传下载(0x34~0x37):固件刷写、数据上传下载
一个典型的UDS请求格式是这样的:
请求:SID + Sub-function + 数据参数
响应:SID+0x40 + 数据参数(肯定响应)
0x7F + SID + NRC(否定响应)
2.7 各层之间的协作
你想想看,当诊断仪发送一个“读取VIN码”的请求时,数据是怎么从应用层一路走到物理层的?
- 应用层:构造0x22服务请求,VIN码的DID是0xF190,数据参数为空
- 会话层:检查当前会话是否允许执行0x22服务,更新定时器
- 网络层:如果请求长度≤7字节,封装成单帧;否则拆成多帧
- 数据链路层:加上CAN帧头(ID、DLC、CRC等),准备发送
- 物理层:把帧转换成差分电压信号,放到CAN总线上
ECU收到后,逆向走一遍:物理层收信号→数据链路层解帧→网络层重组→会话层检查→应用层执行服务→再原路返回响应。
好了,协议栈的骨架搭起来了。下一层一层地,我们后面会逐个深入。记住这个五层结构,它是你诊断开发的地基。