一、UDS诊断协议概述
大家好,我是你们的CANoe讲师。今天咱们聊聊UDS诊断协议的基础。说实话,很多工程师一上来就急着写测试脚本,结果连寻址方式都搞混了——嗯,我当年也犯过这个错。
1.1 UDS协议栈长什么样?
UDS,全称Unified Diagnostic Services,统一诊断服务。它不是什么高深莫测的东西,说白了就是汽车ECU之间的一种“体检语言”。你想想看,一辆车上有几十个ECU,每个都可能出故障,总得有个标准化的方式去读取故障码、刷写软件吧?UDS就是干这个的。
我个人习惯把UDS协议栈想象成一座三层小楼:
- 应用层:诊断服务本身,比如0x10(诊断会话控制)、0x22(读取数据)
- 会话层/表示层:在CAN总线上,这部分通常被ISO 15765-2(即CAN TP)接管了
- 传输层:ISO 15765-2,负责把大包数据拆成CAN帧,再拼回来
我在项目中遇到过不少新人,一上来就问我:“老师,UDS报文怎么发?”其实你得先搞清楚,UDS报文是装在CAN帧的数据场里的。一个标准的CAN诊断请求,ID通常是0x7E0(物理请求)或0x7DF(功能请求),数据场第一个字节就是服务ID。
1.2 OSI七层模型映射
咱们做汽车电子的,OSI七层模型是基本功。UDS在CAN总线上的映射是这样的:
| OSI层 | CAN上的实现 | 我的理解 |
|---|---|---|
| 第7层:应用层 | UDS服务(ISO 14229-1) | 就是那些0x10、0x22、0x2E指令 |
| 第6层:表示层 | 无(数据格式由应用层定义) | 其实UDS自己把这事干了 |
| 第5层:会话层 | ISO 15765-3(已合并到14229-2) | 管理诊断会话状态 |
| 第4层:传输层 | ISO 15765-2(CAN TP) | 分包组包,我最常打交道的一层 |
| 第3层:网络层 | CAN 2.0(ID+数据场) | 其实就是CAN帧本身 |
| 第2层:数据链路层 | CAN控制器 | 硬件干的活,我们不用操心 |
| 第1层:物理层 | CAN总线(双绞线) | 电压、速率这些物理特性 |
这里有个坑,我提醒一下:CAN TP层(第4层)是UDS诊断的命脉。为什么?因为CAN帧一次最多传8字节,而UDS诊断服务经常要传几十甚至几百字节的数据(比如刷写Bootloader)。没有CAN TP,你连个DID都读不全。
重点记忆:UDS诊断报文 = CAN ID + CAN TP头部 + UDS服务ID + 数据参数
1.3 诊断服务分类:强制与可选
UDS协议里定义了26个服务(SID从0x10到0x3E),但并不是所有服务都必须实现。ISO 14229-1把服务分成了三类:
- 强制服务:必须实现,否则你的ECU就不符合UDS规范。比如0x10(诊断会话控制)、0x11(ECU复位)、0x27(安全访问)
- 条件服务:如果ECU支持某个功能,就必须实现对应的服务。比如支持刷写,就必须实现0x34(请求下载)
- 可选服务:看OEM需求,比如0x31(例程控制)
我记得有一次帮客户做测试,他们的ECU死活进不了扩展会话。查了半天,发现是0x10服务根本没实现——他们以为“反正能通信就行”。嗯,这就是典型的“强制服务缺失”问题。
我的建议:做测试前,先找OEM要一份“诊断规范文档”,里面会明确哪些服务是强制实现的。别自己瞎猜。
1.4 物理寻址 vs 功能寻址
这是新手最容易搞混的地方。我直接说人话:
- 物理寻址:一对一通信。你发一个请求,只有一个ECU响应。CAN ID通常是0x7E0(请求)和0x7E8(响应)。
- 功能寻址:一对多通信。你发一个请求,总线上所有支持该功能的ECU都会响应。CAN ID固定为0x7DF。
为什么会这样设计?你想想看,如果我想知道总线上所有ECU的软件版本,用物理寻址得一个个问,多麻烦。功能寻址一发,所有ECU同时回复,效率高多了。
但这里有个大坑:功能寻址的响应会冲突。因为多个ECU同时往总线上发数据,CAN总线仲裁机制会导致数据丢失。我曾经在项目里遇到过,用功能寻址读VIN码,结果10个ECU同时回复,总线直接乱套了。
避坑指南:我曾经用功能寻址做批量刷写,结果ECU响应冲突导致刷写失败。后来我学乖了——功能寻址只用来发“请求”,响应必须用物理寻址。或者,在CANoe里用“分时响应”机制,让ECU错开时间回复。
在CANoe里怎么区分?很简单:
// 物理寻址请求(发到0x7E0)
diagRequest ECU_Physical.0x22 0xF1 0x90;
// 功能寻址请求(发到0x7DF)
diagRequest ECU_Functional.0x22 0xF1 0x90;
注意看,CANoe的Diagnostic模块里,物理寻址和功能寻址是分开配置的。你需要在“Diagnostic/ISO TP Configuration”里分别定义Request和Response的CAN ID。
好了,这一章的内容就这些。记住:物理寻址是点名,功能寻址是广播。下一章咱们聊CANoe里怎么搭建诊断测试环境,到时候我会手把手教你们配CAN ID和P2定时器。