2、CANFD物理层:CANFD的位时序、采样点配置、总线拓扑与终端电阻
好,咱们进入CANFD物理层的核心话题。很多人觉得CANFD不就是CAN的升级版嘛,改改软件就能跑。其实不然。物理层这块要是没搞明白,你后面所有的高层协议都是空中楼阁。我见过太多项目,明明代码写得没问题,一上总线就丢帧,最后查出来是采样点配错了。嗯,咱们今天就把这事彻底说清楚。
2.1 位时序:CANFD为什么能跑得更快?
先说说位时序。CANFD和传统CAN最大的区别,就是它把一帧数据分成了两个阶段:仲裁段和数据段。仲裁段沿用CAN的速率(通常125k~1Mbps),数据段则可以飙到2Mbps、5Mbps甚至更高。
为什么会这样?你想想看,仲裁的时候需要多个节点同时发送,必须保证所有节点的位同步。这时候速率不能太快,否则信号在总线上的传播延迟会导致仲裁失败。但数据段不一样,数据段只有一个节点在发,其他节点只管收。这时候就可以把速率提上去,提高传输效率。
我个人习惯把位时序拆成四个部分来看:
- 同步段(Sync_Seg):固定1个时间量子(Tq),用于同步总线上的节点。
- 传播段(Prop_Seg):补偿物理延迟,包括收发器延迟和总线传播延迟。
- 相位缓冲段1(Phase_Seg1):用于补偿边沿相位误差,采样点通常在这里。
- 相位缓冲段2(Phase_Seg2):采样点之后的缓冲段,用于重新同步。
这里有个关键点:采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 总Tq数。这个值直接决定了你通信的可靠性。
核心结论:CANFD的数据段速率越高,对位时序的精度要求就越苛刻。5Mbps时,一个Tq只有200ns,稍有偏差就会采样错误。
2.2 采样点配置:我的血泪教训
说到采样点配置,我得先讲个故事。我曾经在一个车载网关项目里,CANFD配置成2Mbps/500kbps(数据段/仲裁段)。按照芯片手册的默认值,采样点设在87.5%。结果一跑起来,丢帧率高达3%。查了三天,最后发现是总线长度超过40cm,信号反射导致采样点落在了不稳定区域。
后来我把采样点调整到80%,问题立刻解决。所以你看,采样点不是越靠后越好,也不是越靠前越好,得根据实际总线长度和节点数来调。
我建议的配置原则:
- 仲裁段采样点:建议75%~85%。仲裁段速率低,对采样点要求相对宽松。
- 数据段采样点:建议70%~80%。速率越高,采样点越要往前提,给信号稳定留出余量。
- 总线长度超过1米:采样点往前提5%~10%。
- 节点数超过10个:采样点往后推3%~5%,给同步留空间。
下面给个典型配置表,供你参考:
| 数据段速率 | 仲裁段速率 | 推荐采样点(数据段) | 推荐采样点(仲裁段) |
|---|---|---|---|
| 2 Mbps | 500 kbps | 80% | 80% |
| 5 Mbps | 1 Mbps | 75% | 85% |
| 8 Mbps | 1 Mbps | 70% | 85% |
注意:不同芯片厂商的CANFD控制器,位时序寄存器配置方式可能不同。NXP、TI、Infineon的寄存器映射都不一样。换芯片时一定要重新计算Tq数,别直接套用。
2.3 总线拓扑:别再用CAN的思维设计CANFD网络
很多人觉得CANFD和CAN一样,随便拉根线就能用。其实不是。CANFD对总线拓扑的要求比CAN严格得多。
传统CAN总线,你可以用菊花链、星型甚至树型拓扑,只要终端电阻配好就行。但CANFD不行。为什么?因为高速信号对阻抗不连续非常敏感。你想想看,5Mbps的信号,上升沿只有几十纳秒。一个分支接头、一个线缆粗细变化,都会造成信号反射。
我建议的拓扑原则:
- 首选:直线型总线。所有节点通过短截线(stub)连接到主干线上。主干线两端各一个120Ω终端电阻。
- 短截线长度:数据段速率2Mbps时,短截线不超过0.3米;5Mbps时,不超过0.1米。超过这个长度,信号反射会严重到无法通信。
- 避免星型拓扑。除非你使用有源集线器或中继器,否则星型拓扑在CANFD高速模式下基本不可用。
- 节点间距:尽量均匀分布。不要一个节点离终端电阻很近,另一个节点离得很远。
这里有个避坑指南:我曾经在一个项目里,客户坚持要用星型拓扑,说这样布线方便。我劝了三次没劝住,结果样机测试时,5Mbps速率下根本跑不通。最后改成直线型,问题解决。所以,拓扑选择不是设计自由,而是物理约束。
2.4 终端电阻:不是随便焊两个120Ω就完事
终端电阻这事,看起来简单,其实坑很多。CANFD的终端电阻和CAN一样,标准值是120Ω,但实际应用中要考虑几个因素。
首先,终端电阻的作用是匹配总线特性阻抗,消除信号反射。CAN总线的特性阻抗通常在120Ω左右,所以两端各接一个120Ω电阻,并联后等效60Ω。这个60Ω就是总线上的差分负载电阻。
但CANFD高速运行时,对终端电阻的精度要求更高。我建议:
- 电阻精度:至少1%,最好0.5%。普通5%的电阻在5Mbps下可能引入额外的信号抖动。
- 电阻功率:1/4W或1/2W足够。CANFD的驱动电流不大,但要注意电阻的寄生电感。
- 封装选择:0805或0603都可以,但尽量用贴片电阻,减少引线电感。
- 分体式终端:有些设计会把一个120Ω拆成两个60Ω,中间接一个电容到地。这种设计可以滤除共模噪声,但要注意电容的ESR和频率特性。
小技巧:如果你在调试时发现总线信号有振铃,可以尝试在终端电阻上并联一个小电容(10pF~100pF)。这个电容可以减缓信号边沿,减少过冲。但别加太大,否则会影响信号速率。
最后说一句,终端电阻的位置也很重要。必须放在总线的最远端,而不是随便找个节点焊上。我见过有人把两个终端电阻都放在同一个节点上,结果总线两端阻抗不匹配,信号反射得一塌糊涂。
好了,CANFD物理层的内容就这些。说白了,位时序、采样点、拓扑、终端电阻,这四个东西是环环相扣的。你调好一个,另外三个也得跟着调。别指望靠软件补偿物理层的缺陷,那是不可能的。下一章咱们聊聊CANFD的数据链路层,到时候会讲到帧格式和错误处理,那又是另一番天地了。