2、CAN物理层基础:CAN_H与CAN_L差分信号、终端电阻的作用、总线拓扑结构(直线型与星型)、位时序与采样点

各位同行,大家好。今天我们聊聊CAN物理层。

很多人一上来就写CAN报文、ID滤波,结果板子一上电,通讯死活不通。我见过太多这种情况了。其实问题往往出在物理层——信号都没传好,上层协议再漂亮也没用。

物理层,说白了就是CAN_H和CAN_L这两根线怎么干活。搞懂了它,你写代码心里才有底。

2.1 差分信号:CAN_H与CAN_L的默契配合

CAN总线用两根线传输信号,分别是CAN_H和CAN_L。它不是单端传输,而是差分传输。

什么是差分信号?

简单说,就是信号不靠一根线对地电压来传递,而是靠两根线之间的电压差。

  • 显性电平(Dominant):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差分电压约2V。此时总线被拉低,逻辑上为“0”。
  • 隐性电平(Recessive):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差分电压约0V。此时总线释放,逻辑上为“1”。

你想想看,如果外界有强电磁干扰,单端信号很容易被拉偏。但差分信号不一样——干扰同时作用在两根线上,差值基本不变。这就是CAN总线能在发动机舱这种恶劣环境里稳定工作的原因。

关键点:显性位会“覆盖”隐性位。也就是说,只要有一个节点发送显性位,总线就是显性。这是CAN总线仲裁的基础。

我个人习惯,在画原理图时,CAN_H和CAN_L的走线一定要等长、平行、靠近。我在一个项目中吃过亏——两根线走了不同层,结果信号反射严重,通讯距离缩了一半。

2.2 终端电阻:为什么必须加?加多少?

终端电阻,就是挂在CAN_H和CAN_L之间的那个电阻。标准值是120Ω。

它的作用有两个:

  1. 消除信号反射:高速信号在总线末端会反射回来,和原信号叠加,造成波形畸变。终端电阻把能量吸收掉。
  2. 提供差分负载:收发器需要一定的负载电流才能正常工作。没有终端电阻,总线驱动能力会出问题。

我记得有一次,客户说他们的CAN通讯偶尔丢帧。我过去一看,总线两端各有一个节点,但终端电阻只加了一端。另一端没加,信号反射得一塌糊涂。加上之后,问题立刻消失。

注意:终端电阻必须加在总线的最两端。如果加在中间,反射照样存在。而且电阻值必须是120Ω(标准),不能随意更换。

有些设计会把终端电阻做在节点内部,用跳线或开关控制。这样方便,但容易出错——如果两个节点都打开了终端电阻,等效电阻变成60Ω,总线负载过重。我曾经遇到过这种情况,通讯距离直接缩到10米以内。

2.3 总线拓扑结构:直线型 vs 星型

CAN总线推荐的是直线型拓扑,也叫总线型。所有节点都挂在一根主干线上,分支(stub)越短越好。

直线型拓扑的特点:

  • 信号传输路径单一,反射最小
  • 终端电阻容易放置(两端各一个)
  • 分支长度建议不超过0.3米(高速CAN)

星型拓扑呢?

所有节点通过一个中心集线器连接。这种结构在CAN总线里不推荐,但现实中偶尔会遇到——比如某个节点离主干太远,不得不拉一根长分支。

星型拓扑的问题在于:

  • 信号反射点多,波形容易畸变
  • 终端电阻不好放——放中心点?放末端?都不完美
  • 一旦中心节点故障,整个网络瘫痪

我建议:能用直线型,就别用星型。如果实在没办法,分支长度控制在1米以内,并且降低通讯速率(比如从500k降到250k)。

下面我画了一张图,帮你直观理解这两种拓扑的区别:

直线型拓扑(推荐) 节点1 节点2 节点3 节点4 节点5 120Ω 120Ω 星型拓扑(不推荐) HUB 节点1 节点2 节点3 节点4

2.4 位时序与采样点:数据是怎么被读准的?

CAN总线没有单独的时钟线。时钟是隐含在数据里的。每个节点用自己的晶振来采样总线电平。那问题来了——如果两个节点的晶振有偏差,怎么保证采样点一致?

这就靠位时序了。

一个CAN位时间被分成四段:

段名称 作用 说明
Sync_Seg(同步段) 同步所有节点 固定为1个Tq(时间量子)
Prop_Seg(传播段) 补偿信号传输延迟 可编程,1~8个Tq
Phase_Seg1(相位段1) 采样点前调整 可编程,1~8个Tq
Phase_Seg2(相位段2) 采样点后调整 可编程,1~8个Tq

采样点就在Phase_Seg1和Phase_Seg2之间。通常推荐采样点在位时间的70%~80%位置。比如500kbps的CAN,位时间2μs,采样点设在1.5μs左右。

经验值:对于500kbps的CAN,我常用的配置是:Tq=125ns,Sync_Seg=1,Prop_Seg=2,Phase_Seg1=7,Phase_Seg2=6。这样采样点在78.1%,很稳。

为什么采样点不能太靠前?因为信号从发送到接收有延迟,包括线缆延迟、收发器延迟。采样点太靠前,可能信号还没稳定。太靠后呢?留给Phase_Seg2的时间不够,同步调整能力变差。

我曾经调试过一个项目,两个节点距离200米,500kbps死活连不上。后来把采样点从75%调到80%,通讯就正常了。说白了,就是给信号多留了点稳定时间。

2.5 避坑指南:物理层常见问题

  • 终端电阻加错位置:不是加在节点上,是加在总线两端。我见过有人把120Ω电阻焊在每个节点上,结果等效电阻只有24Ω。
  • 分支太长:分支超过0.3米,反射就会明显。如果实在避不开,降低速率。
  • CAN_H和CAN_L接反:这个低级错误其实很常见。接反了,差分电压反相,通讯直接失败。
  • 共模电压超标:CAN收发器的共模范围一般是-2V~+7V。如果地电位差太大,收发器会损坏。

嗯,物理层就聊这么多。搞懂了这些,你写CAN驱动的时候心里就有谱了。下一章我们聊聊数据链路层——CAN帧的结构和ID仲裁。到时候见。


专注资料整理