4、CAN总线远程帧与错误帧:远程帧结构、错误帧类型、错误帧产生机制、过载帧
大家好,我是老张。这一章咱们聊聊CAN总线里几个“不太常见但关键时刻要命”的帧类型——远程帧、错误帧和过载帧。说实话,很多工程师干了好几年,对数据帧和遥控帧门儿清,但一碰到错误帧就发懵。我当年刚入行时也吃过这个亏,有一次在台架上调试,总线莫名其妙挂掉,查了半天才发现是错误帧风暴。嗯,今天咱们就把这几个家伙彻底搞明白。
4.1 远程帧:请求数据的“问路石”
远程帧,说白了就是“我要数据,你给我发”。它跟数据帧长得几乎一模一样,唯一的区别就是RTR位(远程传输请求位)。数据帧的RTR位是显性(0),远程帧的RTR位是隐性(1)。
远程帧的结构:
- 帧起始(SOF):1位显性
- 仲裁场:11位ID + RTR位(隐性)
- 控制场:IDE位 + r0 + DLC(数据长度码,但实际不发送数据)
- CRC场:15位CRC + 1位CRC界定符
- 应答场:2位(ACK Slot + ACK界定符)
- 帧结束:7位隐性
关键点:远程帧没有数据场!DLC虽然存在,但它只表示请求的数据长度,并不携带实际数据字节。这一点很多新手会搞混。
我在项目中遇到过这样一个场景:一个传感器节点每隔100ms主动发送温度数据,但主控有时需要“立刻”获取当前值。这时候主控就发一个远程帧,ID跟传感器数据帧的ID一致,传感器收到后立即回复一帧数据。你想想看,这比轮询效率高多了。
个人经验:远程帧的ID必须与目标数据帧的ID完全一致,否则节点不会响应。我建议在设计协议时,把远程帧的用途明确写在通信矩阵里,避免后期混乱。
4.2 错误帧:总线的“自我修复机制”
错误帧是CAN总线最牛的特性之一。它不需要程序员写任何代码,硬件自动检测、自动发送。说白了,就是总线自己发现“出问题了”,然后立刻通知所有人“刚才那帧数据别用了,重来”。
错误帧的结构:
- 错误标志:6个连续显性位(主动错误)或6个连续隐性位(被动错误)
- 错误界定符:8个连续隐性位
为什么会这样设计?因为6个显性位会破坏CAN总线的“位填充”规则。正常数据帧里,连续5个相同电平后必须插入一个相反电平。而错误帧的6个显性位,所有节点都能检测到这个“违规”,从而触发错误处理。
4.3 错误帧的三种类型
根据错误严重程度,CAN节点有三种状态:
| 错误状态 | 发送错误计数 | 接收错误计数 | 行为特征 |
|---|---|---|---|
| 主动错误 | 0-127 | 0-127 | 发送主动错误标志(6个显性位) |
| 被动错误 | 128-255 | 128-255 | 发送被动错误标志(6个隐性位) |
| 总线关闭 | 大于255 | — | 完全脱离总线,不参与任何通信 |
我记得有一次在实车上,某个ECU因为电源纹波过大,频繁发送错误帧,最后把自己搞成了“总线关闭”状态。整个动力CAN网络直接瘫痪。嗯,从那以后我特别重视节点的错误计数监控。
4.4 错误帧的产生机制
CAN总线定义了5种错误类型,任何一类都会触发错误帧:
- 位错误:发送节点在发送位时,监控到的总线电平与自己发送的不一致。比如你发显性,但总线上是隐性,说明有冲突或故障。
- 填充错误:连续6个相同电平出现,违反了位填充规则。这是最容易被触发的错误。
- CRC错误:接收节点计算的CRC与发送节点的不一致。说明数据在传输过程中被干扰了。
- 形式错误:固定格式的位(如界定符、EOF)出现了错误电平。比如ACK界定符必须是隐性,结果变成了显性。
- 应答错误:发送节点在ACK Slot期间没有收到显性应答。说明总线上没有其他节点在监听。
避坑指南:我曾经遇到过一个奇葩问题——某个节点在发送数据帧时,总线上偶尔出现错误帧。查了三天,最后发现是CAN收发器的共模电压出了问题。所以,当错误帧频繁出现时,别只盯着软件,硬件也要查。
4.5 过载帧:总线的“流量控制”
过载帧,你可以把它理解成“我太忙了,慢点发”。它跟错误帧长得有点像,但触发条件完全不同。过载帧不是错误,而是节点主动要求延迟下一帧数据。
过载帧的结构:
- 过载标志:6个连续显性位
- 过载界定符:8个连续隐性位
触发条件:
- 节点内部接收缓冲区已满,无法处理新数据
- 节点在帧间隔期间检测到显性位(非法情况)
说实话,过载帧在实际项目中用得不多。因为现代CAN控制器都有足够的硬件FIFO,很少会出现缓冲区溢出的情况。但如果你在做低端MCU或者高负载网络,还是要留个心眼。
我的建议:在设计CAN网络时,尽量保证每个节点的接收缓冲区能容纳至少2-3帧数据。我曾经见过一个项目,因为接收中断处理太慢,导致过载帧频繁触发,整个网络吞吐量下降了一半。后来把缓冲区从1帧改成4帧,问题就解决了。
4.6 三种帧的对比总结
| 帧类型 | 触发方式 | 数据场 | 用途 | 常见场景 |
|---|---|---|---|---|
| 远程帧 | 主动发送 | 无 | 请求数据 | 主控查询传感器当前值 |
| 错误帧 | 硬件自动触发 | 无 | 通知总线错误 | 总线干扰、节点故障 |
| 过载帧 | 节点主动触发 | 无 | 请求延迟发送 | 接收缓冲区满 |
最后说一句,远程帧和错误帧是CAN总线协议的精髓所在。远程帧实现了“按需索取”,错误帧实现了“自愈能力”。你想想看,一个没有中央控制器的总线网络,能靠硬件自动检测、自动恢复错误,这设计得多巧妙。
下一章咱们聊聊CAN总线的位定时与同步,这可是调通CAN通信的关键。到时候我会分享一些我在台架上用示波器抓波形调同步段的实战经验,敬请期待。