1. UDS协议基础:OSI模型与汽车诊断、UDS服务概述、物理层与CAN总线基础
各位同学,欢迎来到《UDS Bootloader刷写实战》的第一章。
说实话,很多刚入行的工程师一上来就啃UDS协议栈,结果被那一堆服务ID、子功能、否定响应码搞得晕头转向。我个人习惯是——先搞清楚UDS在整个汽车电子架构里到底站在什么位置,再往下钻细节。今天我们就从最底层开始,把地基打牢。
1.1 OSI七层模型与汽车诊断协议栈
你想想看,一辆车上几十个ECU,它们之间怎么通信?诊断仪又怎么跟ECU对话?这背后靠的就是一套分层协议栈。OSI七层模型虽然是个通用框架,但在汽车诊断领域,我们真正关心的只有下面几层。
| OSI层 | 汽车诊断对应 | 典型协议/标准 | 我的理解 |
|---|---|---|---|
| 第7层 应用层 | UDS诊断服务 | ISO 14229-1 | 就是咱们写的诊断请求/响应 |
| 第6层 表示层 | (通常合并到应用层) | — | 汽车诊断里基本不单独处理 |
| 第5层 会话层 | (由传输层管理) | — | 会话状态机在这里体现 |
| 第4层 传输层 | 多帧传输/流控制 | ISO 15765-2 (TP层) | 刷写大文件全靠它拆包 |
| 第3层 网络层 | CAN ID寻址/路由 | ISO 15765-2 | 物理寻址 vs 功能寻址 |
| 第2层 数据链路层 | CAN控制器/驱动 | ISO 11898-1 | 帧格式、仲裁、错误检测 |
| 第1层 物理层 | CAN收发器/总线 | ISO 11898-2 | 差分信号、终端电阻 |
我在项目中遇到过不少同事,写应用层代码时发现CAN报文发不出去,查了半天结果是物理层的终端电阻没焊。嗯,这就是分层思维的重要性——你得知道问题出在哪一层。
核心要点:UDS诊断协议主要工作在OSI的第7层(应用层),但它依赖下面各层的支撑。做Bootloader刷写,你至少得吃透第1、2、4、7层。
1.2 UDS服务概述
UDS的全称是Unified Diagnostic Services,统一诊断服务。说白了,它就是一套标准化的“ECU问诊语言”。诊断仪发一个请求,ECU回一个响应,就这么简单。
UDS服务按功能可以分为六大类,我整理了一张表,方便你对照记忆:
| 服务类别 | SID范围 | 典型服务 | 刷写中是否常用 |
|---|---|---|---|
| 诊断与通信管理 | 0x10 ~ 0x3E | 10 (诊断会话控制)、11 (ECU复位)、3E (Tester Present) | ★★★★★ |
| 数据传输 | 0x22 ~ 0x2E | 22 (读取数据)、2E (写入数据) | ★★★★ |
| 存储数据传输 | 0x34 ~ 0x3D | 34 (请求下载)、36 (传输数据)、37 (请求退出传输) | ★★★★★ |
| 输入输出控制 | 0x2F ~ 0x30 | 2F (输入输出控制) | ★★ |
| 远程激活 | 0x31 | 31 (例程控制) | ★★★★ |
| 上传/下载 | 0x34 ~ 0x37 | 34、36、37(与存储数据传输重叠) | ★★★★★ |
我的经验:做Bootloader刷写,你只需要重点掌握10个左右的服务。别被那几十个服务吓到,刷写流程里翻来覆去用的就是10、11、22、2E、31、34、36、37、3E这几个。
1.3 物理层与CAN总线基础
讲完软件层,咱们得回到最硬的物理层。CAN总线是汽车诊断的“血管”,UDS报文最终都得通过CAN帧来传输。
1.3.1 CAN物理层特性
- 差分信号:CAN_H和CAN_L两根线,靠电压差传数据。抗干扰能力强,这也是汽车环境选它的原因。
- 终端电阻:总线两端各需要120Ω电阻。少了它,信号反射会导致通信失败。我曾经排查过一个偶发丢帧问题,最后发现是终端电阻虚焊了。
- 总线电平:显性电平(逻辑0)和隐性电平(逻辑1)。仲裁机制就是靠这个实现的。
1.3.2 CAN帧格式
UDS诊断主要使用标准帧(11位ID)和扩展帧(29位ID)。我个人建议在Bootloader项目中统一用扩展帧,因为诊断ID分配更灵活。
| 帧类型 | ID长度 | 数据长度 | 诊断常用场景 |
|---|---|---|---|
| 标准帧 | 11位 | 0~8字节 | 简单诊断、OBD-II |
| 扩展帧 | 29位 | 0~8字节 | UDS多ECU诊断、Bootloader |
注意:CAN帧数据段最多8字节。UDS诊断请求动不动就几十字节(比如刷写数据),所以必须靠ISO 15765-2的TP层来做多帧传输。这个我们后面章节会详细讲。
1.4 知识体系总览
下面这张图是我自己画的UDS诊断协议栈全景图,帮你把今天讲的内容串起来:
1.5 本章小结
今天我们从OSI模型一路讲到CAN物理层,看起来内容不少,但核心就三句话:
- UDS是应用层协议,它依赖CAN总线做传输载体。
- 刷写Bootloader,你只需要掌握10个左右的核心UDS服务。
- 物理层是基础,终端电阻、CAN电平这些硬知识,出了问题就是硬伤。
给新人的建议:别急着写代码。先拿一个CAN分析仪,抓几包UDS报文看看,把单帧、多帧、流控帧的结构认清楚。我当年就是这么入门的,比看十遍协议标准都管用。