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

各位工程师朋友,咱们今天聊聊CAN总线里一个特别关键、但又容易被忽视的话题——位时序。

说实话,我刚入行那会儿,觉得CAN通信只要能收发数据就行,什么位时序、采样点,都是理论课上的东西。直到有一次,我在一个车载项目里遇到了通信丢帧的问题,排查了整整两天,最后发现就是采样点设置不对。嗯,从那以后,我再也不敢小看这个参数了。

4.1 为什么位时序这么重要?

你想想看,CAN总线上的节点,每个都有自己的时钟。虽然大家都标称是500kbps,但实际晶振总有偏差,温度变化也会影响时钟漂移。如果没有一套机制来同步,节点之间的位对齐就会出问题。

说白了,位时序就是一套规则,告诉每个节点:

  • 一个位的时间有多长
  • 什么时候采样数据
  • 怎么调整时钟偏差

我个人的习惯是,在设计CAN网络时,先把位时序算清楚,再去做硬件选型。这样可以避免很多后期调试的麻烦。

4.2 位时间分段结构

一个CAN位时间,被分成了四个段。我画了一张图,方便你理解:

CAN位时间分段结构 一个位时间 (Bit Time) 同步段 Sync_Seg 传播段 Prop_Seg 相位缓冲段1 Phase_Seg1 相位缓冲段2 Phase_Seg2 采样点 0 t

每个段都有它的作用,咱们一个一个来看。

4.3 同步段 (Sync_Seg)

这是位时间的第一个段,固定为1个时间量子(Tq)。它的作用很简单——用于同步总线上的各个节点。

我记得有一次调试,发现某个节点总是同步失败,后来查出来是同步段配置被改成了2个Tq。虽然只差了1个Tq,但整个网络的同步性能就下降了。

关键点:同步段固定为1 Tq,不可配置。所有节点都在这个段内检测总线上的边沿(从显性到隐性或反之),用于时钟同步。

4.4 传播段 (Prop_Seg)

传播段用来补偿信号在总线上的传播延迟。这个延迟包括:

  • 信号从发送器到接收器的传播时间
  • 信号从接收器返回发送器的传播时间
  • 收发器本身的延迟

说白了,就是给信号一个「来回跑」的时间。我一般会这样估算:

Prop_Seg = 2 × (总线长度 × 单位延迟 + 收发器延迟)

举个例子,如果总线长度是40米,单位延迟约5ns/m,收发器延迟约150ns:

Prop_Seg = 2 × (40 × 5ns + 150ns) = 2 × 350ns = 700ns

嗯,这里要注意,传播段不能设得太小,否则远距离节点可能收不到数据。但也不能太大,会浪费位时间。

4.5 相位缓冲段 (Phase_Seg1 & Phase_Seg2)

这两个段是位时序的「弹性区域」。它们的作用是吸收时钟漂移,实现重同步。

相位缓冲段1(Phase_Seg1):位于采样点之前。当节点检测到需要重同步时,会延长这个段。

相位缓冲段2(Phase_Seg2):位于采样点之后。当节点检测到需要重同步时,会缩短这个段。

我的经验:Phase_Seg1和Phase_Seg2通常设置为相等的值,这样采样点正好在50%位置。但如果你对时钟精度没信心,可以适当增大Phase_Seg1,让采样点偏后一些,这样采样更稳定。

4.6 采样点设置

采样点,就是节点读取总线电平的那个时刻。它位于Phase_Seg1和Phase_Seg2之间。

采样点的位置用百分比表示:

采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 总位时间 × 100%

我整理了一个常见波特率下的推荐采样点设置表:

波特率 总Tq数 Sync_Seg Prop_Seg Phase_Seg1 Phase_Seg2 采样点位置
125 kbps 16 1 7 4 4 75%
250 kbps 16 1 5 5 5 68.75%
500 kbps 16 1 3 6 6 62.5%
1 Mbps 8 1 1 3 3 62.5%

避坑指南:我曾经在一个项目中,把采样点设在了87.5%的位置。当时觉得采样越晚越稳定,结果发现总线长度超过30米后,远端节点频繁出错。后来分析才发现,采样点太靠后,相位缓冲段2太小,没有足够的余量来吸收时钟漂移。建议采样点控制在60%-80%之间。

4.7 时间量子 (Tq) 的计算

时间量子是CAN控制器的最小时间单位。它由系统时钟分频得到:

Tq = 系统时钟周期 × (BRP + 1)

其中BRP是波特率预分频器(Baud Rate Prescaler)。

举个例子,如果系统时钟是40MHz,BRP设为3:

Tq = 25ns × (3 + 1) = 100ns

如果总位时间设为16个Tq,那么位时间就是1.6μs,对应的波特率是625kbps。

我个人习惯是先确定目标波特率,然后反推BRP和Tq数。这样不容易出错。

4.8 重同步机制

CAN总线有两种同步方式:硬同步和重同步。

硬同步:发生在总线从空闲状态变为忙碌状态时(即检测到帧起始的下降沿)。所有节点强制将当前位时间对齐到同步段。

重同步:发生在正常通信过程中。当节点检测到边沿位置与预期有偏差时,会调整相位缓冲段的长度。

重同步的调整量受SJW(同步跳转宽度)限制。SJW决定了每次重同步最多能调整多少个Tq。

建议:SJW一般设为1或2个Tq。设得太大,虽然同步能力强,但容易引入噪声干扰。设得太小,又可能跟不上时钟漂移。我通常设SJW = Phase_Seg1,这样既保证同步能力,又不会过度调整。

4.9 实际配置示例

假设我们要配置一个500kbps的CAN网络,系统时钟为40MHz:

目标位时间 = 1 / 500kbps = 2μs

选择总Tq数 = 16
Tq = 2μs / 16 = 125ns

BRP = Tq / 系统时钟周期 - 1 = 125ns / 25ns - 1 = 4

各段分配:
  Sync_Seg = 1 Tq
  Prop_Seg = 3 Tq
  Phase_Seg1 = 6 Tq
  Phase_Seg2 = 6 Tq

采样点位置 = (1 + 3 + 6) / 16 × 100% = 62.5%

SJW = 2 Tq

这个配置在实际项目中验证过,总线长度30米以内,节点数20个左右,通信非常稳定。

4.10 用Wireshark验证位时序

配置好位时序后,怎么验证它是否合理?我一般会用Wireshark抓一段CAN报文,然后观察:

  • 是否有连续的错误帧
  • 是否有位填充错误
  • ACK间隙是否正常

如果看到大量错误帧,先别急着怀疑硬件。检查一下位时序配置,八成是采样点或者SJW设得不对。

嗯,关于位时序的内容就讲到这里。记住一句话:位时序是CAN通信的基石,花时间把它算清楚,后面调试能省一半的功夫。


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