第2章:CANFD物理层与数据链路层:位时序、同步机制、数据场长度编码(DLC)、速率切换机制
各位好,我是老周。今天咱们聊聊CANFD最底层的那些事儿——物理层和数据链路层。说实话,很多工程师做CANFD开发,上来就怼应用层,结果遇到通信不稳定、丢帧、甚至总线挂死,回头才发现是底层配置没搞对。我当年也踩过这个坑,所以这一章,咱们把底子打扎实。
2.1 位时序:CANFD的“心跳”怎么调?
CANFD的位时序,说白了就是决定一个bit在总线上待多久。你想想看,总线上那么多节点,大家要在一个bit的时间里完成采样、同步,时间得算准了。
CANFD的位时序分成四段:
- 同步段(Sync_Seg):固定1个Tq(时间量子),用于检测跳变沿。
- 传播段(Prop_Seg):补偿物理延迟,比如线缆长度、收发器延迟。
- 相位缓冲段1(Phase_Seg1):用于重同步,可延长。
- 相位缓冲段2(Phase_Seg2):用于重同步,可缩短。
这里有个关键点:采样点的位置。采样点通常在Phase_Seg1末尾。我建议你把采样点设在80%左右,这样抗干扰能力最强。为什么?因为总线信号在跳变后需要稳定时间,采样点靠后,信号更稳定。
避坑指南:我曾经在一个项目里,把采样点设在了60%,结果总线长度超过10米就开始丢帧。后来改成82%,问题解决。记住:采样点太靠前,容易采到毛刺;太靠后,留给相位缓冲段2的时间不够,同步会出问题。
位时序的配置公式:
位时间 = (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × Tq
采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / 位时间 × 100%
举个例子,假设Tq=50ns,位时间=16Tq,那么:
- Sync_Seg = 1Tq
- Prop_Seg = 3Tq
- Phase_Seg1 = 8Tq
- Phase_Seg2 = 4Tq
- 采样点 = (1+3+8)/16 = 75%
嗯,75%是个不错的起点。但如果你在高速模式下(比如2Mbps以上),我建议再往后调一点,到80%-85%。
2.2 同步机制:怎么让所有节点步调一致?
CANFD的同步机制分两种:硬同步和重同步。
硬同步发生在总线从空闲到开始传输的瞬间。每个节点检测到帧起始(SOF)的下降沿时,会强制把自己的位时序对齐到这个跳变沿。说白了,就是大家“对表”。
重同步发生在帧传输过程中。如果某个节点的时钟有偏差,它会在检测到跳变沿时,调整自己的相位缓冲段长度。具体规则:
- 如果跳变沿落在Phase_Seg1内,说明节点时钟偏慢,需要延长Phase_Seg1。
- 如果跳变沿落在Phase_Seg2内,说明节点时钟偏快,需要缩短Phase_Seg2。
这里有个参数叫SJW(同步跳转宽度),它限制了每次重同步能调整的最大Tq数。我建议SJW设为1~2个Tq,太大容易引入抖动,太小又跟不上时钟漂移。
我的经验:在混合速率场景下(比如仲裁段500kbps,数据段2Mbps),SJW要按仲裁段来配置。因为仲裁段对同步要求更高,数据段反而可以通过速率切换来规避同步问题。
2.3 数据场长度编码(DLC):不只是0~8那么简单
经典CAN的DLC只有0~8,对应0~8字节数据。但CANFD把DLC扩展到了0~15,对应关系如下:
| DLC值 | 经典CAN数据长度(字节) | CANFD数据长度(字节) |
|---|---|---|
| 0~8 | 0~8 | 0~8 |
| 9 | 8 | 12 |
| 10 | 8 | 16 |
| 11 | 8 | 20 |
| 12 | 8 | 24 |
| 13 | 8 | 32 |
| 14 | 8 | 48 |
| 15 | 8 | 64 |
注意看,DLC=9~15在经典CAN里都映射到8字节,但在CANFD里对应更大的数据长度。这意味着什么?意味着如果你在CANFD网络上混用经典CAN节点,DLC=9~15的帧会被经典CAN节点当成错误帧处理!
警告:我曾经在一个混合网络中,CANFD节点发送了DLC=12的帧,结果经典CAN节点直接报错,总线进入被动错误状态。排查了整整两天才发现是DLC不兼容。所以,混合组网时,DLC值绝对不能超过8。
2.4 速率切换机制:仲裁段慢,数据段快
CANFD最牛的地方之一,就是速率切换。仲裁段用慢速(比如500kbps),保证所有节点都能参与仲裁;数据段用快速(比如2Mbps~8Mbps),提高传输效率。
速率切换发生在BRS(波特率切换)位。当BRS=1时,从BRS位之后切换到高速模式;当BRS=0时,全程保持仲裁段速率。
切换的时序控制很关键。我画了一张图,帮你理解这个过程:
从图上你能看到,速率切换不是瞬间完成的。在BRS位之后,发送节点会等待一个速率切换延迟,让所有接收节点完成时钟切换。这个延迟通常由收发器内部的PLL锁定时间决定,一般在几十纳秒到几微秒之间。
我个人习惯在配置速率切换时,留出至少2个bit的余量。比如数据段目标速率是5Mbps,我会把收发器配置成支持6Mbps,这样切换时不会因为PLL锁定时间导致采样错误。
避坑指南:我曾经在一个项目里,数据段速率设到了8Mbps,结果发现某些节点的收发器根本锁不住。后来查手册才知道,那个收发器的PLL锁定时间需要200ns,而8Mbps下一个bit只有125ns,根本来不及切换。所以,速率切换不是越快越好,得看收发器的硬件能力。
2.5 知识体系总览
最后,我用一张图把这一章的核心逻辑串起来:
嗯,这一章的内容就到这里。位时序、同步、DLC、速率切换,这四个东西是CANFD的基石。你配置好了,通信就稳了;配不好,后面应用层写得再漂亮也是白搭。下一章咱们聊聊CANFD的帧格式和错误处理,到时候你会发现,底层的东西理解透了,上层的问题一眼就能看穿。
公众号:蓝海资料掘金营,微信deep3321