CAN FD的协议控制位详解:FDF、BRS与ESI的协同工作
去年在调试某款车规级MCU的CAN FD通信时,遇到一个诡异现象:节点A发送的数据帧,节点B偶尔能收到,偶尔收不到,而且收不到的时候示波器上波形看起来完全正常。折腾了两天,最后发现是BRS位在作祟——节点B的收发器不支持CAN FD的快速数据段,但控制器却错误地将BRS置1了。这个坑让我意识到,CAN FD协议控制位的理解不能停留在“知道有这几个位”的层面,必须深入到它们如何协同工作、如何影响物理层行为。
FDF位:CAN FD的身份标识
FDF(FD Format)位位于控制场的第一个位,紧跟在IDE位之后。经典CAN帧中,IDE位后的保留位r0在CAN FD中被重新定义为FDF。这个位的状态决定了整个帧的“身份”:FDF=0表示这是一个经典CAN帧,FDF=1表示这是一个CAN FD帧。
实际调试中容易忽略的是:FDF位的位置决定了它必须在仲裁段就被正确解析。如果接收节点不支持CAN FD,当它看到FDF=1时,会直接报格式错误并发送错误帧。这就是为什么混装网络中,经典CAN节点和CAN FD节点不能随意互发数据——除非你使用CAN FD的“经典CAN兼容模式”,即FDF=0的帧。
有个细节值得注意:FDF位本身并不决定数据段速率,它只是告诉接收方“我要用CAN FD格式了”。真正决定速率切换的是BRS位。我曾经见过有人把FDF和BRS搞混,认为FDF=1就自动启用高速模式,结果在配置寄存器时把BRS位写死了,导致所有CAN FD帧都跑在仲裁段速率上,白白浪费了带宽。