跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Blogs
  3. FlexCAN-收发报文ID超出物理邮箱数量时邮箱分配参考方案

FlexCAN-收发报文ID超出物理邮箱数量时邮箱分配参考方案

已定时 已固定 已锁定 已移动 Blogs
2 帖子 1 发布者 17 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • swustS 离线
    swustS 离线
    swust YunTu
    编写于 最后由 编辑
    #1

    1. 前言

    在汽车电子领域,CAN总线通信是核心的数据交互方式。随着系统复杂度的提升,ECU节点往往需要同时接收和处理大量不同ID的报文。然而,受限于芯片成本和硬件设计,微控制器通常只提供有限数量的CAN接收邮箱(通常为32个或64个)。
    当系统需要接收的报文ID数量远超硬件邮箱数量时,就会出现“邮箱不够用”的场景。如果处理不当,极易导致接收邮箱溢出、报文丢失,进而引发系统故障。针对这一痛点,本文基于云途YTM32B1LE05芯片,针对不同的报文特征和CAN控制器工作模式,提出了三种针对性的解决方案,并完成了Demo开发与验证,旨在为开发者提供一个设计参考。
    

    2. YTM32B1LE05 CAN控制器基本介绍

    YTM32B1LE05具备以下主要特性:
    - 最多32个邮箱。
    - 支持经典CAN与CAN FD模式:CAN FD模式下支持最高8字节到64字节的数据场,可变波特率使数据传输更高效。
    - 硬件掩码过滤:每个接收邮箱支持独立的ID和掩码配置,可实现硬件级别的报文过滤。
    - 中断及FIFO机制:支持接收中断及硬件Legacy FIFO(深度6)。
    

    3. 三种场景及原理介绍

    根据报文ID的分布特征(集中或分散)以及CAN工作模式(经典模式或FD模式),邮箱不够用的场景可归纳为以下三种,其解决原理分别如下:
    

    3.1 场景1:经典模式/FD模式,报文数量多,ID基本都在某个区间

    - 原理:邮箱掩码过滤法
    - 分析:当多个报文ID集中在某个区间(如连续的ID段,或高几位相同、低几位变化的ID群),可以利用CAN硬件的Mask(掩码)机制。Mask寄存器中置0的位表示“不关心”,置1的位表示“必须匹配”。通过配置一个邮箱的Mask,使其只校验ID的公共高位,忽略低位变化,从而实现“一个邮箱接收一组ID”的效果,极大释放了邮箱资源。
    

    3.2 场景2:经典模式,报文数量多,ID比较分散

    - 原理:硬件FIFO法
    - 分析:在经典模式下,ID毫无规律且跨度极大,Mask方式无法有效合并。此时应将多个连续的硬件邮箱硬件邮箱区域配置为接收FIFO模式。在FIFO模式下,匹配ID的报文基本不会因为缓冲区填满而被覆盖,这种方式增加了接收缓冲深度,给予CPU更充裕的响应时间来统一读取和软件分发。
    

    3.3 场景3:FD模式,报文数量多,ID比较分散

    - 原理:软件轮询法
    - 分析:在CAN FD模式下,由于报文数据场长度最大可达64字节,报文长度差异极大。由于MCU对硬件Legacy FIFO和FD的支持存在冲突)。因此,这里用单个邮箱对多个报文进行周期性轮询配置和接收,一旦检测到接收缓冲区有数据就转移数据并清空缓冲区,等待下一次接收,无数据则跳过。此方式牺牲了一定的实时性,但换来了FD模式下的兼容性。
    

    4. 实现方式

    4.1 场景1实现:邮箱Mask方式

    • 实现步骤:
      1. 设置掩码类型为独立掩码。
      2. 设置一个目标区间的基准ID(如0x100)。
      3. 配置Mask寄存器,将需要忽略的低位设为0,必须匹配的高位设为1(如Mask = 0x7F8,表示低3位不关心,可接收0x100~0x107)。
      4. 配置接收邮箱。
        39f40923-312e-4e94-aea9-18a820c980ba-image.png
    • 测试结果:
      • 向总线发送0x100~0x10F的报文,芯片均能正常触发接收中断。
      • 区间之外的ID则无法接收。

    4.2 场景2实现:FIFO方式

    • 实现步骤:
      1. 将硬件邮箱Mailbox_0至Mailbox_17配置为接收FIFO。
      2. 配置FIFO的过滤方式为FORMAT A(所有ID位都过滤)。
      3. 配置滤波表
        006422da-75d9-404d-ab4d-779efe7de07c-image.png
        4acfa582-7eaf-4235-ae4c-c0ef8a2b9285-image.png
        Legacy FIFO模式下,因为NumberofLegacyRxFIFOFilters(RFFN)最大为15,因此滤波表参数最多为(15 + 1)* 8 = 128个。

    4.3 场景3实现:邮箱轮询方式

    • 实现步骤:
      1. 先将邮箱配置为独立接收模式,单独配置固定报文ID。
      2. 在主程序中,同一类型的的报文(比如都是标准帧)可通过同一邮箱遍历所有TX ID和TX data的方式进行发送。
      3. 在主程序中周期性的切换配置接收邮箱,切换周期越短,丢帧率越低。
      4. 为防止总线拥堵时轮询周期不够导致溢出,可增加溢出标志位监控及错误恢复逻辑。
    • 测试结果:
      • 在CAN FD模式下(仲裁段500kbps,数据段2Mbps),发送ID分散的报文。
      • 轮询周期设为100ms,数据均可正常接收。
      • 在负荷率比较高的情况下,可能会出现单个邮箱溢出覆盖,但通过软件逻辑检测溢出标志位并丢弃旧帧,也可保证基本功能。
      • 结论:轮询方式扩大了总线接收报文的数量,虽然实时性略有下降(取决于轮询周期),但在FD分散ID场景下也能实现了较为稳定可靠的数据接收。

    5. 总结

    YTM32B1Mx系列均有多路CAN控制器,且MD1/ME0/HA0均支持EnhanceFIFO,基本不会出现邮箱不够用的情况,一般L系列由于邮箱数量较少且只有一个CAN控制器,当开发者使用到FD模式时经常会邮箱不够用,在实际项目中,开发者可根据报文字阵的定义和总线负载情况,灵活选择或组合上述方案,以实现YTM32B1LE05 CAN通信资源的最优配置。

    1 条回复 最后回复
    0
    • swustS 离线
      swustS 离线
      swust YunTu
      编写于 最后由 编辑
      #2

      LE0_Flexcan_Legacyfifo.zip
      LE0_Flexcan_FD.zip
      LE0_Flexcan_MBs_Over_Limit.zip

      1 条回复 最后回复
      0

    • 云途开发生态介绍

      快速上手云途开发生态

    • 云途论坛规则/Yuntu Forum Rules

      发帖前请查看

    • YT CONFIG TOOL调查问卷

      帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

    • can
      27
      demo
      23
      lin stack
      13
      uds
      13
      md14
      6
      yt-link
      6
      fbl
      5
      adc模块
      4
      Online Users
      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门