2. CAN通信故障排查:CAN总线物理层故障、数据链路层故障、应用层超时与错误帧分析

CAN总线,说白了就是ECU之间的“对话通道”。通道出了问题,车就跑不起来。我这些年排查过的CAN故障,少说也有上百例了。今天就把最常见的三类问题——物理层、数据链路层、应用层——掰开揉碎了讲清楚。

2.1 物理层故障:终端电阻与线束问题

物理层是CAN通信的“地基”。地基不稳,上面再好的协议也白搭。我个人习惯,遇到CAN通信问题,先拿万用表量物理层。

2.1.1 终端电阻

CAN总线两端各需要一颗120Ω的终端电阻。为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω,匹配电阻能消除信号反射。

关键检查点:

  • 断电状态下,测量CAN_H与CAN_L之间的电阻。正常值约60Ω(两颗120Ω并联)。
  • 如果测到120Ω,说明只有一端有电阻,另一端缺失。
  • 如果测到0Ω或接近0Ω,说明CAN_H与CAN_L短路了。
  • 如果测到无穷大,说明总线断路或电阻全部丢失。

我在项目中遇到过一台车,CAN通信时好时坏。查了半天,发现是终端电阻焊点虚焊。温度一高,焊点断开,电阻失效。温度降下来又接上了。这种“软故障”最坑人。

我的小技巧: 测量终端电阻时,最好把ECU全部断电。有些ECU内部有偏置电阻,会影响测量结果。我习惯断开蓄电池负极再测。

2.1.2 线束短路与断路

线束问题分三种:CAN_H对地短路、CAN_H对电源短路、CAN_H与CAN_L互短。断路则常见于接插件松动或线束折断。

故障类型 CAN_H电压 CAN_L电压 差分电压
正常(隐性) 2.5V 2.5V 0V
正常(显性) 3.5V 1.5V 2V
CAN_H对地短路 0V 2.5V -2.5V
CAN_H对电源短路 12V 2.5V 9.5V
CAN_H与CAN_L互短 2.5V 2.5V 0V(但无法通信)

你想想看,如果CAN_H对地短路了,差分电压变成负的,接收器根本识别不了。这时候总线就“瘫痪”了。

避坑指南: 我曾经遇到过一台车,CAN_L对电源短路,电压飙到12V。结果烧掉了三个ECU的CAN收发器。从那以后,我排查线束短路时,一定先确认电源是否断开。带电插拔CAN线,也是大忌。

2.2 数据链路层故障:ID冲突与波特率不匹配

物理层没问题,但通信还是不正常?那就要看数据链路层了。说白了,就是“对话规则”出了问题。

2.2.1 ID冲突

CAN总线是广播式通信,每个报文都有唯一的ID。如果两个节点用同一个ID发送报文,就会产生总线仲裁错误。

为什么会这样?嗯,这里要注意:CAN的仲裁机制依赖ID的优先级。两个节点同时发送相同ID时,仲裁无法区分谁该让路,结果就是错误帧。

排查方法:

  1. 用CAN分析仪抓取总线报文,观察是否有连续的“错误帧”或“过载帧”。
  2. 查看错误计数器(TEC/REC)。如果某个节点的REC快速增加,说明它接收到了错误。
  3. 逐一断开节点,看错误帧是否消失。消失的那个节点就是“捣乱分子”。

我记得有一次,供应商提供的两个ECU用了同一个ID。他们说是“巧合”,但车就是跑不起来。最后改了其中一个的ID,问题解决。所以,DBC文件一定要仔细核对。

2.2.2 波特率不匹配

CAN总线上所有节点的波特率必须一致。常见的有125kbps、250kbps、500kbps。波特率不匹配,节点之间根本“听不懂”对方在说什么。

怎么判断?用示波器看CAN_H上的位时间。500kbps的位时间是2μs,250kbps是4μs。量一下就知道了。

我的习惯: 新项目启动时,我会在DBC文件里明确标注波特率,并在每个ECU的标定文档里写清楚。曾经有个项目,两个团队用了不同的波特率,联调时浪费了两天。说白了,就是沟通不到位。

2.3 应用层超时与错误帧分析

物理层和数据链路层都正常,但应用层还是报错?这时候就要看“超时”和“错误帧”了。

2.3.1 应用层超时

CAN协议本身不定义超时,但应用层会定义。比如,ECU_A每隔10ms发送一次报文。如果ECU_B在20ms内没收到,就认为通信超时。

超时的原因通常有:

  • 发送节点死机或程序跑飞。
  • 总线负载过高,报文被延迟发送。
  • 接收节点的中断优先级设置不当,导致报文丢失。

我在项目中遇到过,一个ECU的CAN接收中断被更高优先级的中断抢占。结果报文来了,CPU没空处理,直接丢包。超时报警就出来了。后来调整了中断优先级,问题解决。

避坑指南: 我曾经以为超时一定是发送端的问题。后来发现,接收端的软件架构不合理,也会导致超时。排查时,两边都要看,别只盯着发送方。

2.3.2 错误帧分析

错误帧是CAN总线自己发出的“求救信号”。常见错误帧类型:

  • 位错误: 发送节点监控总线,发现发送的电平与监控到的电平不一致。
  • 填充错误: 连续5个相同电平后,没有插入相反电平。
  • CRC错误: 接收节点计算的CRC与发送节点的不一致。
  • 形式错误: 帧格式不符合规范。
  • 应答错误: 发送节点没收到应答信号。

怎么分析?用CAN分析仪抓取错误帧,看错误类型和错误计数器。如果错误帧集中在某个ID上,大概率是那个节点有问题。

实战案例: 有一台车,跑高速时偶尔报“CAN通信丢失”。我抓了一天数据,发现错误帧全是“CRC错误”。进一步排查,发现是线束过长,信号衰减导致CRC计算不一致。缩短线束后,问题消失。

你想想看,错误帧就像CAN总线的“咳嗽声”。偶尔咳一声没事,一直咳就说明病了。病根可能在物理层,也可能在节点本身。

2.4 总结

CAN通信故障排查,我习惯按这个顺序来:

  1. 先量物理层:终端电阻、线束通断、电压水平。
  2. 再看数据链路层:ID是否冲突、波特率是否一致。
  3. 最后分析应用层:超时设置、错误帧类型。

说白了,就是“由下往上”排查。别一上来就怀疑软件,很多时候问题就出在线上。嗯,今天就聊到这儿。下一章我们讲LIN通信的故障排查,那个也有不少坑。