2、CAN总线基础:CAN协议概述、CAN帧结构、CAN总线物理层

好,咱们正式开始啃CAN总线的基础知识。这一章是后面所有仿真的地基,我建议你花点时间把它吃透。说白了,搞懂CAN协议,你才能明白CANoe里那些报文、信号、DBC文件到底在折腾什么。

2.1 CAN协议概述——为什么它能在汽车里活这么久?

CAN总线,全称Controller Area Network,控制器局域网。1980年代由Bosch公司发明,初衷是为了解决汽车里线束太多、太重、太容易出故障的问题。你想想看,一辆车里有几十个ECU,如果每个ECU之间都拉一根独立的线,那车重得跟坦克似的。

CAN协议的核心思想就两条:多主通信报文仲裁

  • 多主通信:总线上任何一个节点都可以主动发消息,不需要主机来调度。这跟I2C、SPI那种主从模式完全不同。
  • 报文仲裁:如果两个节点同时发消息,谁的优先级高谁先发。优先级由报文ID决定,ID越小优先级越高。

我个人习惯把CAN总线比作一个会议室。谁有话说,直接开口。如果两个人同时开口,职位高的(ID小的)先说。其他人听到高优先级的人开口了,自动闭嘴,等他说完再试。

CAN协议目前最常用的版本是CAN 2.0,分为A和B两部分。CAN 2.0A是标准帧,ID是11位;CAN 2.0B是扩展帧,ID是29位。现在新车基本都用扩展帧,但老项目里标准帧依然常见。我在一个商用车项目里就遇到过,对方ECU只支持标准帧,害得我改了一版DBC文件。

2.2 CAN帧结构——报文长什么样?

CAN总线上传输的基本单位叫“帧”。一共有四种帧类型:数据帧远程帧错误帧过载帧。咱们一个一个说。

2.2.1 数据帧——最常用的帧

数据帧就是用来传输实际数据的。它的结构比较复杂,我直接给你拆开看:

字段 位数 说明
SOF 1 帧起始,显性电平(0),告诉总线“我要发消息了”
仲裁场 12或32 包含ID(11位或29位)和RTR位(远程帧标志)
控制场 6 包含IDE位、保留位、DLC(数据长度,0-8字节)
数据场 0-64 实际要传的数据,最多8字节
CRC场 16 循环冗余校验,检查数据有没有传错
ACK场 2 应答位,接收节点拉低表示收到了
EOF 7 帧结束,隐性电平(1)

避坑指南:我曾经在调试一个电机控制器时,发现报文偶尔丢帧。查了半天,原来是DLC设置错了。发送方DLC填了8,但数据场只填了4个有效字节,接收方读到后面4个字节全是垃圾数据。记住:DLC必须与实际数据长度一致

2.2.2 远程帧——问别人要数据

远程帧长得跟数据帧几乎一样,唯一的区别是RTR位为隐性(1)。它的作用是:一个节点发远程帧,请求另一个节点发送数据。

举个例子:发动机ECU想知道当前车速,它就发一个远程帧,ID填车速报文的ID。仪表ECU收到后,就会把车速数据发出来。

嗯,这里要注意:远程帧本身不带数据场。它只是“问”,不“给”。

2.2.3 错误帧——出问题了怎么办?

CAN协议有很强的错误检测机制。任何一个节点发现总线出错,就会立刻发错误帧。错误帧由两部分组成:

  • 错误标志:6个连续的显性位(正常帧里不允许出现6个相同电平)
  • 错误界定符:8个隐性位

错误帧一出现,所有节点都会收到通知,然后发送方会自动重发刚才的报文。这就是CAN总线“自愈”能力的一部分。

警告:如果总线上错误帧太多,节点会进入“总线关闭”状态,彻底退出通信。我在一个实验室项目里见过,一个节点接地不良,疯狂发错误帧,把整条总线都拖垮了。排查了整整两天才找到原因。

2.2.4 过载帧——我忙不过来了

过载帧用得比较少。当一个节点处理不过来的时候,它会发过载帧,告诉其他节点“慢点,我消化不了”。结构跟错误帧类似,也是6个显性位加8个隐性位。

说实话,我在实际项目中几乎没见过过载帧。现在的MCU性能都够强,很少出现处理不过来的情况。但考试可能会考,你记住就行。

2.3 CAN总线物理层——信号是怎么在线上跑的?

CAN总线物理层用的是差分信号。两根线:CAN_H和CAN_L。电平逻辑是这样的:

  • 显性(Dominant):CAN_H比CAN_L高2V左右,逻辑值为0
  • 隐性(Recessive):CAN_H和CAN_L电压相等(约2.5V),逻辑值为1

为什么用差分信号?抗干扰能力强。两根线绞在一起,外部电磁干扰对两根线的影响几乎一样,差分接收器一减,干扰就被抵消了。

你想想看,汽车发动机舱里电磁环境多恶劣,火花塞点火、电机换向,全是强干扰源。CAN总线能在这种环境里稳定工作,差分信号功不可没。

参数 典型值 说明
总线长度 ≤40m(1Mbps时) 速率越高,距离越短
终端电阻 120Ω 总线两端各一个,消除信号反射
最大节点数 30-110 取决于收发器驱动能力
常用速率 125kbps / 250kbps / 500kbps / 1Mbps 动力系统常用500k,车身常用125k

我个人经验:做CANoe仿真时,物理层参数一定要跟实际硬件一致。我见过有人仿真跑得好好的,一接实车就报错,最后发现仿真里设的速率是500k,实车ECU配的是250k。这种低级错误,排查起来最浪费时间。

2.4 小结——这一章你该记住什么?

好,咱们捋一遍:

  1. CAN协议是多主通信,靠ID仲裁决定谁先发
  2. 数据帧是主力,远程帧是“问”,错误帧是“报警”,过载帧是“慢点”
  3. 物理层用差分信号,抗干扰能力强
  4. 终端电阻必须配,否则信号反射会让你怀疑人生

下一章咱们就要进CANoe了。我会带你搭第一个仿真工程,亲手发一条CAN报文。到时候你会发现,纸上得来终觉浅,还是动手最实在。

课后小练习:打开CANoe,新建一个工程,在Trace窗口里观察一下数据帧和远程帧的区别。看看RTR位在两种帧里分别是什么状态。动手试一下,比看十遍书都管用。