第1章:物理层与数据链路层:CAN总线基础(CAN 2.0A/B)、CAN FD简介、LIN总线在诊断中的应用、DoIP(以太网诊断)入门
1.1 为什么诊断要从CAN总线讲起?
做车载诊断这么多年,我经常被新人问一个问题:「师傅,诊断不就是发几个报文吗?跟底层总线有什么关系?」
嗯,这个问题问得好。但说实话,如果你不懂CAN总线,你根本看不懂诊断协议在干什么。UDS(ISO 14229)也好,OBD-II也罢,它们都是跑在CAN总线上的「应用层协议」。就像你学HTTP,总得先知道TCP/IP是怎么回事吧?
所以这一章,咱们先把地基打牢。我会从CAN 2.0A/B讲起,再聊CAN FD、LIN,最后带大家入门DoIP。这些都是我实际项目中天天打交道的东西。
1.2 CAN 2.0A/B:车载诊断的「老黄牛」
CAN总线是1986年由Bosch发明的。你想想看,快40年了,它还在用。为什么?因为它太可靠了。
CAN 2.0A 和 CAN 2.0B 的区别,说白了就一句话:
- CAN 2.0A:标准帧,11位标识符(ID)。
- CAN 2.0B:扩展帧,29位标识符(ID)。
我在项目中遇到过最坑的事,就是有人把CAN 2.0A的节点接到了只支持CAN 2.0B的网络上。结果呢?报文发不出去,ECU直接「失联」。所以选型时一定要看清楚。
物理层:两根线的艺术
CAN总线物理层就两根线:CAN_H和CAN_L。它用的是差分信号传输。
关键参数(我建议你背下来):
- 显性电平(Dominant):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,逻辑「0」
- 隐性电平(Recessive):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,逻辑「1」
- 总线终端电阻:120Ω(两端各一个)
为什么会这样设计?因为差分信号抗干扰能力强。你想想看,发动机舱里电磁干扰那么严重,单端信号早就被干趴下了。
数据链路层:帧结构
CAN总线上的数据是以「帧」为单位传输的。诊断报文最常用的是数据帧。
一个标准的数据帧长这样:
SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF
这里我重点说几个:
- ID:决定了报文的优先级。ID越小,优先级越高。诊断报文一般用高优先级ID。
- DLC:数据长度代码。CAN 2.0最多8字节。嗯,这就是它的瓶颈。
- 数据段:诊断请求/响应就塞在这里面。
我的经验:诊断报文通常用29位扩展ID。因为11位ID太容易冲突了。一个车上几十个ECU,11位ID根本不够分。
1.3 CAN FD:给CAN总线「提速」
CAN 2.0的8字节数据段,在今天的诊断场景下越来越不够用了。比如刷写一个ECU固件,动不动几兆字节,用CAN 2.0传得传到猴年马月。
所以Bosch在2012年推出了CAN FD(Flexible Data-rate)。
CAN FD最大的两个改进:
- 数据段长度扩展:从8字节扩展到最多64字节。
- 可变速率:数据段可以用更高的波特率传输(比如2Mbps甚至更高)。
我曾经在一个项目中,用CAN FD做Bootloader刷写。原来用CAN 2.0需要15分钟,换成CAN FD后,5分钟搞定。客户当场就竖了大拇指。
注意:CAN FD和CAN 2.0不完全兼容。CAN FD控制器可以收CAN 2.0的报文,但反过来不行。所以升级时要考虑好兼容性。
1.4 LIN总线:诊断的「廉价方案」
LIN总线(Local Interconnect Network)是CAN总线的「小弟」。它便宜、简单,但速度慢。
LIN总线的特点:
- 单线传输:就一根线(加上地线)。
- 主从架构:一个主节点,多个从节点。
- 波特率:通常20kbps。嗯,你没看错,就是20k。跟CAN的500k比起来,慢得让人着急。
- 报文长度:最多8字节数据。
那LIN总线在诊断中有什么用呢?
说实话,LIN总线本身不支持UDS这种复杂的诊断协议。但有些低成本ECU(比如车窗控制器、座椅控制器)会通过LIN总线连接到网关,网关再转发诊断请求到CAN网络上。
我建议你记住一点:LIN总线上的诊断,本质上是「借道」。诊断请求从CAN发过来,网关翻译成LIN报文,再发给从节点。
避坑指南:我曾经遇到过LIN从节点响应超时的问题。原因是LIN总线的调度表(Schedule Table)没配置好,诊断报文被挤到了后面。所以做LIN诊断时,一定要检查调度表的优先级。
1.5 DoIP:以太网诊断入门
DoIP(Diagnostics over Internet Protocol),说白了就是把诊断跑在以太网上。
为什么要用DoIP?因为CAN总线太慢了。你想想看,现在一辆高端车有上百个ECU,每个ECU都要刷写、诊断,CAN总线的带宽根本不够用。
DoIP的优势:
- 速度快:100Mbps甚至1Gbps。刷写一个ECU固件,从几分钟缩短到几十秒。
- 传输距离远:以太网可以跑100米,CAN总线最多40米。
- 支持远程诊断:通过TCP/IP网络,可以在云端做诊断。
DoIP的协议栈长这样:
应用层:UDS (ISO 14229-5)
传输层:TCP/UDP
网络层:IPv4/IPv6
数据链路层:以太网 (IEEE 802.3)
物理层:100BASE-TX / 1000BASE-T
我记得第一次用DoIP做远程诊断时,感觉就像打开了新世界的大门。坐在办公室里,就能给几千公里外的车做诊断。当然,前提是网络要稳定。
DoIP的关键概念:
- 逻辑地址:每个ECU有一个逻辑地址,类似于CAN总线上的ID。
- 路由激活:诊断仪需要先发送路由激活报文,才能开始诊断。
- 诊断消息:UDS报文封装在DoIP的Payload中传输。
1.6 总结:选哪种总线?
最后,我给大家一个简单的选型建议:
| 场景 | 推荐总线 | 原因 |
|---|---|---|
| 传统诊断(读故障码、数据流) | CAN 2.0B | 成熟、可靠、成本低 |
| 高速刷写(Bootloader) | CAN FD | 64字节数据段,速度快 |
| 低成本ECU(车窗、座椅) | LIN | 便宜、简单 |
| 远程诊断、大数据量传输 | DoIP | 速度快、支持远程 |
好了,这一章就到这里。下一章我们会深入CAN诊断的报文格式,包括如何用CAN发送UDS请求。到时候我会拿出我珍藏的「踩坑案例」跟大家分享。
记住一句话:诊断协议是上层建筑,总线是地基。地基不牢,地动山摇。