物理层与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 | 距离越长,速率越低 |
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总线仲裁机制
为什么CAN总线能同时挂几十个节点而不冲突?靠的就是仲裁。仲裁的核心逻辑是:ID越小,优先级越高。
具体怎么仲裁?两个节点同时发数据时,它们都会监测总线电平。如果一个节点发隐性电平(1),但总线上是显性电平(0),它就立刻停止发送,转为接收。说白了,就是“谁先发0,谁赢”。
我记得有一次调试,一个ECU总是发不出诊断响应。查了半天,发现它的CAN ID设成了0x7FF,而其他节点的ID都在0x100以下。每次仲裁它都输,根本抢不到总线。后来把ID改小,问题就解决了。
UDS在CAN上的映射
UDS诊断报文在CAN上怎么传?ISO 15765-2(俗称CAN TP)定义了两种传输方式:
- 单帧传输: 诊断报文 ≤ 8字节,一个CAN帧搞定。
- 多帧传输: 诊断报文 > 8字节,拆成多个CAN帧,用首帧(FF)、连续帧(CF)和流控帧(FC)来管理。
多帧传输的流程是这样的:
- 发送方先发一个首帧(FF),告诉接收方“我要发N个字节”。
- 接收方回一个流控帧(FC),说“你可以发了,一次发几个”。
- 发送方按流控帧的要求,发连续帧(CF),直到发完。
你想想看,这就像两个人打电话:一个人说“我要说一段话,总共100个字”,另一个人说“好,你一次说10个字”,然后第一个人就10个字10个字地说完。
知识体系总览
下面这张图把本章的核心知识点串起来了。你可以把它当作一个快速索引:
这张图把物理层、帧结构、仲裁机制和UDS映射的关系理清了。你可以把它当作一个快速索引,后面讲到具体协议时,随时回来对照。