2、CAN总线基础回顾:CAN物理层、CAN数据帧结构、CAN总线仲裁机制、CAN错误处理

各位同学,咱们开始第二讲。

做CANoe测试,不懂CAN总线底层,就像开车不看仪表盘。你可能会调通脚本,但出了问题根本不知道从哪下手。我个人习惯是,不管项目多急,先花半小时把物理层和帧结构过一遍。这半小时,往往能省下后面几天的排查时间。

2.1 CAN物理层:差分信号与总线电平

CAN总线物理层,说白了就是两根线:CAN_H和CAN_L。它靠的是差分电压传输信号。

显性电平(Dominant):CAN_H比CAN_L高2V左右。逻辑上代表“0”。
隐性电平(Recessive):CAN_H和CAN_L电压接近相等(约2.5V)。逻辑上代表“1”。

这里有个关键点:显性电平会“覆盖”隐性电平。你想想看,如果两个节点同时发,一个发0(显性),一个发1(隐性),那总线上最终看到的是0。这就是仲裁的基础。

重要参数速查表

参数典型值说明
CAN_H隐性电压2.5V无通信时总线电压
CAN_L隐性电压2.5V同上
CAN_H显性电压3.5V发送显性位时
CAN_L显性电压1.5V发送显性位时
差分电压(显性)2.0V3.5V - 1.5V
总线终端电阻120Ω两端各一个,防信号反射

我在项目中遇到过一件事:某次台架测试,CAN通信时断时续。查了半天,发现是终端电阻虚焊了。一个120Ω的电阻,折腾了整整一天。嗯,这里要注意,终端电阻不是摆设,它直接影响信号质量。

2.2 CAN数据帧结构:标准帧与扩展帧

CAN数据帧,是咱们打交道最多的东西。一个完整的数据帧,包含以下几个部分:

  1. SOF(帧起始):1个显性位,告诉所有节点“我要发数据了”。
  2. 仲裁场:包含ID和RTR位。标准帧ID是11位,扩展帧是29位。
  3. 控制场:包含IDE位、DLC(数据长度代码)。DLC告诉你后面跟了几个字节的数据。
  4. 数据场:0~8个字节。这就是我们真正要传递的信息。
  5. CRC场:15位CRC校验 + 1位CRC界定符。用来检查数据有没有传错。
  6. ACK场:接收节点如果正确收到,会在ACK槽位发显性位回应。
  7. EOF(帧结束):7个隐性位,表示帧传输完毕。

个人经验:我建议你在CANoe的Trace窗口里,把“显示细节”打开。你会看到每一帧的SOF、ID、DLC、Data、CRC、ACK。看多了,你闭着眼都能背出帧结构。

标准帧和扩展帧的区别,主要就在ID长度上。标准帧ID范围是0x000~0x7FF(2048个),扩展帧ID范围是0x00000000~0x1FFFFFFF(约5.3亿个)。

怎么区分?看控制场里的IDE位。IDE=0是标准帧,IDE=1是扩展帧。就这么简单。

2.3 CAN总线仲裁机制:谁优先级高谁先走

仲裁机制,是CAN总线最巧妙的设计之一。多个节点同时发数据,不会冲突,而是优先级高的节点自动获胜

过程是这样的:

  • 所有节点同时发送SOF和ID位。
  • 每个节点在发送ID位的同时,监听总线电平。
  • 如果自己发的是隐性位(1),但总线上是显性位(0),说明有更高优先级的节点在发数据。
  • 这个节点立刻停止发送,转为接收模式。
  • 等总线空闲了,再重新尝试发送。

为什么会这样?因为显性位(0)会覆盖隐性位(1)。所以ID值越小,优先级越高

避坑指南:我曾经在实车测试时,发现某个ECU总是发不出数据。查了ID分配表才发现,它的ID是0x7FF,是所有节点里优先级最低的。只要总线上有别的节点在发,它就永远抢不到总线。后来我们重新规划了ID分配,把关键信号的ID设小,才解决问题。

你想想看,如果两个节点ID分别是0x100和0x200,同时发送。0x100的二进制是0001 0000 0000,0x200是0010 0000 0000。从最高位开始比,第3位0x100是0(显性),0x200是1(隐性)。0x200检测到总线是0,自己发的是1,立刻退出。0x100获胜。

2.4 CAN错误处理:五种错误类型与错误状态

CAN总线有非常完善的错误处理机制。这也是它能在汽车这种恶劣环境下可靠工作的原因。

错误类型有五种:

错误类型触发条件个人理解
位错误发送节点发送的位与监听到的位不一致说白了就是“我说的话和听到的不一样”
填充错误连续出现6个相同电平位CAN协议规定每5个相同位后必须插入一个相反位
CRC错误接收节点计算的CRC与发送节点的不一致数据在传输过程中被干扰了
形式错误帧格式中固定为隐性/显性的位出现错误电平比如EOF必须是7个隐性位,出现显性就是形式错误
应答错误发送节点在ACK槽没有收到显性位说明没有节点正确收到数据

每个节点内部有两个计数器:发送错误计数器(TEC)接收错误计数器(REC)。根据计数值,节点会处于三种状态之一:

  • 主动错误(Error Active):TEC<127且REC<127。可以正常通信,检测到错误时发送主动错误标志(6个显性位)。
  • 被动错误(Error Passive):TEC>127或REC>127。可以通信,但检测到错误时只能发送被动错误标志(6个隐性位)。
  • 总线关闭(Bus Off):TEC>255。节点完全断开与总线的连接,不再参与任何通信。

实战要点:在CANoe里,你可以通过“CAN Statistics”窗口实时查看总线的错误帧数量、错误状态。如果发现某个节点的错误计数器持续增长,基本可以断定它的硬件或软件有问题。我遇到过最离谱的一次,是一个ECU的CAN收发器供电不稳,导致它频繁发送错误帧,把整个总线都拖垮了。

好了,这一章的内容就这些。物理层让你知道信号怎么走,帧结构让你看懂数据长什么样,仲裁机制让你明白为什么有些节点总抢不到总线,错误处理让你知道出了问题该怎么排查。这些都是后面做睡眠唤醒测试的基础中的基础。

下一章,咱们聊聊CANoe的基本操作。到时候我会手把手教你怎么建工程、配DBC、跑仿真。咱们下节课见。