第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.0ACAN 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最大的两个改进:

  1. 数据段长度扩展:从8字节扩展到最多64字节。
  2. 可变速率:数据段可以用更高的波特率传输(比如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请求。到时候我会拿出我珍藏的「踩坑案例」跟大家分享。

记住一句话:诊断协议是上层建筑,总线是地基。地基不牢,地动山摇。