第1章:CAN/CAN FD协议详解

1.1 CAN总线物理层——信号怎么在线上跑

说实话,很多人一上来就啃CAN的协议栈,却忽略了物理层。我早年吃过这个亏——在实验室调得好好的,一上车就丢帧。后来才发现,是终端电阻没配好。

CAN总线物理层用的是差分信号。两根线:CAN_H和CAN_L。平时两根线都是2.5V,这叫隐性位(逻辑1)。当节点要发送显性位(逻辑0)时,CAN_H拉到3.5V,CAN_L拉到1.5V。差值2V,这就是显性。

关键点:显性位会覆盖隐性位。仲裁机制就是靠这个实现的。

终端电阻一般是120Ω。为什么?因为CAN总线特性阻抗就是120Ω。我见过有人偷懒不接终端电阻,结果信号反射得一塌糊涂。嗯,这里要注意:每个网段两端各一个120Ω电阻,不能多也不能少

总线长度和速率的关系,我列个表给你看:

总线长度最大位速率典型应用
40m1 Mbps车内动力总成
100m500 kbps车身控制
500m125 kbps工业现场
1km50 kbps楼宇自动化

你想想看,为什么速率上不去?因为信号在线上传播需要时间。位时间必须大于信号往返时间,否则采样点会采到反射波。这个坑我踩过——曾经把1Mbps的CAN拉到200米,结果误码率直接爆表。

1.2 数据链路层——帧是怎么组织的

CAN的数据链路层,说白了就是一套收发规则。它定义了帧格式、错误检测、应答机制。我个人习惯把数据链路层分成两部分:帧结构总线访问

先看帧结构。CAN有四种帧:

  • 数据帧:最常用,传数据用的
  • 远程帧:请求对方发数据
  • 错误帧:检测到错误时主动发出
  • 过载帧:告诉对方我忙,慢点发

数据帧的结构是这样的:

SOF + 仲裁场 + 控制场 + 数据场 + CRC场 + ACK场 + EOF

SOF是起始帧,一个显性位。EOF是结束帧,7个隐性位。中间的部分,我重点说说仲裁场。

1.3 仲裁机制——谁先说话谁有理

CAN总线是多主架构。任何节点都可以随时发数据。那冲突了怎么办?靠仲裁。

仲裁的原理很简单:ID越小,优先级越高。所有节点同时发送ID位,谁先发隐性位(1)而别人发显性位(0),谁就退出。剩下的那个继续发。

举个例子:节点A的ID是0x100,节点B的ID是0x200。二进制:

  • A: 0001 0000 0000
  • B: 0010 0000 0000

第3位,A发0(显性),B发1(隐性)。B检测到总线是0,知道自己输了,立刻转为接收模式。A继续发完。

避坑指南:我曾经遇到一个项目,两个节点的ID设成了0x100和0x101。你猜怎么着?0x100永远抢不过0x101,因为最后一位不同。所以设计ID时,高位要留给高优先级消息,比如刹车信号用0x001,车窗用0x100。

标准CAN(CAN 2.0A)的ID是11位。扩展CAN(CAN 2.0B)是29位。我个人建议:能用11位就别用29位。为什么?仲裁时间短,延迟更低。

1.4 CAN FD——老树开新花

CAN FD是CAN的升级版。FD全称是Flexible Data-rate。说白了就是:仲裁段用慢速,数据段用快速

为什么要这么设计?因为仲裁需要所有节点同步,速率不能太高。但数据段只有发送节点在发,可以跑快一点。这个思路很巧妙,对吧?

CAN FD和CAN的主要差异:

特性CANCAN FD
最大数据场8字节64字节
位速率固定(最高1 Mbps)仲裁段≤1 Mbps,数据段≤8 Mbps
帧格式标准/扩展新增FD帧格式
CRC15位17位(≤16字节)/21位(>16字节)
兼容性CAN FD节点可收CAN帧

我记得第一次用CAN FD时,数据段跑到了5 Mbps。当时测了一下,一个64字节的帧,传输时间从原来的约500μs降到了约150μs。这个提升,对于需要传输大数据的应用(比如OTA升级、ADAS传感器数据)来说,太关键了。

1.5 位速率与数据场优化

CAN FD的位速率不是随便设的。它受限于:

  • 收发器性能:有些老收发器不支持高速
  • 总线长度:速率越高,总线越短
  • 节点数量:节点越多,信号质量越差

我建议的配置策略:

  1. 仲裁段:保持500 kbps或1 Mbps,兼容性好
  2. 数据段:从2 Mbps开始试,逐步提高,直到误码率达标
  3. 数据场大小:不是越大越好。64字节的帧,如果只传8字节,浪费带宽。动态调整数据场大小,能提升总线利用率

警告:CAN FD和CAN混用时,一定要确保所有节点都支持CAN FD。否则,CAN FD节点发了FD帧,老CAN节点会报错,然后发错误帧,把整个总线搞乱。我见过一个项目,就因为混用,总线瘫痪了三天。

最后,我画了一张图,帮你理清CAN/CAN FD的知识体系:

CAN/CAN FD 知识体系 CAN/CAN FD 总线 CAN (2.0A/2.0B) CAN FD 物理层:差分信号、终端电阻、位速率 数据链路层:帧结构、仲裁、错误检测 数据场:8→64字节,带宽提升 位速率:仲裁段/数据段双速率 核心差异:仲裁机制相同,数据段速率不同 CAN FD 向下兼容 CAN,但混用时需注意节点兼容性

这张图把CAN和CAN FD的关系理清楚了。你看,底层物理层和数据链路层是共通的,区别主要在上层的数据场大小和位速率策略。

我的建议:新项目直接上CAN FD。虽然芯片贵一点,但64字节的数据场和8 Mbps的速率,给未来留足了余量。老项目如果只是传几个传感器值,CAN 2.0完全够用,别折腾。

好了,这一章就到这里。CAN/CAN FD的核心就是:物理层搞定信号传输,数据链路层搞定帧组织和仲裁,CAN FD在数据段提速。下一章我们聊LIN总线,那个更简单,但坑也不少。


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