【问题标题】:STM32 - How do I handle more than 14 filters?STM32 - 如何处理超过 14 个过滤器?
【发布时间】:2015-12-23 21:03:23
【问题描述】:

我目前使用的是 STM32F103RD 处理器,它在 CAN1 总线上有 14 个可用的滤波器。

我正在连接 J1939 总线,我需要监控大约 20 个 PGN。我如何处理设置只有 14 个过滤器的 20 个 PGN?

这 20 个 PGN 不是连续的,因此我无法设置允许的特定范围。这 20 个可能到处都是。

【问题讨论】:

    标签: stm32 can-bus


    【解决方案1】:

    您有 14 个过滤器组,但每个组都可以使用标识符列表模式 (FBMx=0) 匹配两个不同的 PGN。所以你实际上可以用这部分匹配多达 28 个 PGN!有关详细信息,请参阅STM32F10x reference manual(第 655 页)的第 24.7.4 节。

    如果您需要匹配超过 28 个 PGN,您有两种选择:

    1. 选择三个或更多 PGN 的集合,并将这些集合中的每一个与单个掩码模式滤波器组匹配。为了减少匹配的不需要的消息的数量,您需要仔细选择匹配的 PGN 集(即,将生成的掩码中的“不关心”位的数量保持在最低限度)。不过,由于 J1939相对很慢,因此在软件中过滤掉一些不需要的消息应该不会是一个巨大的负担。

    2. 使用连接线 STM32 部件,例如 STM32F107VC。这些部件具有双倍数量的 CAN 滤波器组。

    【讨论】:

    • 完美,我将使用列表标识符模式而不是掩码模式对其进行测试。谢谢!
    【解决方案2】:

    我使用列表模式让它工作。棘手的部分是 PGN 需要移动到 32 位标头中,以便它可以匹配“CAN_RI0R”寄存器来触发中断。例如,我想接收 PGN 61444 (0xF004) 的引擎 RPM。这需要转换成如下的header:

    0xC7802004

    如何计算:

    1. 从 PGN 61444 (0xF004) 开始
    2. 将其左移 8 位,使其位于正确的 J1939 帧格式位置。
    3. 或它与 0x0018000000
    4. 将其左移 3 位,使其与 STID/EXID 的 STM32 寄存器位置匹配。
    5. 或它与 0x4 以设置“扩展”位,指示它是扩展标头。

    与掩码模式相比,此方法的唯一警告是,据我所知,您只能接收来自单个 ECU 的消息,因为源地址包含在标头中,并且必须完全匹配。这意味着,您只能接收来自引擎 ECU (0x00) 的消息。例如,0x18F004XX,其中 XX 是源地址。使用掩码模式时,您可以忽略源地址位,并从任何 ECU 接收 PGN。

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2021-04-04
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多