物理层与CAN总线基础:UDS诊断的“高速公路”

做UDS诊断,说白了就是让诊断仪和ECU之间“说话”。但话怎么传?靠什么传?这就是物理层和CAN总线要解决的事。我个人习惯把CAN总线比作一条高速公路——物理层是路面的材质和宽度,报文帧结构是路上跑的车,仲裁机制就是交通规则。搞懂了这些,UDS在CAN上的映射才能顺理成章。

CAN总线物理层特性

CAN总线是差分信号传输,用两条线——CAN_H和CAN_L。平时没数据时,两条线都是2.5V,这叫隐性电平,代表逻辑“1”。有数据时,CAN_H拉到3.5V,CAN_L降到1.5V,这叫显性电平,代表逻辑“0”。

嗯,这里要注意:显性电平会“覆盖”隐性电平。这个特性是后面仲裁机制的基础。

参数 典型值 说明
总线电平(隐性) CAN_H = CAN_L ≈ 2.5V 差分为0V,代表逻辑1
总线电平(显性) CAN_H ≈ 3.5V, CAN_L ≈ 1.5V 差分为2V,代表逻辑0
终端电阻 120Ω(两端各一个) 抑制信号反射
最大传输距离 40m @ 1Mbps 距离越长,速率越低
避坑指南: 我曾经在一个项目中,终端电阻只加了一端,结果总线信号反射严重,ECU时不时丢帧。查了两天才发现是电阻的事。记住:CAN总线两端必须各有一个120Ω电阻,缺一不可。

CAN报文帧结构

CAN报文有四种帧类型:数据帧、远程帧、错误帧、过载帧。我们做诊断最常用的是数据帧。一个标准数据帧(11位ID)长这样:

SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF

你想想看,一个数据帧最多只能带8个字节的数据。UDS诊断动辄几十个字节,怎么办?这就引出了UDS在CAN上的映射——多帧传输。

字段 长度 作用
SOF 1 bit 帧起始,同步所有节点
ID 11 bit(标准)/ 29 bit(扩展) 标识报文优先级
RTR 1 bit 远程帧标志,诊断中很少用
DLC 4 bit 数据长度,0-8
数据段 0-64 bit 实际数据,诊断报文放这里
CRC 15 bit 循环冗余校验,保证数据完整
ACK 2 bit 应答槽,接收节点确认收到
核心要点: CAN数据帧的数据段最多8字节。UDS诊断报文如果超过8字节,必须拆分成多个CAN帧传输。这就是“多帧传输”的由来。

CAN总线仲裁机制

为什么CAN总线能同时挂几十个节点而不冲突?靠的就是仲裁。仲裁的核心逻辑是:ID越小,优先级越高。

具体怎么仲裁?两个节点同时发数据时,它们都会监测总线电平。如果一个节点发隐性电平(1),但总线上是显性电平(0),它就立刻停止发送,转为接收。说白了,就是“谁先发0,谁赢”。

我记得有一次调试,一个ECU总是发不出诊断响应。查了半天,发现它的CAN ID设成了0x7FF,而其他节点的ID都在0x100以下。每次仲裁它都输,根本抢不到总线。后来把ID改小,问题就解决了。

注意: 诊断报文的CAN ID选择很关键。功能寻址(0x7DF)的优先级最低,物理寻址的优先级取决于具体ID。如果总线上有大量高优先级报文,诊断响应可能会被延迟。

UDS在CAN上的映射

UDS诊断报文在CAN上怎么传?ISO 15765-2(俗称CAN TP)定义了两种传输方式:

  • 单帧传输: 诊断报文 ≤ 8字节,一个CAN帧搞定。
  • 多帧传输: 诊断报文 > 8字节,拆成多个CAN帧,用首帧(FF)、连续帧(CF)和流控帧(FC)来管理。

多帧传输的流程是这样的:

  1. 发送方先发一个首帧(FF),告诉接收方“我要发N个字节”。
  2. 接收方回一个流控帧(FC),说“你可以发了,一次发几个”。
  3. 发送方按流控帧的要求,发连续帧(CF),直到发完。

你想想看,这就像两个人打电话:一个人说“我要说一段话,总共100个字”,另一个人说“好,你一次说10个字”,然后第一个人就10个字10个字地说完。

实战经验: 我建议你在设计诊断栈时,把单帧和多帧的处理逻辑分开。单帧处理可以放在中断里,多帧处理最好用状态机。否则,一个长诊断请求可能会阻塞整个CAN接收。

知识体系总览

下面这张图把本章的核心知识点串起来了。你可以把它当作一个快速索引:

CAN总线与UDS映射知识体系 CAN总线与UDS映射知识体系 物理层特性 报文帧结构 仲裁机制 差分信号 终端电阻 数据帧 远程帧 ID优先级 显性覆盖 UDS在CAN上的映射 单帧传输(≤8字节) 多帧传输(>8字节) 流控机制 核心:CAN帧最多8字节 → UDS报文需拆帧 → 多帧传输 + 流控

这张图把物理层、帧结构、仲裁机制和UDS映射的关系理清了。你可以把它当作一个快速索引,后面讲到具体协议时,随时回来对照。

本章小结: CAN总线的物理层决定了信号怎么传,帧结构决定了数据怎么装,仲裁机制决定了谁先传。UDS在CAN上的映射,就是利用这些基础能力,把诊断报文拆成8字节的CAN帧,再通过流控机制保证传输的可靠性。搞懂这些,后面学UDS服务就轻松多了。