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诊断协议栈全景图,帮你把今天讲的内容串起来:

UDS诊断协议栈全景图 应用层 — UDS诊断服务 (ISO 14229-1) 10诊断会话控制 | 22读取数据 | 2E写入数据 | 31例程控制 | 34/36/37下载服务 传输层/网络层 — ISO 15765-2 (CAN TP) 单帧(SF) | 首帧(FF) | 流控帧(FC) | 连续帧(CF) | 多帧传输管理 数据链路层 — CAN控制器 (ISO 11898-1) 标准帧(11位ID) | 扩展帧(29位ID) | 仲裁机制 | CRC校验 | 错误帧 物理层 — CAN收发器 & 总线 (ISO 11898-2) 差分信号(CAN_H/CAN_L) | 终端电阻(120Ω) | 显性/隐性电平 | 总线拓扑 OSI 7层模型 刷写实战关注重点 应用层:UDS服务时序 | 传输层:大文件分包与流控 | 物理层:总线稳定性与终端匹配

1.5 本章小结

今天我们从OSI模型一路讲到CAN物理层,看起来内容不少,但核心就三句话:

  • UDS是应用层协议,它依赖CAN总线做传输载体。
  • 刷写Bootloader,你只需要掌握10个左右的核心UDS服务。
  • 物理层是基础,终端电阻、CAN电平这些硬知识,出了问题就是硬伤。

给新人的建议:别急着写代码。先拿一个CAN分析仪,抓几包UDS报文看看,把单帧、多帧、流控帧的结构认清楚。我当年就是这么入门的,比看十遍协议标准都管用。