4、CAN总线位时序:位时间结构、同步段、传播段、相位缓冲段、采样点

各位同学,咱们今天聊点硬核的——CAN总线的位时序。

说实话,我刚入行那会儿,觉得位时序这东西就是个理论参数,配个默认值就完事了。直到有一次,我在一个车载项目里,总线老是丢帧,查了三天硬件,最后发现是采样点没配好。嗯,从那以后,我再也不敢小看位时序了。

4.1 位时间的基本结构

CAN总线的一个位,说白了就是一个逻辑电平持续的时间。比如你设了500kbps的波特率,那一个位的时间就是2微秒。

但你别以为这2微秒就是简简单单一个方波。CAN协议把这一位切成了四段:

  • 同步段(Sync_Seg)
  • 传播段(Prop_Seg)
  • 相位缓冲段1(Phase_Seg1)
  • 相位缓冲段2(Phase_Seg2)

采样点就夹在Phase_Seg1和Phase_Seg2之间。这个位置,决定了你能不能正确读到总线上的电平。

核心公式:

位时间 = 同步段 + 传播段 + 相位缓冲段1 + 相位缓冲段2

采样点位置 = (同步段 + 传播段 + 相位缓冲段1) / 位时间 × 100%

4.2 同步段(Sync_Seg)

同步段是每个位的开头,固定为1个TQ(Time Quantum,时间量子)。

它的作用很简单——让总线上的所有节点对齐时钟。你想想看,每个节点都有自己的晶振,频率不可能完全一样。同步段就是用来做这个“握手”的。

我记得有一次调试,发现某个节点的晶振偏差到了1.5%,结果同步段根本拉不回来,总线直接报错。后来换了高精度晶振,问题就解决了。

我的习惯:选晶振时,精度至少0.5%以上。工业环境建议0.25%。别省这点钱,后面调试更贵。

4.3 传播段(Prop_Seg)

传播段,顾名思义,是用来补偿信号在总线上的传播延迟的。

这个延迟包括两部分:

  • 信号从发送节点到接收节点的物理传输时间
  • 收发器本身的延迟(比如TJA1050这类芯片,大概几十纳秒)

传播段的长度,一般设置为2倍的物理延迟。为什么是2倍?因为信号要发过去,再回来(回波补偿),所以是往返时间。

我建议你按这个公式估算:

Prop_Seg = 2 × (总线长度 × 5ns/m + 收发器延迟)
// 举个例子:10米总线,收发器延迟50ns
// Prop_Seg = 2 × (10 × 5 + 50) = 200ns

注意:传播段不能设得太短,否则远距离节点收不到信号。但也不能太长,会挤占相位缓冲段的时间,影响同步容差。

4.4 相位缓冲段(Phase_Seg1 & Phase_Seg2)

这两个段,是位时序里最灵活的部分。它们的作用是吸收时钟偏差,实现重新同步。

具体来说:

  • Phase_Seg1:采样点之前,用于延长位时间(如果节点发现时钟慢了)
  • Phase_Seg2:采样点之后,用于缩短位时间(如果节点发现时钟快了)

你想想看,每个节点的晶振都有误差。如果A节点比B节点快了一点,那A发出来的位,B读到的时刻就会逐渐偏移。相位缓冲段就是用来“追”这个偏移的。

我曾经在一个项目里,把Phase_Seg1设成了3个TQ,Phase_Seg2设成了2个TQ。结果采样点位置跑到了87.5%,总线在高温下频繁出错。后来我把两个段调成了4和3,采样点降到80%,问题就消失了。

经验值:采样点位置建议在75%~85%之间。高速CAN(1Mbps)推荐87.5%,低速CAN(125kbps)推荐80%左右。

4.5 采样点

采样点,就是节点真正读取总线电平的那个时刻。它位于Phase_Seg1的末尾。

为什么采样点这么重要?

  • 采样点太靠前:信号还没稳定,容易读到毛刺
  • 采样点太靠后:留给Phase_Seg2的时间不够,同步容差变小

我个人的习惯是:先根据波特率和晶振算出TQ的个数,然后反推采样点位置。比如:

假设:波特率500kbps,位时间=2μs,TQ=125ns
则:位时间 = 16 TQ
分配:Sync=1, Prop=5, Phase1=6, Phase2=4
采样点 = (1+5+6)/16 = 75%

这个配置,我在多个项目里验证过,稳定可靠。

4.6 位时序配置实战

咱们来看一个实际的配置表。以常见的S32K144芯片为例:

参数 推荐值 说明
波特率 500 kbps 车载常用
TQ数 16 位时间 = 16 × TQ
Sync_Seg 1 TQ 固定值
Prop_Seg 5 TQ 根据总线长度调整
Phase_Seg1 6 TQ 可调
Phase_Seg2 4 TQ 可调
采样点 75% 推荐范围75%~85%

避坑指南:我曾经在调试时,直接把别人的配置复制过来用,结果总线死活不通。后来发现,对方的晶振是8MHz,我的是16MHz,TQ长度完全不一样。所以,位时序一定要根据你自己的晶振和波特率重新算。

4.7 重新同步机制

最后聊一下重新同步。CAN总线有两种同步方式:

  • 硬同步:发生在总线从空闲到开始传输的时刻,所有节点强制对齐到Sync_Seg
  • 软同步:发生在正常传输过程中,通过调整Phase_Seg1和Phase_Seg2的长度来微调

软同步的调整幅度,受SJW(同步跳转宽度)限制。SJW一般设为1~4个TQ,不能超过Phase_Seg1的长度。

嗯,这里要注意:SJW设得越大,同步能力越强,但抗干扰能力会下降。我一般设成1或2,除非总线特别长或者晶振精度特别差。

好了,位时序这部分就讲到这里。下一章咱们聊CAN的帧结构,那个更精彩。


公众号:蓝海资料掘金营,微信deep3321