第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Ω电阻,不能多也不能少。
总线长度和速率的关系,我列个表给你看:
| 总线长度 | 最大位速率 | 典型应用 |
|---|---|---|
| 40m | 1 Mbps | 车内动力总成 |
| 100m | 500 kbps | 车身控制 |
| 500m | 125 kbps | 工业现场 |
| 1km | 50 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的主要差异:
| 特性 | CAN | CAN FD |
|---|---|---|
| 最大数据场 | 8字节 | 64字节 |
| 位速率 | 固定(最高1 Mbps) | 仲裁段≤1 Mbps,数据段≤8 Mbps |
| 帧格式 | 标准/扩展 | 新增FD帧格式 |
| CRC | 15位 | 17位(≤16字节)/21位(>16字节) |
| 兼容性 | — | CAN FD节点可收CAN帧 |
我记得第一次用CAN FD时,数据段跑到了5 Mbps。当时测了一下,一个64字节的帧,传输时间从原来的约500μs降到了约150μs。这个提升,对于需要传输大数据的应用(比如OTA升级、ADAS传感器数据)来说,太关键了。
1.5 位速率与数据场优化
CAN FD的位速率不是随便设的。它受限于:
- 收发器性能:有些老收发器不支持高速
- 总线长度:速率越高,总线越短
- 节点数量:节点越多,信号质量越差
我建议的配置策略:
- 仲裁段:保持500 kbps或1 Mbps,兼容性好
- 数据段:从2 Mbps开始试,逐步提高,直到误码率达标
- 数据场大小:不是越大越好。64字节的帧,如果只传8字节,浪费带宽。动态调整数据场大小,能提升总线利用率
警告:CAN FD和CAN混用时,一定要确保所有节点都支持CAN FD。否则,CAN FD节点发了FD帧,老CAN节点会报错,然后发错误帧,把整个总线搞乱。我见过一个项目,就因为混用,总线瘫痪了三天。
最后,我画了一张图,帮你理清CAN/CAN FD的知识体系:
这张图把CAN和CAN FD的关系理清楚了。你看,底层物理层和数据链路层是共通的,区别主要在上层的数据场大小和位速率策略。
我的建议:新项目直接上CAN FD。虽然芯片贵一点,但64字节的数据场和8 Mbps的速率,给未来留足了余量。老项目如果只是传几个传感器值,CAN 2.0完全够用,别折腾。
好了,这一章就到这里。CAN/CAN FD的核心就是:物理层搞定信号传输,数据链路层搞定帧组织和仲裁,CAN FD在数据段提速。下一章我们聊LIN总线,那个更简单,但坑也不少。
公众号:蓝海资料掘金营,微信deep3321