嵌入式STM32调试笔记详解

系列文章目录

—第一章 逆变器与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优先级规划和硬件自动重试,无需显式冲突检测。
  • 最佳实践
    1. 为关键数据分配高优先级ID。
    2. 合理利用发送邮箱和硬件过滤器。
    3. 确保所有节点的位时序配置一致。
  • 作者:指针刺客

    物联沃分享整理
    物联沃-IOTWORD物联网 » 嵌入式STM32调试笔记详解

    发表回复