2. OSI模型与UDS:七层架构与诊断通信的根基
说实话,很多工程师刚开始接触UDS时,第一反应就是去背那些诊断服务ID(SID)。什么0x10、0x22、0x2E,背得滚瓜烂熟。但真到了项目里,遇到通信超时、应答对不上、刷写失败,就抓瞎了。
为什么?因为你不理解UDS在通信模型里到底站在哪一层。
我个人习惯,讲UDS之前,必须先讲OSI七层模型。这就像盖房子,你得先知道地基在哪,管线怎么走,才能放心地装修。这一章,我们就来把这张“通信地图”彻底搞清楚。
2.1 OSI七层模型:一张通信的“地图”
OSI模型,说白了就是国际标准化组织(ISO)给网络通信画的一张“分工图”。它把通信过程拆成7层,每一层只管自己的事,层与层之间通过标准接口对话。
你想想看,如果所有功能都揉在一起,那系统得多乱?
| 层级 | 名称 | 核心职责 | 汽车电子中的典型协议 |
|---|---|---|---|
| 7 | 应用层 | 为用户提供网络服务接口 | UDS (ISO 14229) |
| 6 | 表示层 | 数据格式转换、加密、压缩 | 通常与应用层合并 |
| 5 | 会话层 | 建立、管理、终止会话 | UDS中的定时参数管理 |
| 4 | 传输层 | 端到端可靠传输、分段重组 | DoIP (ISO 13400)、CAN TP (ISO 15765-2) |
| 3 | 网络层 | 路由选择、寻址 | DoIP、CAN网络层 |
| 2 | 数据链路层 | 帧封装、错误检测、介质访问 | CAN (ISO 11898)、以太网MAC |
| 1 | 物理层 | 比特流传输、电气特性 | CAN收发器、以太网PHY |
这张表,我建议你收藏一下。每次做诊断开发时,心里都要清楚:我现在在操作哪一层?
2.2 UDS在应用层的定位:它到底管什么?
UDS(ISO 14229)是应用层协议。它不关心你的数据是用CAN线传的,还是用以太网传的。它只定义了一件事:诊断仪和ECU之间,应该用什么“语言”对话。
核心理解:UDS定义的是“语义”,而不是“传输方式”。
比如,诊断仪发送“0x22 F1 90”,意思是“请把VIN码告诉我”。至于这个请求怎么打包成CAN帧、怎么通过总线发出去、怎么保证不丢包,那是下面几层的事。
我在项目中遇到过不少同事,把UDS和CAN总线混为一谈。他们觉得“UDS就是CAN”。其实不对。UDS可以跑在CAN上(这是最常见的),也可以跑在以太网上(DoIP),甚至跑在LIN或FlexRay上。只是CAN的成本和可靠性,让它成了汽车诊断的“默认赛道”。
2.3 物理层与数据链路层:CAN总线的基础
既然UDS最常跑在CAN上,那我们就得聊聊CAN的物理层和数据链路层。这部分是“硬知识”,也是很多Bug的根源。
2.3.1 物理层:电压与比特
CAN总线用两根线:CAN_H和CAN_L。它通过差分电压来传输信号。
- 显性位(Dominant):CAN_H比CAN_L高约2V。逻辑上代表“0”。
- 隐性位(Recessive):CAN_H和CAN_L电压相近(约2.5V)。逻辑上代表“1”。
为什么用差分?抗干扰能力强。汽车里电磁环境那么恶劣,单端信号早被噪声淹没了。
避坑指南:我曾经在一个项目中,因为CAN收发器的共模电压范围没选对,导致高温下通信频繁丢帧。查了三天,最后发现是物理层的问题。记住,物理层决定了通信的“底线”。
2.3.2 数据链路层:帧结构与仲裁
CAN的数据链路层定义了帧的格式。我们最常用的是标准帧(11位ID)和扩展帧(29位ID)。
一个典型的CAN数据帧包含:
- SOF(帧起始):一个显性位,告诉所有节点“我要发数据了”。
- 仲裁场:包含ID和RTR位。ID越小,优先级越高。
- 控制场:包含DLC(数据长度码),告诉别人我这帧带了多少字节数据。
- 数据场:0-8字节。UDS的请求和响应,就装在这里。
- CRC场:循环冗余校验,保证数据没被篡改。
- ACK场:应答位,接收节点会在这里拉低总线,告诉发送方“我收到了”。
这里有个关键机制——仲裁。当多个ECU同时发送时,总线通过“线与”逻辑决定谁先发。ID小的胜出。这就是为什么诊断请求通常用高优先级ID。
个人经验:设计诊断ID时,我习惯把物理寻址请求(功能寻址)的ID设得比物理响应ID高。这样能保证诊断仪的命令不会被ECU的响应淹没。
2.4 知识结构图:UDS与OSI的关系
下面这张图,帮你把UDS在OSI模型中的位置,以及它和CAN各层的关系理清楚。
2.5 为什么理解这些对Bootloader很重要?
你可能觉得,我只是写个刷写程序,知道UDS服务就够了,管它什么物理层?
嗯,这里要注意。Bootloader刷写时,数据量很大(几百KB甚至几MB),而CAN一帧只能带8字节。这就涉及到传输层的分段与重组(CAN TP)。
如果你不理解数据链路层的帧结构,你就无法理解为什么有时候发送会失败——可能是DLC设错了,可能是ID冲突了,也可能是CRC校验没通过。
一句话总结:UDS是“语言”,CAN是“公路”,物理层是“路基”。语言再优美,公路塌了,信息也到不了。