4、CAN报文类型:数据帧、远程帧、错误帧、过载帧、帧间隔

好,咱们今天来聊聊CAN总线上的报文类型。说实话,搞懂这五种报文,你基本就能看懂CAN总线上在“聊什么”了。我在调试胎压监测系统时,经常需要抓包分析,说白了,大部分时间看的都是数据帧和远程帧。但另外三种——错误帧、过载帧、帧间隔,它们虽然不传数据,却是总线能稳定工作的“交通规则”。

4.1 数据帧:最常用的“快递包裹”

数据帧,顾名思义,就是用来装数据的。胎压传感器采集到的压力值、温度值,都是通过数据帧发出去的。

数据帧的结构,我习惯把它拆成七段来看:

  • 帧起始(SOF):一个显性位,告诉总线“我要开始发数据了”。
  • 仲裁场:包含11位(标准帧)或29位(扩展帧)的ID,以及RTR位。RTR位是区分数据帧和远程帧的关键——数据帧的RTR位是显性(0)。
  • 控制场:包含IDE位、保留位和DLC(数据长度码)。DLC告诉你这个包里装了几个字节,范围是0到8。
  • 数据场:0~8个字节,这就是真正的“货”。胎压数据就塞在这里。
  • CRC场:15位CRC校验码+1位CRC界定符。用来检查数据有没有传错。
  • ACK场:2位。发送节点发完数据后,会释放总线。如果接收节点正确收到了,就会在ACK槽位拉一个显性位作为回应。
  • 帧结束(EOF):7个隐性位,表示帧结束了。

重点:标准帧ID是11位,扩展帧ID是29位。在胎压监测系统里,大部分ECU都支持标准帧,因为节点不多,11位ID够用了。但如果你在做多品牌兼容的TPMS,可能会遇到扩展帧。

4.2 远程帧:主动“要数据”的请求

远程帧的结构跟数据帧几乎一样,唯一的区别在于RTR位——远程帧的RTR位是隐性(1)。

远程帧没有数据场。它就是一个“请求信号”。比如,仪表盘想知道左前轮胎压,就可以发一个远程帧,ID对应左前轮传感器。传感器收到后,再回复一个数据帧。

我在项目中遇到过一个问题:某个传感器一直不回复数据。抓包一看,原来是仪表盘发的远程帧ID写错了,差了一个bit。嗯,这种问题用CAN分析仪一抓就现原形。

我的习惯:在TPMS项目中,我一般不用远程帧。因为胎压传感器是周期性主动上报的,没必要让ECU去“催”。远程帧更多用在诊断或者配置场景里。

4.3 错误帧:总线上的“警报器”

错误帧是节点发现自己或别人出错时,主动发出的“抗议”。它由两部分组成:

  • 错误标志:6个连续的显性位(主动错误)或6个连续的隐性位(被动错误)。
  • 错误界定符:8个隐性位。

为什么会触发错误帧?常见原因有:

  • 位错误:节点发送的位和总线上监测到的位不一致。
  • 填充错误:连续出现了6个相同电平的位(CAN协议规定每5个相同位后必须插入一个相反位)。
  • CRC错误:接收节点算出来的CRC和发送的不一致。
  • 形式错误:帧格式不对,比如EOF不是7个隐性位。
  • ACK错误:发送节点没收到ACK回应。

避坑指南:我曾经调试一个TPMS样机,发现总线上一堆错误帧。查了半天,原来是某个传感器节点的晶振偏差太大,导致位时序不对。你想想看,如果总线上的节点时钟不同步,那通信肯定乱套。所以,选CAN收发器的时候,一定要看晶振精度。

4.4 过载帧:说“我忙,等会儿”

过载帧的结构跟错误帧很像,也是6个显性位+8个隐性位。但它的触发条件不同:

  • 接收节点还没处理完上一帧数据,新的帧又来了。
  • 总线负载太高,节点需要“喘口气”。

说实话,在胎压监测系统里,过载帧很少见。因为TPMS的数据量很小,每个传感器每秒也就发几个帧。但如果你在做多路CAN网关,或者总线负载超过80%时,过载帧就可能频繁出现。

4.5 帧间隔:总线上的“红绿灯”

帧间隔不是一帧数据,而是帧与帧之间的空闲时间。它由三部分组成:

  • 间歇场:3个隐性位。
  • 总线空闲:任意长度的隐性位,直到有节点开始发送。
  • 暂停发送场:仅被动错误节点需要,8个隐性位。

帧间隔的作用很简单:给总线一点“喘息时间”。如果没有帧间隔,节点可能来不及判断总线状态,导致仲裁出错。

关键点:帧间隔是协议强制要求的。哪怕总线空闲,也必须等3个隐性位才能发下一帧。我在做CAN一致性测试时,就遇到过某个节点不遵守帧间隔,结果被测试仪判定为“协议违规”。

4.6 五种报文类型对比

报文类型 主要用途 数据场 触发方式
数据帧 传输数据 0~8字节 节点主动发送
远程帧 请求数据 节点主动发送
错误帧 报告总线错误 检测到错误时自动触发
过载帧 请求延迟发送 接收节点忙时触发
帧间隔 帧间隔离 每帧结束后自动插入

4.7 实战建议:如何用CAN分析仪抓包

我建议你手头备一个CAN分析仪(比如PCAN或ZLG的)。抓包时,重点关注以下几点:

  • 看ID:确认数据帧和远程帧的ID是否正确。
  • 看DLC:数据长度对不对。胎压数据一般是4个字节(压力+温度+状态+校验)。
  • 看错误帧:如果错误帧频繁出现,先检查总线终端电阻(120Ω),再检查节点时钟。
  • 看总线负载:一般建议不超过60%。超过80%就容易出过载帧。

一个小技巧:抓包时,把时间戳打开。这样你能看到每帧之间的间隔。如果帧间隔小于3个位时间,那肯定有问题。

好了,这五种报文类型就讲完了。说白了,数据帧和远程帧是“干活”的,错误帧和过载帧是“报错”的,帧间隔是“休息”的。搞懂它们,你就能读懂CAN总线上的一切对话。下一章,咱们聊聊CAN的位时序和同步——这可是调通CAN通信的关键。