一、诊断协议概述

1.1 UDS协议简介

UDS,全称是 Unified Diagnostic Services,统一诊断服务。说白了,它就是汽车电子世界里的一套通用语言。ECU之间、诊断仪和ECU之间,靠它来沟通。

我刚开始接触UDS时,觉得它就是个协议栈。后来踩的坑多了,才明白它更像一套「规矩」。它规定了你能问什么、怎么问、对方该怎么答。没有这套规矩,不同供应商的ECU根本没法统一诊断。

UDS的核心,是ISO 14229标准。它定义了一套服务,比如读取故障码、读写数据、刷写程序等等。每个服务都有固定的ID和格式。你发一个请求,ECU必须回一个响应。这就是UDS的基本交互模式。

举个例子,你想知道发动机转速。你发一个 0x22 服务(读取数据标识符),带上转速的ID。ECU收到后,会回一个 0x62 响应,把转速值带回来。就这么简单。

核心要点:UDS不是某个厂家的私有协议,它是国际标准。这意味着,只要你遵循ISO 14229,不同厂家的诊断仪和ECU就能互相通信。我在项目中见过太多因为协议不兼容导致的联调问题,最后发现都是没严格按标准来。

1.2 OSI模型与诊断层级

聊UDS,绕不开OSI七层模型。你可能会问,一个诊断协议,跟网络模型有什么关系?

关系大了。UDS本身只定义了应用层(第7层)的内容。它不管数据怎么打包、怎么传输、怎么纠错。这些事,交给下面的层去干。

我习惯把诊断通信拆成三层来看:

  • 应用层:UDS服务本身。比如 0x10(诊断会话控制)、0x19(读取故障码)。这是你直接打交道的部分。
  • 传输层:负责数据的分包和重组。CAN总线上一次最多传8个字节,超过8字节的数据怎么办?靠传输层拆包、组包。ISO 15765-2(也就是我们常说的CAN TP)就是干这个的。
  • 网络层:负责寻址和路由。你发一个诊断请求,怎么确保它到达正确的ECU?这就是网络层的事。物理寻址和功能寻址,就发生在这里。

嗯,这里要注意。很多人把UDS和CAN TP混为一谈。其实UDS是应用层,CAN TP是传输层。两者配合使用,但不是一回事。我在项目评审时,经常看到新人把这两个概念搞混,导致设计文档逻辑不通。

OSI层 诊断相关标准 我的理解
应用层(第7层) ISO 14229-1 UDS服务定义,你发什么、怎么回
表示层(第6层) ISO 14229-2 数据编码规则,比如负数怎么表示
会话层(第5层) ISO 14229-3 会话管理,比如默认会话、扩展会话
传输层(第4层) ISO 15765-2 CAN TP,分包组包,保证数据完整
网络层(第3层) ISO 15765-2 寻址方式,物理寻址和功能寻址
数据链路层(第2层) ISO 11898-1 CAN控制器,帧格式、仲裁机制
物理层(第1层) ISO 11898-2 CAN收发器,电平、线束

你想想看,如果没有这些分层,每个ECU厂商都得自己定义一套完整的通信协议。那诊断仪得适配多少种协议?想想就头大。分层的好处就是各司其职,你改应用层,不影响下面几层。我参与过一个项目,只换了CAN收发器芯片,应用层代码一行没改,照样跑得稳稳的。

1.3 诊断寻址的基本概念

诊断寻址,说白了就是「这条诊断消息是发给谁的」。在CAN总线上,所有ECU都挂在同一条线上。你发一条消息,所有ECU都能收到。但只有目标ECU才会处理它。

怎么区分目标?靠CAN ID。诊断消息的CAN ID里,藏着寻址信息。

诊断寻址分两种:

  • 物理寻址:点对点通信。一个诊断请求,只发给一个特定的ECU。比如你想读ECU_A的故障码,就用物理寻址。ECU_B和ECU_C收到这条消息,直接忽略。
  • 功能寻址:一对多通信。一个诊断请求,发给一组ECU。比如你想让所有ECU同时进入扩展会话,就用功能寻址。所有支持这个功能的ECU都会响应。

我的经验:物理寻址和功能寻址的CAN ID,在项目初期就要定好。我见过一个项目,因为功能寻址ID和某个ECU的物理寻址ID冲突,导致诊断仪一发功能寻址,那个ECU就死机。排查了整整两天才发现是ID分配的问题。所以,寻址ID的规划,一定要写在系统设计文档里,并且做交叉检查。

为什么会这样?因为CAN总线上,消息的优先级由CAN ID决定。ID越小,优先级越高。功能寻址通常用较小的ID,因为它要同时唤醒多个ECU,优先级高一些合理。物理寻址用较大的ID,一对一通信,优先级低一点没关系。

我记得有一次,客户反馈说诊断仪发功能寻址时,某个ECU响应超时。我查了半天,发现是那个ECU的CAN控制器滤波配置错了。它把功能寻址的ID也过滤掉了,等于没收到。嗯,这种低级错误,配置阶段多检查一遍就能避免。

总结一下,诊断寻址的核心就两句话:

  • 物理寻址:找一个人说话。
  • 功能寻址:对一群人喊话。

后面的章节,我会详细讲这两种寻址方式的CAN ID格式、响应机制,以及实际项目中的配置技巧。你先把基本概念吃透,后面就好办了。