4. CAN总线信号测量:用示波器看穿总线上的“对话”

做CAN总线调试,示波器就是你的“听诊器”。

很多人一上来就拿着逻辑分析仪抓报文,觉得那才叫专业。但我个人的习惯是——先上示波器,看一眼物理层的波形。为什么?因为CAN总线80%的疑难杂症,其实都出在物理层。电平不对、边沿不干净、共模电压漂了……这些逻辑分析仪根本看不出来。

这一章,我们就来聊聊怎么用示波器测量CAN_H和CAN_L的差分信号,怎么判断显性/隐性电平,以及如何通过波形特征快速定位总线错误。

4.1 显性电平 vs 隐性电平:CAN总线的“0”和“1”

CAN总线用两根线——CAN_H和CAN_L——来传输信号。它不靠单根线的绝对电压,而是靠两根线之间的电压差来区分逻辑状态。

逻辑状态 CAN_H电压 CAN_L电压 差分电压 (CAN_H - CAN_L)
显性 (Dominant) 约 3.5V 约 1.5V 约 2.0V
隐性 (Recessive) 约 2.5V 约 2.5V 约 0V

说白了,显性电平就是“有压差”,对应逻辑“0”;隐性电平就是“没压差”,对应逻辑“1”。

这里有个关键点:显性电平会“覆盖”隐性电平。也就是说,只要有一个节点发送显性位,总线就是显性状态。这也是CAN总线仲裁机制的基础——谁先发0,谁就赢。

核心记忆点:

  • 显性 = 差分电压 ≈ 2V = 逻辑 0
  • 隐性 = 差分电压 ≈ 0V = 逻辑 1
  • 显性优先于隐性

4.2 示波器测量:怎么接线?怎么设置?

测量CAN信号,我建议用差分探头,或者直接用两个通道做数学运算。大多数情况下,我们用双通道示波器就够了。

4.2.1 接线方式

  1. 通道1 (CH1):接 CAN_H
  2. 通道2 (CH2):接 CAN_L
  3. 探头地线:接总线地 (GND),注意不要接车身地,要接节点本地地
  4. 数学通道 (Math):设置 CH1 - CH2,得到差分信号

小技巧:我个人习惯把CH1设为黄色,CH2设为蓝色,差分通道设为紫色。这样一眼就能区分哪根线是CAN_H,哪根是CAN_L。

4.2.2 示波器参数设置

参数 推荐值 说明
垂直刻度 1V/div CAN_H和CAN_L的摆幅约2V,1V/div可以看清细节
水平时基 10µs/div ~ 50µs/div 取决于波特率。500kbps时,一个位时间2µs,10µs/div能看5个位
触发模式 边沿触发,上升沿 触发源选差分通道,触发电平设1V左右
采样模式 正常采样 不要用峰值检测,会丢失细节

4.3 正常波形长什么样?

我们先看一个正常的CAN波形。你想想看,一个正常的CAN帧,应该包含:SOF(帧起始)、仲裁场、控制场、数据场、CRC场、ACK场、EOF(帧结束)。

在示波器上,你会看到:

  • 隐性状态:CAN_H和CAN_L都稳定在2.5V左右,差分信号在0V附近。
  • 显性状态:CAN_H跳到3.5V,CAN_L降到1.5V,差分信号跳到2V左右。
  • SOF:一个显性位,标志着帧的开始。
  • EOF:连续7个隐性位,标志着帧的结束。

我记得有一次,一个同事说他的节点发不出数据。我拿示波器一测,发现CAN_H和CAN_L的波形完全对称,但差分信号始终是0V。嗯,问题找到了——他把CAN_H和CAN_L接反了。差分信号是CAN_H减CAN_L,接反了差分信号就是负的,接收器根本识别不了。

注意:CAN_H和CAN_L不能接反!接反了差分信号极性反转,所有节点都会认为总线一直处于隐性状态。

4.4 常见总线错误波形识别

波形不会骗人。下面这几种错误波形,我在项目里都遇到过,每一个都踩过坑。

4.4.1 显性位超时 (Dominant Bit Timeout)

现象:显性位持续时间过长,超过协议规定的位时间。

波形特征:差分信号长时间维持在2V左右,不回到0V。

原因:某个节点的CAN控制器或收发器故障,一直拉着总线不放。

我曾经:遇到过一辆车,启动后CAN总线就一直报错。用示波器一看,有一个节点的CAN_H始终是3.5V,CAN_L始终是1.5V。拆开那个ECU,发现收发器的TX引脚对地短路了,导致它一直在发显性位。

4.4.2 位填充错误 (Bit Stuffing Error)

现象:连续出现6个相同的位。

波形特征:差分信号连续6个位都是显性(或隐性),没有发生跳变。

原因:发送节点的位填充逻辑异常,或者时钟精度不够导致位时间漂移。

4.4.3 CRC错误

现象:接收节点计算出的CRC与发送节点的不一致。

波形特征:波形本身看起来正常,但接收节点会发送错误帧(Error Frame)。错误帧的特征是:6个连续的显性位(主动错误标志)。

原因:总线干扰、节点时钟偏差、或者发送节点的CRC计算逻辑有bug。

4.4.4 总线关闭 (Bus Off)

现象:节点完全停止发送,总线上一片寂静。

波形特征:长时间看不到任何波形变化,CAN_H和CAN_L都稳定在2.5V。

原因:节点的发送错误计数器超过255,节点自动进入Bus Off状态。

错误波形快速诊断表:

波形特征 可能原因 排查方向
显性位持续不释放 收发器/控制器故障 检查TX引脚、更换收发器
连续6个相同位 位填充错误 检查时钟精度、位时序配置
波形正常但出现错误帧 CRC错误 检查总线终端电阻、屏蔽干扰
总线长时间无活动 Bus Off 读取错误计数器、复位节点

4.5 知识结构图:CAN总线信号测量核心逻辑

下面这张图,把这一章的核心知识点串起来了。从测量方法到波形识别,再到错误诊断,你可以把它当作调试时的“路线图”。

CAN总线信号测量知识结构图 CAN总线信号测量核心逻辑 1. 测量准备 接线方式 示波器参数设置 触发策略 2. 波形识别 3. 错误诊断 显性位超时 位填充错误 CRC错误 总线关闭 调试口诀:先看物理层,再查协议层;波形不对,一切白费。

4.6 实战避坑指南

最后,分享几个我踩过的坑,希望能帮你少走弯路。

  • 不要只看差分信号:差分信号能告诉你逻辑状态,但看不到共模电压。共模电压漂移会导致收发器工作异常。我建议同时看CAN_H和CAN_L的单端波形。
  • 注意探头地线:探头地线夹子越长,引入的噪声越大。尽量用地线弹簧,或者直接焊一根短地线到节点GND上。
  • 终端电阻不能省:没有终端电阻,波形会反射,边沿会出现过冲和振铃。我曾经在实验室里调试一个节点,波形怎么都调不好,最后发现是终端电阻虚焊了。
  • 波特率要匹配:示波器的时基设置要和波特率匹配。500kbps的位时间是2µs,你如果用1ms/div的时基,看到的只是一团模糊的影子。

我的调试习惯:每次拿到一个新的CAN节点,我都会先上示波器,看一眼它的SOF波形。SOF是一个显性位,波形应该干净利落,上升沿和下降沿陡峭,没有毛刺。如果SOF波形都不干净,后面的数据大概率也有问题。