3. CAN/CANFD协议详解:CAN总线物理层、CAN数据帧结构、CANFD与CAN的区别、CAN网络设计要点

大家好,欢迎来到第三章。这一章咱们聊聊CAN和CANFD。说实话,这俩协议在车载领域太常见了,几乎每个域控制器里都有它们的身影。我刚开始做智能驾驶那会儿,就被CAN总线上各种奇怪的问题折腾过。嗯,今天就把我这些年踩过的坑和总结的经验,一次性讲清楚。

3.1 CAN总线物理层:信号是怎么跑起来的?

先说说物理层。说白了,CAN总线就是两根线——CAN_H和CAN_L。它用的是差分信号传输。为什么用差分?抗干扰能力强啊。你想想看,车里面电磁环境多复杂,电机、点火线圈、各种开关,干扰源一大堆。差分信号能很好地抑制共模干扰,这就是它能在车上活这么久的原因。

CAN总线的电平逻辑是这样的:

  • 显性电平(Dominant):CAN_H比CAN_L高,逻辑上代表"0"
  • 隐性电平(Recessive):CAN_H和CAN_L电压接近,逻辑上代表"1"

这里有个关键点:显性电平会"覆盖"隐性电平。也就是说,只要有一个节点发送显性电平,总线上就是显性。这就是CAN总线仲裁的基础。我在项目中遇到过一个问题,有个节点一直发"0",结果整个总线都被它拉死了,其他节点发什么都不管用。排查了半天,发现是收发器的TX引脚被焊锡短路了。

总线终端电阻:CAN总线两端必须各接一个120Ω的电阻。为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω,匹配电阻能减少信号反射。少了这个电阻,总线在高速通信时会出现信号振铃,严重时直接通信失败。

3.2 CAN数据帧结构:一帧数据里藏着什么?

CAN的数据帧结构,我建议你把它背下来。因为调试的时候,你经常需要对着逻辑分析仪的波形,一比特一比特地看。

一个标准CAN数据帧(11位ID)包含以下部分:

  • SOF(Start of Frame):1个显性位,表示帧开始
  • 仲裁场:11位ID + RTR位(远程帧标志)
  • 控制场:IDE位 + r0保留位 + DLC(4位数据长度码)
  • 数据场:0~8字节数据
  • CRC场:15位CRC + 1位CRC分隔符
  • ACK场:1位ACK槽 + 1位ACK分隔符
  • EOF(End of Frame):7个隐性位

我个人习惯把仲裁场看作"谁有资格说话"的战场。ID越小,优先级越高。比如ID=0x001的节点,永远比ID=0x100的节点先抢到总线。所以设计时,关键信号一定要分配小ID。

避坑指南:我曾经在一个项目中,把两个节点的ID设成了相同的值。结果总线上一片混乱,数据时而对时而错。CAN协议虽然支持多主,但ID必须唯一。否则仲裁阶段会出问题,数据完整性无法保证。

3.3 CANFD与CAN的区别:快在哪里?强在哪里?

CANFD,全称CAN with Flexible Data-Rate。说白了,就是CAN的升级版。为什么要升级?因为传统CAN太慢了,最大1Mbps的速率,一帧最多8字节数据。对于智能驾驶这种动辄几百KB的传感器数据,根本不够用。

CANFD主要做了两件事:

  • 速率翻倍:数据段可以跑到8Mbps甚至更高。仲裁段还是原来的速率(保证兼容性),但数据段可以切到高速模式。
  • 数据量翻倍:一帧最多可以带64字节数据。原来要发8帧的数据,现在一帧搞定。

具体区别我列个表,一目了然:

特性 传统CAN CANFD
最大速率 1 Mbps 8 Mbps(数据段)
最大数据长度 8 字节 64 字节
帧格式 标准帧/扩展帧 兼容标准帧/扩展帧,增加FDF位
CRC 15位 17位(≤16字节)或21位(>16字节)
兼容性 向下兼容CAN,但CAN节点无法理解CANFD帧

这里有个容易忽略的点:CANFD的CRC算法更强了。数据量大了,出错概率也大了,所以CRC从15位升级到了17位或21位。嗯,这个细节在ISO 11898-1里有详细说明,做协议栈的朋友一定要看。

注意:CANFD和传统CAN虽然物理层一样,但数据链路层不同。混用时,CAN节点收到CANFD帧会报错。所以设计网络时,要么全上CANFD,要么用网关做协议转换。我见过有人把CANFD节点和CAN节点直接挂一条总线上,结果CAN节点疯狂报错,总线利用率直接爆表。

3.4 CAN网络设计要点:实战中的那些坑

做CAN网络设计,光懂协议是不够的。我总结几个实战中容易出问题的地方:

3.4.1 总线负载率

总线负载率,就是总线上实际传输数据的时间占比。一般建议不要超过30%。为什么?因为CAN总线是事件触发的,高负载时仲裁冲突会变多,实时性会下降。我曾经在一个项目中,把负载率干到了60%,结果紧急制动信号延迟了5ms——这在智能驾驶里是致命的。

3.4.2 节点数量

一条CAN总线理论上可以挂110个节点,但实际建议不超过30个。节点越多,总线电容越大,信号边沿会变缓,通信质量下降。我一般控制在20个以内,留点余量。

3.4.3 线束长度

CAN总线的最大长度和速率成反比。1Mbps时,最大长度约40米;250kbps时,可以到250米。这个关系在ISO 11898-2里有公式,但记住这个经验值就够了。

3.4.4 错误处理

CAN节点有错误计数器。连续发送失败,计数器会累加。超过一定阈值,节点会进入"总线关闭"状态,彻底停止通信。这个机制本来是保护总线的,但有时候也会误伤。我遇到过因为一个节点的晶振偏差太大,导致它总是发错CRC,最后把自己关掉了。排查起来特别费劲。

我的建议:设计CAN网络时,一定要预留诊断接口。通过诊断报文可以读取每个节点的错误计数器,快速定位问题节点。这个在量产后的售后维护中特别有用。

好了,这一章的内容就到这里。CAN和CANFD虽然看起来简单,但里面的门道不少。下一章我们会讲车载以太网,那又是一个全新的世界。有什么问题,欢迎在课程群里交流。