第1章:CAN FD的位速率切换机制
各位同学,今天我们来聊聊CAN FD里最核心的一个特性——位速率切换。说实话,我第一次接触这个机制的时候,也被绕得有点晕。但搞明白之后,你会发现它其实很巧妙。
1.1 标称位速率 vs 数据位速率
CAN FD和传统CAN最大的区别在哪?说白了,就是它能在同一个报文里跑两种速度。
- 标称位速率(仲裁段):这是总线仲裁阶段用的速度。通常我习惯设成500kbps或1Mbps。为什么?因为仲裁需要所有节点同时参与,速度太快容易出问题。
- 数据位速率(数据段):这是传输数据时用的速度。可以飙到2Mbps、5Mbps甚至更高。我在项目里最高用到过8Mbps,嗯,前提是总线拓扑要够干净。
你想想看,仲裁的时候大家慢慢来,数据传输的时候猛加速——这就是CAN FD的精髓。
核心区别总结:
| 参数 | 仲裁段 | 数据段 |
|---|---|---|
| 位速率 | 固定(通常≤1Mbps) | 可调(最高8Mbps+) |
| 作用 | 总线仲裁、ID传输 | 数据负载传输 |
| 采样点 | 通常87.5% | 可灵活配置 |
1.2 BRS位的作用
BRS位,全称是Bit Rate Switch。这个位只有1个bit,但它的作用可大了。
我在项目中遇到过这样一个坑:有一次抓包发现数据段速率没切换上去,排查了半天,最后发现是BRS位被置成了隐性。嗯,从那以后我每次配置CAN FD控制器,都会先检查BRS位的设置。
- BRS = 显性(0):不切换速率,整个报文都用标称位速率传输。说白了就是降级成传统CAN。
- BRS = 隐性(1):在BRS位之后立即切换到数据位速率,直到CRC分隔符再切回来。
我的小技巧:调试阶段建议先把BRS置1,看看数据段能不能正常跑高速。如果不行,再降回标称速率排查问题。
1.3 位速率切换的时序要求
速率切换不是瞬间完成的,它需要满足严格的时序要求。我给大家画个图,这样更直观。
从图上你能看到,速率切换发生在两个关键点:
- BRS位之后:从标称速率切换到数据速率。这个切换必须在BRS位采样完成后立即发生。
- CRC分隔符之前:从数据速率切回标称速率。这个切换要提前完成,确保ACK段能正常采样。
注意:我曾经在项目里遇到过切换时序不对导致整个网络崩溃的情况。原因是某个节点的晶振偏差太大,高速率下采样点偏移了。所以,建议各位在选型时一定要关注CAN FD控制器的PLL精度。
1.4 实际抓包中的速率切换观察
好了,理论讲完了,咱们来看看实际抓包怎么观察速率切换。我习惯用Wireshark的CAN FD解析器,它会把BRS位和速率信息直接标出来。
Frame 1: 64 bytes on wire (512 bits), 64 bytes captured (512 bits)
CAN FD Protocol
Identifier: 0x123
Flags: 0x01
.... ...1 = BRS: Bit Rate Switch (1)
.... ..0. = ESI: Error State Indicator (0)
Data Length Code: 8 (64 bytes)
Bit Rate: Arbitration 500 kbps, Data 2 Mbps
Data: 01 02 03 04 05 06 07 08
CRC: 0xABCD
CRC Delimiter: 1
ACK Slot: 1
ACK Delimiter: 1
EOF: 7 bits
你看这个抓包结果,Wireshark明确标出了:
- BRS = 1:说明这个报文启用了速率切换
- Arbitration 500 kbps, Data 2 Mbps:仲裁段500k,数据段2M
- 如果BRS = 0,这里只会显示一个速率值
我的观察技巧:在Wireshark里,我习惯把CAN FD的报文过滤出来,然后看"Bit Rate"这一列。如果看到两个速率值,说明速率切换成功了。如果只有一个,那就要检查BRS位是不是被置0了。
另外,你还可以通过Wireshark的"IO Graph"功能,观察总线上的实际速率变化。我个人习惯把仲裁段和数据段用不同颜色标出来,这样一眼就能看出哪些时间段在跑高速。
嗯,关于位速率切换,今天就先聊这么多。记住一句话:仲裁段求稳,数据段求快,BRS位就是那个开关。搞明白了这个,CAN FD你就掌握了七成。
本章要点回顾:
- CAN FD支持两种位速率:仲裁段(标称)和数据段(高速)
- BRS位控制是否启用速率切换(1=切换,0=不切换)
- 速率切换有严格的时序要求,切换点必须在BRS位之后和CRC分隔符之前
- Wireshark可以直观显示BRS位和实际速率值