一、CAN与CANFD的区别:从实战中理解
说实话,我刚接触CANFD的时候,第一反应是——这不就是CAN的升级版吗?后来在项目里踩了坑才明白,事情没那么简单。
CAN(Controller Area Network)和CANFD(CAN with Flexible Data-Rate)最核心的区别,我总结为三点:
- 数据长度不同:CAN一次最多传8字节,CANFD可以传64字节。你想想看,一个ECU升级固件,用CAN得拆成几十帧,CANFD一帧搞定。
- 速率不同:CAN最高1Mbps,CANFD在数据段可以跑到8Mbps甚至更高。我在一个项目中测试过,同样的数据量,CANFD比CAN快了将近4倍。
- 帧格式不同:CANFD新增了BRS位和ESI位,这两个位是区分CAN和CANFD的关键。
重要提醒:CANFD向下兼容CAN,但反过来不行。也就是说,CANFD节点可以和CAN节点通信,但只能以CAN的速率和格式。这个坑我见过不少新手踩过。
二、CANFD帧结构:逐位拆解
CANFD的帧结构,说白了就是在CAN的基础上加了几个新东西。我习惯把帧分成三个部分来看:
2.1 仲裁段
这部分和CAN基本一样。11位标准ID或29位扩展ID,加上RTR位、IDE位等。嗯,这里要注意,CANFD的RTR位用法和CAN略有不同。
2.2 控制段
这是变化最大的地方。CANFD的控制段多了几个关键位:
- BRS位(Bit Rate Switch):1表示切换到高速模式,0表示保持原速率。我建议你在设计时,BRS位只在数据段切换,仲裁段保持原速率。
- ESI位(Error State Indicator):表示发送节点的错误状态。这个位在诊断中很有用,我曾经用它快速定位了一个间歇性故障的节点。
- DLC(Data Length Code):CANFD的DLC编码和CAN不一样。CAN的DLC最大8,CANFD可以到15(对应64字节)。
2.3 数据段
数据段是CANFD提速的关键区域。从BRS位之后到CRC之前,数据可以以最高速率传输。我个人习惯把数据段设计成8字节对齐,这样处理起来最方便。
实战技巧:我在做网关项目时,发现很多工程师把CANFD的DLC直接设成15(64字节)。其实没必要,根据实际数据量来设就好。比如传感器数据通常4字节就够了,设成8字节反而浪费带宽。
三、CANFD仲裁机制:还是那个老配方
仲裁机制,说白了就是多个节点同时发数据时,谁优先级高谁先发。CANFD沿用了CAN的CSMA/CA机制,也就是载波监听多路访问/冲突避免。
为什么会这样?因为仲裁段必须保持原速率,否则不同速率的节点没法一起仲裁。你想想看,如果仲裁段也跑8Mbps,那老CAN节点根本听不懂。
仲裁的过程是这样的:
- 所有节点监听总线,空闲时才能发
- 发送时,每个节点逐位比较ID
- ID小的(优先级高)自动获胜
- 失败的节点自动转为接收
避坑指南:我曾经在一个项目中,把两个节点的ID设成了0x100和0x101。结果发现0x101的节点总是发不出去。后来一查,0x100的优先级太高,几乎占满了总线。所以设计ID时,一定要考虑优先级分配。
四、CANFD数据速率提升原理:为什么能快4倍?
这个问题我问过很多工程师,大部分人的回答是「因为速率提高了」。其实没那么简单。
CANFD提速的核心原理,我总结为两点:
4.1 双速率机制
CANFD在同一个帧里用了两种速率:
- 仲裁段:标准速率(通常500kbps或1Mbps)
- 数据段:高速率(2Mbps到8Mbps)
这个设计很巧妙。仲裁段保持低速,保证兼容性;数据段跑高速,提升效率。我在一个项目中测试过,用5Mbps的数据段速率,传输64字节数据,时间只有CAN的1/4。
4.2 更长的数据段
64字节 vs 8字节,这个差距是8倍。但实际效率提升不止8倍,因为帧头帧尾的开销是固定的。你想想看,CAN传64字节需要8帧,每帧都有帧头帧尾;CANFD只需要1帧,省掉了7次帧头帧尾的开销。
下面这张图展示了CAN和CANFD的速率对比:
五、实战中的注意事项
说了这么多理论,最后分享几个我在项目中总结的经验:
采样点设置:CANFD的高速段对采样点要求更高。我建议采样点设在75%-85%之间,具体值要根据总线长度和节点数来调。太靠前或太靠后都容易出错。
终端电阻:CANFD跑高速时,终端电阻的影响更明显。我曾经在一个项目中,因为终端电阻用了120Ω的标准值,结果5Mbps死活跑不通。后来换成100Ω,问题就解决了。所以建议根据实际速率来选电阻值。
好了,这一章的内容就到这里。CANFD的基础知识,说白了就是理解它怎么在兼容CAN的同时提升效率。下一章我们会深入CANFD的物理层设计,到时候再聊。
公众号:蓝海资料掘金营,微信deep3321