第2章 CAN协议详解:CAN2.0A/B协议、CAN FD协议、CAN报文帧格式

好,咱们直接进入正题。CAN协议这东西,说白了就是一套让车上各个电子单元能好好说话的规矩。我刚开始接触时也觉得头大,各种帧、各种位,但后来发现,只要抓住几个核心点,一通百通。

2.1 CAN2.0A与CAN2.0B:标准帧与扩展帧

先聊聊CAN2.0。这个协议分两个版本:A和B。区别在哪?说白了就是ID的长度。

  • CAN2.0A:标准帧,ID是11位。最多支持2^11=2048个不同的ID。早期车用这个就够了。
  • CAN2.0B:扩展帧,ID是29位。支持2^29个ID,数量级完全不一样。

我在项目里遇到过一个问题:一个老款ECU只支持CAN2.0A,结果新换的网关默认发扩展帧,两边直接对不上话。嗯,这里要注意,兼容性是个大坑。

关键点:CAN2.0B的节点可以接收CAN2.0A的报文,但反过来不行。所以设计系统时,如果混用,一定要把老节点升级或做协议转换。

2.2 CAN FD:更快、更大

CAN FD是CAN的升级版。为什么需要它?因为现在车上数据量越来越大,比如OTA升级、高清地图,传统CAN的8字节数据场根本不够用。

CAN FD有两个核心改进:

  • 可变速率:数据段可以跑更高的波特率(比如2Mbps甚至更高),仲裁段还是原来的速率。这样既保证了兼容性,又提升了速度。
  • 更大数据场:从8字节扩展到最多64字节。你想想看,一次能传64字节,效率提升可不是一星半点。

我个人习惯,在做新项目时,只要硬件支持,优先用CAN FD。毕竟,谁也不想以后为了带宽不够再改设计。

避坑指南:我曾经在一个项目中,CAN FD的采样点没调好,导致高速通信时偶尔丢帧。后来发现是位时序配置的问题。建议用示波器实测一下,别光靠理论计算。

2.3 CAN报文帧格式:四种帧类型

CAN总线上一共就四种帧:数据帧、远程帧、错误帧、过载帧。咱们一个一个说。

2.3.1 数据帧

这是最常用的帧,用来传输实际数据。结构如下:

  • 帧起始(SOF):1个显性位,告诉总线“我要开始发了”。
  • 仲裁场:包含ID和RTR位。ID决定优先级,RTR位区分是数据帧还是远程帧。
  • 控制场:包含IDE位、保留位和DLC(数据长度码)。DLC告诉接收方这次带了多少数据。
  • 数据场:0-8字节(CAN FD可达64字节)。
  • CRC场:校验数据完整性。
  • ACK场:接收节点确认收到。
  • 帧结束(EOF):7个隐性位。
// 一个标准数据帧的位序列示例(简化)
// SOF + ID(11位) + RTR + IDE + r0 + DLC(4位) + 数据(8字节) + CRC(15位) + ACK + EOF
// 实际发送时,硬件会自动处理这些细节
// 我们软件工程师主要关注ID、DLC和数据场

2.3.2 远程帧

远程帧用来请求数据。它没有数据场,但DLC字段会指明请求的数据长度。我刚开始做时,老搞混远程帧和数据帧的区别。其实很简单:远程帧是“问”,数据帧是“答”。

注意:远程帧的RTR位是隐性(1),而数据帧的RTR位是显性(0)。这个位在仲裁时很关键,因为显性位优先级更高。所以数据帧的优先级天然高于远程帧。

2.3.3 错误帧

当节点检测到总线错误时,就会发送错误帧。它由两部分组成:

  • 错误标志:6个连续相同极性的位(显性或隐性)。
  • 错误界定符:8个隐性位。

错误帧会破坏当前正在传输的报文,迫使所有节点重新发送。我在调试时,经常用CAN分析仪抓错误帧,来判断总线物理层有没有问题。

2.3.4 过载帧

过载帧用来告诉总线“我忙不过来了,慢点发”。它和错误帧结构类似,但触发条件不同。过载帧在实际项目中用得不多,但你要知道它的存在。

2.4 位填充机制

这个机制很有意思。CAN协议规定,在发送时,如果连续出现5个相同极性的位,就必须插入一个相反极性的位。为什么这么做?

原因有两个:

  1. 保证同步:接收节点靠电平跳变来同步时钟。如果长时间没有跳变,时钟就会漂移。
  2. 区分帧边界:比如帧结束是7个隐性位,如果没有位填充,连续7个隐性位可能被误判。

举个例子:如果你要发送的数据是 11111 00000,经过位填充后变成 111110 000001。注意,填充位是自动插入的,接收方也会自动移除。

实战经验:我曾经遇到一个奇怪的问题,总线偶尔出现位错误。排查了很久,最后发现是某个节点的晶振精度不够,导致位填充后的时序偏差累积。换了个高精度晶振就解决了。所以,硬件设计时,晶振精度一定要达标。

2.5 总结一下

这一章内容不少,但核心就几点:

  • CAN2.0A和B的区别在于ID长度,CAN FD是未来趋势。
  • 四种帧各有用途,数据帧最常用,远程帧用来请求,错误帧和过载帧是异常处理。
  • 位填充机制保证了总线的稳定同步,但也会带来额外的开销。

下一章,咱们会深入CAN的物理层和电气特性,看看这些协议在硬件上是怎么实现的。到时候再聊。