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 (CH1):接 CAN_H
- 通道2 (CH2):接 CAN_L
- 探头地线:接总线地 (GND),注意不要接车身地,要接节点本地地
- 数学通道 (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总线信号测量核心逻辑
下面这张图,把这一章的核心知识点串起来了。从测量方法到波形识别,再到错误诊断,你可以把它当作调试时的“路线图”。
4.6 实战避坑指南
最后,分享几个我踩过的坑,希望能帮你少走弯路。
- 不要只看差分信号:差分信号能告诉你逻辑状态,但看不到共模电压。共模电压漂移会导致收发器工作异常。我建议同时看CAN_H和CAN_L的单端波形。
- 注意探头地线:探头地线夹子越长,引入的噪声越大。尽量用地线弹簧,或者直接焊一根短地线到节点GND上。
- 终端电阻不能省:没有终端电阻,波形会反射,边沿会出现过冲和振铃。我曾经在实验室里调试一个节点,波形怎么都调不好,最后发现是终端电阻虚焊了。
- 波特率要匹配:示波器的时基设置要和波特率匹配。500kbps的位时间是2µs,你如果用1ms/div的时基,看到的只是一团模糊的影子。
我的调试习惯:每次拿到一个新的CAN节点,我都会先上示波器,看一眼它的SOF波形。SOF是一个显性位,波形应该干净利落,上升沿和下降沿陡峭,没有毛刺。如果SOF波形都不干净,后面的数据大概率也有问题。