2. CAN总线物理层:差分信号原理、CAN_H与CAN_L电平定义、总线终端电阻、总线长度与波特率关系
各位工程师朋友,咱们今天聊聊CAN总线物理层。很多人觉得物理层就是几个电阻、两根线,没啥好讲的。但我跟你说,恰恰是这些“基础”的东西,最容易在实车上出问题。我见过太多因为终端电阻焊错了位置、或者线束太长导致通信失败的案例了。
物理层是CAN通信的基石。它不复杂,但细节很多。咱们一个一个来拆解。
2.1 差分信号原理:为什么CAN要用两根线?
CAN总线用的是差分信号传输。说白了,就是信号不是靠一根线对地电压来传递,而是靠两根线(CAN_H和CAN_L)之间的电压差来传递。
你想想看,如果只用一根线传信号,比如传统的UART,信号电压是相对于GND的。一旦外界有电磁干扰,干扰信号叠加在信号线上,接收端就分不清了。但差分信号不一样——干扰同时作用在CAN_H和CAN_L上,两根线上的干扰幅度几乎相同,而接收器只关心它们的差值。干扰被抵消了,信号保住了。
核心优势:
- 抗共模干扰: 外部电磁干扰在两根线上产生相同的共模电压,差分接收器自动将其滤除。
- 抑制电磁辐射: CAN_H和CAN_L上的电流方向相反,产生的磁场相互抵消,对外辐射小。
- 故障容错: 即使一根线对地短路或断路,总线仍可能以单线模式继续工作(取决于具体实现)。
我在一个商用车项目中遇到过,客户抱怨总线偶尔丢帧。查了半天,发现是线束走线时CAN_H和CAN_L没有双绞,而是平行走了一米多。换成双绞线后,问题立刻消失。差分信号的优势,必须靠双绞线才能充分发挥。
2.2 CAN_H与CAN_L电平定义:显性与隐性
CAN总线定义了两种逻辑状态:显性(Dominant)和隐性(Recessive)。
- 隐性状态: CAN_H和CAN_L电压都约为2.5V,差分电压Vdiff ≈ 0V。此时总线呈现高阻抗,逻辑上对应“1”。
- 显性状态: CAN_H电压升至约3.5V,CAN_L电压降至约1.5V,差分电压Vdiff ≈ 2V。此时总线呈现低阻抗,逻辑上对应“0”。
这里有个关键点:显性位会覆盖隐性位。也就是说,只要有一个节点发送显性位,总线就是显性状态。这正是CAN总线仲裁机制的基础——谁先发“0”,谁就赢得总线控制权。
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (Vdiff) | 逻辑值 |
|---|---|---|---|---|
| 隐性 | 2.5V | 2.5V | ≈ 0V | 1 |
| 显性 | 3.5V | 1.5V | ≈ 2V | 0 |
个人经验: 测量CAN总线波形时,我习惯用差分探头直接看CAN_H和CAN_L的差值。如果看到显性位时差分电压低于1.2V,或者隐性位时差分电压超过0.5V,说明总线负载可能有问题,或者终端电阻匹配不当。
2.3 总线终端电阻:为什么必须加?加在哪里?
终端电阻是CAN总线物理层最容易出错的地方。它的作用有两个:
- 阻抗匹配: 防止信号在总线末端发生反射。信号到达开路末端会反弹回来,与后续信号叠加,造成波形畸变。
- 提供隐性电平: 终端电阻将CAN_H和CAN_L偏置到2.5V,确保总线在没有节点驱动时处于隐性状态。
标准CAN总线要求两端各接一个120Ω电阻。为什么是120Ω?因为CAN总线使用的双绞线特性阻抗大约是120Ω。匹配这个值,反射最小。
我曾经踩过的坑: 一个项目里,工程师在总线的每个节点上都加了120Ω电阻,一共6个节点,等效电阻只有20Ω。结果总线负载过重,显性位差分电压被拉低到不足1V,通信完全瘫痪。记住:只有总线物理最远的两端才需要加终端电阻,中间节点绝对不能加。
测量终端电阻的方法很简单:在总线断电状态下,用万用表测量CAN_H和CAN_L之间的电阻。如果测到约60Ω,说明两端各有一个120Ω电阻(并联等效)。如果测到120Ω,说明只有一端有电阻。如果测到远小于60Ω,说明电阻加多了。
2.4 总线长度与波特率关系:能跑多快,取决于能跑多远
CAN总线的通信距离和速率是相互制约的。速率越高,可靠通信的距离越短。原因在于信号在总线上的传播延迟和位采样点的要求。
CAN协议规定,每个位时间内,信号必须从发送端传播到最远节点并返回,且必须在采样点之前完成。如果总线太长,信号往返时间超过位时间的某个比例(通常要求小于位时间的50%),就会导致采样错误。
| 波特率 | 最大总线长度(典型值) | 适用场景 |
|---|---|---|
| 1 Mbps | 40 m | 动力总成、高速控制 |
| 500 kbps | 100 m | 车身控制、诊断 |
| 250 kbps | 250 m | 工业控制、车载舒适系统 |
| 125 kbps | 500 m | 楼宇自动化、远程I/O |
| 50 kbps | 1000 m | 长距离数据采集 |
这个表格是经验值,实际项目中还要考虑线缆质量、节点数量、分支长度等因素。我个人习惯在设计初期留出20%的余量——比如目标距离80米,我会按500kbps的极限来设计,而不是按250kbps。
设计准则:
- 总线长度 = 最远两个节点之间的线缆总长(包括分支)。
- 分支长度(stub)越短越好,建议不超过0.3米。分支过长会引入反射。
- 如果必须使用长分支,考虑使用CAN中继器或CAN-FD。
2.5 知识结构图:CAN物理层核心要素
下面这张图把物理层的几个关键要素串起来了。你可以看到,差分信号是基础,它决定了电平定义;终端电阻保证信号完整性;而总线长度和波特率则是系统级的权衡。
2.6 避坑指南:物理层常见问题
最后,我把自己这些年踩过的坑整理一下,希望能帮你少走弯路。
常见错误1:终端电阻加在中间节点
后果:总线负载过重,显性位幅值不足,通信不稳定。
正确做法:只在总线物理最远端加电阻。如果节点数量多,用万用表确认两端电阻值。
常见错误2:CAN_H和CAN_L接反
后果:差分电压反向,总线无法通信。有些收发器会保护,有些直接烧毁。
正确做法:上电前用万用表确认CAN_H对地约2.5V(隐性),CAN_L对地也是2.5V。显性时CAN_H上升,CAN_L下降。
常见错误3:总线长度超过波特率对应的极限
后果:远端的节点采样错误,出现偶发丢帧。
正确做法:按表格留余量。如果距离实在无法缩短,考虑降低波特率或使用CAN中继器。