4、CAN总线位时序:位时间结构、同步段、传播段、相位缓冲段、采样点设置
好,咱们今天聊点硬核的——CAN总线的位时序。
说实话,我当年刚接触CAN的时候,觉得这东西不就是两根线发数据嘛,能有多复杂?直到我在一个电机控制项目里,总线莫名其妙丢帧,查了三天三夜,最后发现是采样点设置不对。嗯,从那以后,我再也不敢小看位时序了。
4.1 位时间结构:一个bit是怎么被切开的
你想想看,CAN总线上传输一个bit,不是简单地拉高拉低就完事了。它被分成了四个小段,每个段都有自己的使命。
一个完整的位时间,由以下四部分组成:
- 同步段(Sync_Seg):用于同步总线上的节点。固定为1个Tq(时间量子)。
- 传播段(Prop_Seg):补偿物理延迟,包括总线传输延迟和收发器延迟。
- 相位缓冲段1(Phase_Seg1):用于补偿边沿相位误差,采样点之前。
- 相位缓冲段2(Phase_Seg2):用于补偿边沿相位误差,采样点之后。
我习惯把位时间想象成一把尺子。同步段是零刻度,传播段是量程校准,两个相位缓冲段就是可调节的游标。采样点就落在Phase_Seg1和Phase_Seg2之间。
核心公式:
位时间 = 同步段 + 传播段 + 相位缓冲段1 + 相位缓冲段2
采样点位置 = (同步段 + 传播段 + 相位缓冲段1) / 位时间 × 100%
4.2 同步段:大家都得对齐
同步段,说白了就是给所有节点一个“对表”的机会。每个节点检测到总线上的下降沿时,都会把自己的时钟和这个边沿对齐。
为什么是下降沿?因为CAN总线是“显性”覆盖“隐性”,下降沿代表数据开始传输。这个段固定为1个Tq,不能改。
我记得有一次调试,一个学生问我:“老师,同步段能不能设成2个Tq?”我告诉他,你设成2个Tq,整个位时序就乱套了,采样点位置全跑偏。CAN协议里写死了,就是1个Tq,别动它。
4.3 传播段:物理世界的代价
传播段,补偿的是信号在物理介质上跑来跑去的时间。包括:
- 总线电缆的传输延迟
- 收发器的发送和接收延迟
- 比较器、隔离器等器件的延迟
这个段怎么设?我有个经验公式:
传播段长度 ≥ 2 × (总线长度 × 单位延迟 + 收发器延迟)
为什么是2倍?因为信号要从发送节点跑到接收节点,再回来。你想想看,如果传播段设得太短,信号还没到,采样点就来了,那读到的数据肯定是错的。
实战经验:
我曾经在一个500米长的CAN总线项目里,把传播段设成了8个Tq。当时有人觉得浪费,我说:“你省这8个Tq,丢帧一次就全赔回去了。”后来实测,稳得很。
4.4 相位缓冲段:给时钟误差留点余地
相位缓冲段1和相位缓冲段2,这两个家伙是位时序里的“缓冲器”。
为什么需要缓冲?因为每个节点的晶振都有误差,哪怕只有千分之几,跑久了也会累积出问题。相位缓冲段就是用来吸收这些误差的。
- Phase_Seg1:在采样点之前,可以延长(通过重新同步)。
- Phase_Seg2:在采样点之后,可以缩短(通过重新同步)。
我建议Phase_Seg1和Phase_Seg2的长度尽量相等,或者Phase_Seg1略长一点。这样采样点位置大概在70%~80%之间,比较安全。
注意:
相位缓冲段不能设得太短。如果Phase_Seg1小于2个Tq,重新同步时可能来不及调整。我曾经见过一个项目,Phase_Seg1设成1个Tq,结果总线温度一高就疯狂报错。查到最后,就是缓冲不够。
4.5 采样点设置:黄金位置在哪里
采样点,就是节点读取总线电平的那个瞬间。位置选得好不好,直接决定通信的可靠性。
我个人习惯把采样点设在位时间的75%~80%之间。为什么是这个范围?
- 太靠前(比如50%):信号还没稳定,容易读到毛刺。
- 太靠后(比如90%):留给相位缓冲段2的余量太少,时钟误差一累积就翻车。
下面是一个典型的位时序配置表,以500kbps为例:
| 参数 | 值 | 说明 |
|---|---|---|
| 位时间 | 16 Tq | 总长度 |
| 同步段 | 1 Tq | 固定 |
| 传播段 | 3 Tq | 根据总线长度调整 |
| 相位缓冲段1 | 8 Tq | 采样点前 |
| 相位缓冲段2 | 4 Tq | 采样点后 |
| 采样点位置 | 75% | (1+3+8)/16 |
这个配置我用了很多年,在125kbps到1Mbps的速率下都验证过,基本没出过问题。
4.6 避坑指南:我曾经踩过的雷
最后,分享几个我亲身经历过的坑:
- 坑一:采样点设成50%。我曾经在一个项目里图省事,直接用了默认配置。结果总线长度一超过100米,就开始丢帧。后来改成75%,问题消失。
- 坑二:传播段设得太短。有一次我为了追求高速率,把传播段压缩到1个Tq。结果总线上的节点稍微多点,就同步失败。记住,传播段不是用来省的。
- 坑三:忽略晶振误差。两个节点用不同精度的晶振,相位缓冲段必须留够余量。我建议至少留4个Tq给Phase_Seg2,否则温度变化时容易出问题。
总结一句话:
位时序不是玄学,是数学。同步段对齐,传播段补偿,相位缓冲段容错,采样点选在75%左右。按这个思路配,你的CAN总线基本稳了。
好了,这一章就聊到这里。下一章我们讲CAN的帧格式,到时候我会带你看懂数据帧、远程帧、错误帧这些“报文家族”。