2、CAN总线基础:CAN协议帧结构、位时序与同步、错误帧与总线仲裁、CAN与CAN-FD区别

好,咱们正式开始聊CAN总线的基础。这部分内容,说实在的,是车载网络测试的根基。你如果连CAN的帧长什么样、怎么仲裁、怎么报错都搞不清楚,那后面用CANoe做一致性测试,基本就是瞎忙活。

我个人习惯,每次带新人,第一件事就是让他们把CAN的帧结构画出来,默写一遍。别笑,这招真管用。你想想看,你连报文里哪个bit是干什么的都不知道,怎么去分析总线上的异常?

2.1 CAN协议帧结构

CAN总线上一共就四种帧:数据帧、远程帧、错误帧、过载帧。咱们平时打交道最多的,就是数据帧。

数据帧的结构,我拆成几个关键段来讲:

  • 帧起始(SOF):一个显性位,告诉总线上所有节点:“我要开始说话了”。
  • 仲裁段:这里包含ID和RTR位。ID决定了消息的优先级,数字越小优先级越高。RTR位用来区分是数据帧还是远程帧。
  • 控制段:包含IDE位、保留位和DLC(数据长度码)。DLC告诉你后面跟了多少个字节的数据。
  • 数据段:0到8个字节,这就是你要传的实际数据。
  • CRC段:15位CRC校验码,加上一个隐性CRC界定符。用来检查传输有没有出错。
  • ACK段:发送节点发隐性位,接收节点如果正确收到,就拉成显性位。这就是“应答”的过程。
  • 帧结束(EOF):7个隐性位,表示帧结束了。

重点提醒: 标准帧的ID是11位,扩展帧是29位。我在项目中遇到过有人把标准帧和扩展帧的ID搞混,结果报文发出去,接收节点死活不认。嗯,这种低级错误,排查起来最浪费时间。

2.2 位时序与同步

这部分稍微有点抽象,但很重要。说白了,CAN总线上的所有节点,得有一个统一的“节拍”,不然你发1,我读成0,那就乱套了。

CAN的位时间分成四段:

段名称作用
同步段(Sync_Seg)用于同步总线上的各个节点,长度固定为1个Tq
传播段(Prop_Seg)补偿物理延迟,比如线缆长度、收发器延迟
相位缓冲段1(Phase_Seg1)用于补偿边沿相位误差,采样点在这里
相位缓冲段2(Phase_Seg2)用于补偿边沿相位误差,采样点之后

采样点通常设置在Phase_Seg1和Phase_Seg2之间。我个人习惯,采样点设置在87.5%左右比较稳妥。为什么?因为总线上的信号有上升沿和下降沿,采样点太靠前或太靠后,都容易采到不稳定的电平。

同步分两种:硬同步和重同步。硬同步发生在帧起始时,所有节点都对齐到SOF的下降沿。重同步则是在帧中间,通过调整相位缓冲段的长度来跟上发送节点的节奏。

避坑指南: 我曾经在一个项目里,因为位时序配置不当,导致总线在高温下频繁出现错误帧。后来排查发现,是Phase_Seg1设得太短,采样点落在了信号跳变沿上。所以,位时序的余量一定要留够,别卡着极限值算。

2.3 错误帧与总线仲裁

先说说错误帧。CAN的容错机制非常强大,它靠五种错误检测机制来保证数据可靠性:

  • 位错误:发送节点在发送位的同时监控总线,如果读到的和自己发的不一致,就报错。
  • 填充错误:连续5个相同电平后,必须插入一个相反电平。如果违反了这个规则,就是填充错误。
  • CRC错误:接收节点计算的CRC和发送的不一致。
  • 形式错误:固定格式的位段(比如EOF、CRC界定符)出现了错误电平。
  • 应答错误:发送节点没收到ACK应答。

一旦检测到错误,节点就会发送错误帧。错误帧由6个显性位(主动错误标志)加上8个隐性位(错误界定符)组成。这6个显性位会破坏当前帧,迫使所有节点重新开始。

再说总线仲裁。CAN总线是“线与”机制,显性位(0)会覆盖隐性位(1)。当多个节点同时发送时,谁先发送隐性位而别人发显性位,谁就退出竞争。说白了,就是ID最小的那个节点赢。

你想想看,这种仲裁方式非常优雅,不需要额外的总线仲裁器,完全靠硬件自动完成。我在做测试时,经常用CANoe的“总线统计”功能观察仲裁丢失的次数,来判断总线负载是否过高。

注意: 错误帧和仲裁丢失是两个概念。仲裁丢失是正常的,说明有更高优先级的消息在发送。而错误帧是异常,说明总线或节点出了问题。别搞混了。

2.4 CAN与CAN-FD区别

CAN-FD(CAN with Flexible Data-Rate)是CAN的升级版。它解决了传统CAN的两个痛点:数据场太小、速率太低。

主要区别我列个表,一目了然:

特性传统CANCAN-FD
数据长度最多8字节最多64字节
最大速率1 Mbps数据段可达8 Mbps(仲裁段仍为1 Mbps)
帧格式标准/扩展帧新增FDF、BRS位
CRC15位/17位17位/21位,更安全
兼容性CAN-FD节点可兼容CAN,反之不行

CAN-FD的帧结构里多了两个关键位:

  • FDF位:隐性表示是CAN-FD帧,显性表示是传统CAN帧。
  • BRS位:隐性表示切换到高速率模式,显性表示保持原速率。

我个人建议,如果你现在做新项目,直接上CAN-FD。虽然CAN-FD的测试比传统CAN复杂一些,但它的带宽优势太明显了。尤其是现在车载以太网还没完全普及,CAN-FD是过渡期的最佳选择。

不过要注意,CAN-FD的物理层和传统CAN是一样的,所以线缆、收发器基本可以复用。但协议层差别很大,CANoe里需要单独配置CAN-FD的通道和数据库。

经验之谈: 我在做CAN-FD一致性测试时,发现最容易出问题的地方是BRS位的切换时序。如果切换点没对准,数据段就会出错。所以,用CANoe的“采样点测量”功能,可以帮你精确验证切换点是否合规。

好了,CAN总线的基础就聊到这儿。这些内容虽然基础,但非常重要。你把这些搞透了,后面用CANoe做一致性测试,才能知道工具在测什么、为什么这么测。下一章,咱们开始动手,用CANoe搭一个最简单的CAN通信环境。