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 实际配置建议
说了这么多理论,咱们来点实际的。我常用的配置步骤:
- 确定位时间:根据目标波特率计算总Tq数。比如500kbps,时钟40MHz,预分频2,则Tq=50ns,位时间=40个Tq。
- 分配各段:Sync_Seg固定1个Tq。Prop_Seg根据总线长度估算,一般3-5个Tq。剩下的给Phase_Seg1和Phase_Seg2,尽量让采样点在80%左右。
- 验证采样点:用公式算一下,确保在70%-87.5%之间。
- 设置SJW:通常设为2或3个Tq。
我的经验值:对于1Mbps的CAN FD,我常用配置是:Sync_Seg=1, Prop_Seg=3, Phase_Seg1=6, Phase_Seg2=10,采样点=80%。这个配置在大多数场景下都很稳定。
最后说一句:位时序配置没有万能公式。每个项目都要根据实际的总线长度、节点数量、晶振精度来调整。我建议你在做EMC测试前,先跑一下位时序的裕量测试——把采样点前后各调5%,看看系统还能不能正常工作。如果能,说明你的配置有足够的余量。
嗯,今天就聊到这里。下一章咱们讲CAN FD的错误检测与处理机制,那也是个容易踩坑的地方。