1. CAN总线基础:CAN协议概述、CAN2.0与CAN FD区别、物理层与数据链路层

各位同学,咱们今天聊聊CAN总线的基础。说实话,我入行那会儿,CAN总线还是绝对的王者,几乎所有车载网络都靠它撑着。现在虽然有了CAN FD、以太网这些新秀,但CAN的基础地位依然稳固。你想想看,一辆车上少说几十个ECU,大部分还是靠CAN在通信。

1.1 CAN协议概述

CAN,全称Controller Area Network,控制器局域网。这玩意儿是德国Bosch公司在1980年代发明的,初衷是为了解决汽车内部线束太多的问题。我记得第一次接触CAN协议时,最让我惊讶的是它的多主站架构——总线上任何一个节点都可以主动发消息,不需要主从关系。

CAN协议的核心特点,我总结了几点:

  • 多主站通信:任何节点都能发起通信,没有主从之分
  • 基于消息的寻址:不是给节点编号,而是给消息分配ID
  • 非破坏性仲裁:多个节点同时发送时,ID小的优先
  • 错误检测与恢复:5种错误检测机制,自动重发
  • 实时性:确定性延迟,适合控制类应用

关键点:CAN的仲裁机制是它的灵魂。ID越小,优先级越高。0是最高优先级。我在项目中遇到过一个问题:两个ECU同时发送,结果低优先级的总是发不出去,后来发现是ID分配不合理。

1.2 CAN2.0与CAN FD的区别

嗯,这里要重点讲一下。CAN2.0是经典版本,分为A和B两个子版本。CAN2.0A是11位ID,CAN2.0B是29位ID。我刚开始做项目时,用的基本都是CAN2.0B,29位ID足够用了。

CAN FD(Flexible Data-rate)是2012年Bosch推出的升级版。说白了,就是给CAN提速了。为什么需要提速?因为现代汽车电子系统越来越复杂,传统的8字节数据帧已经不够用了。

我列个表格,大家看得更清楚:

特性 CAN2.0 CAN FD
数据长度 最多8字节 最多64字节
传输速率 最高1 Mbps 数据段最高8 Mbps
帧格式 标准帧/扩展帧 兼容CAN2.0,新增FDF标志
CRC校验 15位CRC 17位或21位CRC
兼容性 与CAN2.0节点可共存

我个人习惯,在CANalyzer里分析CAN FD时,会特别注意数据段的速率。你想想看,仲裁段还是1 Mbps,但数据段可以跑到8 Mbps,这个切换点就是BRS位。我曾经调试过一个项目,CAN FD节点总是丢帧,查了半天发现是BRS位设置不对,导致接收端没跟上速率切换。

实战技巧:在CANalyzer中,可以通过Trace窗口的「BRS」和「ESI」列快速识别CAN FD帧。如果BRS位为1,说明数据段使用了高速率。

1.3 物理层

物理层,说白了就是信号怎么在线上跑。CAN总线用的是差分信号,两条线:CAN_H和CAN_L。为什么用差分?抗干扰能力强啊。你想想看,汽车发动机舱里电磁干扰那么严重,单端信号根本扛不住。

CAN的物理层有几个关键参数:

  • 显性电平:CAN_H比CAN_L高,逻辑0
  • 隐性电平:CAN_H和CAN_L电压相等,逻辑1
  • 终端电阻:120欧姆,两端各一个
  • 总线长度:与速率相关,1 Mbps时最长40米

避坑指南:我曾经遇到过一个问题,总线上的终端电阻用了100欧姆,结果信号反射严重,通信时好时坏。后来换成标准的120欧姆,问题就解决了。记住,终端电阻一定要匹配,不能随便换。

1.4 数据链路层

数据链路层,就是帧格式和协议细节。CAN的帧类型有四种:数据帧、远程帧、错误帧、过载帧。咱们最常用的是数据帧。

一个标准的数据帧结构是这样的:

SOF + 11位ID + RTR + IDE + r0 + 4位DLC + 0~8字节数据 + 15位CRC + CRC分隔符 + ACK + ACK分隔符 + EOF

我刚开始学的时候,觉得这个结构挺复杂的。后来用CANalyzer抓了几次波形,就全明白了。这里我重点讲几个关键字段:

  • SOF:帧起始,一个显性位
  • ID:标识符,决定优先级
  • RTR:远程帧标志,0表示数据帧
  • DLC:数据长度,0~8
  • CRC:循环冗余校验,15位
  • ACK:应答位,接收节点拉低表示收到

重点:CAN的位填充机制。连续5个相同电平后,自动插入一个相反电平。这是为了同步时钟。我在CANalyzer里分析总线负载时,经常看到位填充导致的实际比特数比理论值多。你算负载率时,一定要考虑这个因素。

嗯,这里要注意一下。CAN FD的数据链路层和CAN2.0有些不同。CAN FD在数据段取消了位填充,改用更高效的CRC校验。这也是为什么CAN FD能跑更高速率的原因之一。

我记得有一次,客户抱怨说他们的CAN总线负载率已经到80%了,但实际通信还是正常。我一看,他们用的是CAN FD,数据段速率高,实际占用总线的时间比CAN2.0短得多。所以,负载率不能只看百分比,还要看帧长度和速率。

好了,这一章的内容就到这里。CAN总线基础是后续所有分析工作的前提。你把这些概念吃透了,后面分析总线负载和延迟时,才能得心应手。