第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时,全程保持仲裁段速率。

切换的时序控制很关键。我画了一张图,帮你理解这个过程:

CANFD速率切换时序图 仲裁段 (500kbps) BRS=1 速率切换点 数据段 (2Mbps~8Mbps) CRC段 (高速) t0 t1 t2 t3 • t0~t1: SOF + 仲裁场 + 控制场 (慢速) • t1~t2: 数据场 (快速) • t2~t3: CRC + ACK + EOF (快速)

从图上你能看到,速率切换不是瞬间完成的。在BRS位之后,发送节点会等待一个速率切换延迟,让所有接收节点完成时钟切换。这个延迟通常由收发器内部的PLL锁定时间决定,一般在几十纳秒到几微秒之间。

我个人习惯在配置速率切换时,留出至少2个bit的余量。比如数据段目标速率是5Mbps,我会把收发器配置成支持6Mbps,这样切换时不会因为PLL锁定时间导致采样错误。

避坑指南:我曾经在一个项目里,数据段速率设到了8Mbps,结果发现某些节点的收发器根本锁不住。后来查手册才知道,那个收发器的PLL锁定时间需要200ns,而8Mbps下一个bit只有125ns,根本来不及切换。所以,速率切换不是越快越好,得看收发器的硬件能力。

2.5 知识体系总览

最后,我用一张图把这一章的核心逻辑串起来:

CANFD物理层与数据链路层 位时序 同步机制 DLC编码 速率切换 • Sync_Seg (1Tq) • Prop_Seg (延迟补偿) • Phase_Seg1/2 (重同步) • 采样点位置 (80%推荐) • 硬同步 (SOF下降沿) • 重同步 (相位调整) • SJW (1~2Tq) • 0~8: 0~8字节 • 9~15: 12~64字节 • 混合网络限制 • BRS位控制 • 仲裁段慢速 • 数据段快速 • PLL锁定时间 核心逻辑:位时序决定通信基础 → 同步机制保证节点一致 → DLC决定数据容量 → 速率切换提升效率 四者环环相扣,任何一个配置不当,都会导致通信失败

嗯,这一章的内容就到这里。位时序、同步、DLC、速率切换,这四个东西是CANFD的基石。你配置好了,通信就稳了;配不好,后面应用层写得再漂亮也是白搭。下一章咱们聊聊CANFD的帧格式和错误处理,到时候你会发现,底层的东西理解透了,上层的问题一眼就能看穿。


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