系列文章目录
—第一章 逆变器与BMS的CAN通讯冲突问题
文章目录
系列文章目录
前言
一、CAN通讯怎么处理接收冲突的—CAN总线的仲裁
**1. CAN总线仲裁机制**
**1.1 非破坏性逐位仲裁**
**1.2 仲裁域结构**
**1.3 STM32的实现特点**
**2. 如何避免帧冲突**
**2.1 基于优先级的仲裁**
**2.2 合理规划ID分配**
**2.3 STM32配置优化**
**2.4 位时序配置**
3、实际现象和实验
**3. 总结**
前言
在调试逆变器和BMS通讯的过程中发生接收错误,总线繁忙
一、CAN通讯怎么处理接收冲突的—CAN总线的仲裁
1. CAN总线仲裁机制
1.1 非破坏性逐位仲裁
原理:多个节点同时发送数据时,通过对比帧的**标识符(ID)**优先级决定总线使用权。
ID数值越小,优先级越高(例如,ID 0x100 优先级高于 0x200)。
显性位(逻辑0) 优先级高于隐性位(逻辑1)。节点在发送ID时逐位对比总线电平:
若节点发送隐性位但检测到显性位,立即退出发送,转为接收模式。
优先级最高的节点赢得仲裁,继续发送数据,其他节点自动延迟重试。
1.2 仲裁域结构
标准帧(11位ID):ID范围 0x000~0x7FF。
扩展帧(29位ID):包含11位基本ID + 18位扩展ID,范围 0x00000000~0x1FFFFFFF。
RTR(远程传输请求)位:数据帧优先级高于远程帧(显性位优先)。
1.3 STM32的实现特点
发送邮箱(TX Mailbox):STM32的CAN控制器提供多个发送邮箱(通常3个),每个邮箱可配置不同ID的待发送帧。
硬件自动仲裁:控制器根据邮箱中帧的ID优先级,自动选择最高优先级的帧先发送。
发送优先级配置:支持按邮箱顺序(邮箱0优先级最高)或ID优先级排序。
2. 如何避免帧冲突
2.1 基于优先级的仲裁
天然避免冲突:CAN协议通过硬件仲裁机制确保仅有一个节点占据总线,无需软件干预。
失败节点自动重试:仲裁失败的节点会在总线空闲时自动重发,无需额外冲突检测。
2.2 合理规划ID分配
关键数据分配高优先级:例如,安全相关的消息使用更小的ID值。
扩展帧与标准帧的协调:标准帧的11位ID默认优先级高于扩展帧的相同基本ID(因扩展帧的IDE位为隐性)。
2.3 STM32配置优化
邮箱管理:为高优先级数据分配专用发送邮箱,确保及时发送。
过滤器配置:通过硬件过滤器屏蔽无关ID,减少总线负载。
错误处理机制:
自动重传:默认启用,确保仲裁失败的帧自动重发。
错误计数器:节点错误超限后进入“总线关闭”状态,避免持续干扰总线。
2.4 位时序配置
同步与采样点:确保所有节点波特率和采样点一致,避免因时序错误导致通信失败。
使用STM32CubeMX工具配置CAN时钟和位时序寄存器(CAN_BTR)。
3、实际现象和实验

冲突时返回总线繁忙。

冲突时的波形图
3. 总结
仲裁机制:STM32通过硬件实现CAN协议的逐位仲裁,优先级高的帧自动胜出。
冲突避免:依赖ID优先级规划和硬件自动重试,无需显式冲突检测。
最佳实践:
- 为关键数据分配高优先级ID。
- 合理利用发送邮箱和硬件过滤器。
- 确保所有节点的位时序配置一致。
作者:指针刺客