3、CAN FD位时序与同步:位时间组成、同步段、传播段、相位缓冲段、采样点

各位工程师朋友,咱们今天聊聊CAN FD的位时序。说实话,这块内容在刚入行时我总觉得是纯理论,直到有一次在高速CAN FD项目上栽了跟头——采样点没算对,整个网络在1Mbps以上就疯狂报错。从那以后,我每次做新项目都会老老实实把位时序算一遍。

3.1 位时间的基本组成

一个CAN FD的位时间,说白了就是发一个bit需要多长时间。它被分成了四段:

  • 同步段(Sync_Seg):固定1个时间量子(Tq)
  • 传播段(Prop_Seg):补偿物理延迟
  • 相位缓冲段1(Phase_Seg1):采样点前调整
  • 相位缓冲段2(Phase_Seg2):采样点后调整

你想想看,这四段加起来就是一个完整的位时间。我习惯用公式记:位时间 = Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2。单位都是Tq。

关键点:采样点位于Phase_Seg1和Phase_Seg2之间。这个位置决定了你能容忍多大的时钟偏差。

3.2 同步段(Sync_Seg)

同步段永远是1个Tq。它的作用很简单——检测总线上的跳变沿。每个节点都在这个段内采样总线电平,看看有没有从显性到隐性的跳变。

我记得有一次调试,发现某个节点总是同步失败。查了半天,原来是它的晶振精度不够,导致Sync_Seg里根本抓不到正确的跳变沿。嗯,这里要注意:同步段虽然短,但它决定了整个网络的同步基础。

3.3 传播段(Prop_Seg)

传播段用来补偿物理延迟。包括:

  • 总线传输延迟(信号在线上跑的时间)
  • 收发器延迟(从TX到RX的往返)
  • 比较器延迟(内部处理时间)

我一般这样估算:Prop_Seg = 2 × (总线延迟 + 收发器延迟)。为什么乘2?因为信号要从发送节点跑到接收节点,再回来。你想想看,CAN总线是线与逻辑,必须保证最远的两个节点也能正确仲裁。

个人经验:对于500kbps的CAN FD,我通常设Prop_Seg为3-5个Tq。如果总线长度超过10米,建议适当增加。我曾经在一个20米的总线上吃过亏,Prop_Seg设小了,结果远端节点总是仲裁失败。

3.4 相位缓冲段(Phase_Seg1 & Phase_Seg2)

这两个段是重同步的关键。Phase_Seg1在采样点之前,Phase_Seg2在采样点之后。

为什么需要它们?说白了,每个节点的晶振都有误差。假设你标称8MHz,实际可能是8.001MHz。时间长了,采样点就会漂移。相位缓冲段就是用来吸收这个漂移的。

我习惯这样分配:

  • Phase_Seg1:通常设为4-8个Tq,用于补偿时钟偏慢的情况
  • Phase_Seg2:通常设为4-8个Tq,用于补偿时钟偏快的情况

这里有个坑:Phase_Seg1和Phase_Seg2的长度直接影响采样点位置。采样点太靠前或太靠后,都会降低抗干扰能力。

3.5 采样点位置计算

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

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

举个例子,假设位时间由20个Tq组成:

Tq数
Sync_Seg 1
Prop_Seg 5
Phase_Seg1 6
Phase_Seg2 8

采样点 = (1 + 5 + 6) / 20 = 60%。嗯,这个值偏低。我一般推荐采样点在70%-87.5%之间。为什么?因为采样点越靠后,留给信号稳定建立的时间越多。

避坑指南:我曾经在一个项目中把采样点设到了55%,结果在电磁干扰强的环境下,误码率飙升到1%。后来改到80%,问题就解决了。记住:采样点不是越靠前越好,也不是越靠后越好,要根据你的总线长度和晶振精度来权衡。

3.6 重同步机制

CAN FD有两种重同步方式:

  • 硬同步:在总线空闲到起始帧时发生,强制所有节点对齐
  • 重同步:在正常通信中,根据跳变沿调整Phase_Seg1或Phase_Seg2的长度

重同步的调整量受SJW(同步跳转宽度)限制。SJW通常设为1-4个Tq。我习惯设成Phase_Seg1和Phase_Seg2中较小的那个值。

举个例子:如果Phase_Seg1=6,Phase_Seg2=8,那么SJW最大可以设6。但我不建议设这么大,因为SJW越大,系统对噪声越敏感。我一般设SJW=2或3。

3.7 实际配置建议

说了这么多理论,咱们来点实际的。我常用的配置步骤:

  1. 确定位时间:根据目标波特率计算总Tq数。比如500kbps,时钟40MHz,预分频2,则Tq=50ns,位时间=40个Tq。
  2. 分配各段:Sync_Seg固定1个Tq。Prop_Seg根据总线长度估算,一般3-5个Tq。剩下的给Phase_Seg1和Phase_Seg2,尽量让采样点在80%左右。
  3. 验证采样点:用公式算一下,确保在70%-87.5%之间。
  4. 设置SJW:通常设为2或3个Tq。

我的经验值:对于1Mbps的CAN FD,我常用配置是:Sync_Seg=1, Prop_Seg=3, Phase_Seg1=6, Phase_Seg2=10,采样点=80%。这个配置在大多数场景下都很稳定。

最后说一句:位时序配置没有万能公式。每个项目都要根据实际的总线长度、节点数量、晶振精度来调整。我建议你在做EMC测试前,先跑一下位时序的裕量测试——把采样点前后各调5%,看看系统还能不能正常工作。如果能,说明你的配置有足够的余量。

嗯,今天就聊到这里。下一章咱们讲CAN FD的错误检测与处理机制,那也是个容易踩坑的地方。