STM32-如何处理14个以上的过滤器?

STM32-如何处理14个以上的过滤器?,stm32,can-bus,Stm32,Can Bus,我目前正在使用STM32F103RD处理器,它在CAN1总线上有14个可用的过滤器 我正在连接J1939总线,我需要监控大约20个PGN。如何设置只有14个可用过滤器的20个PGN 这20个PGN不是连续的,因此我无法设置允许的特定范围。这20个可能到处都是。您有14个过滤器组,但每个过滤器组都可以使用标识符列表模式(FBMx=0)匹配两个不同的PGN。因此,您实际上可以与此部件匹配多达28个PGN!有关详细信息,请参见第655页的第24.7.4节 如果您需要匹配超过28个PGN,您有两个选项:

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

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


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

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

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

  • 拾取三个或更多PGN的集合,并将每个集合与单个遮罩模式滤波器组相匹配。为了减少匹配的不需要的消息的数量,您需要仔细挑选匹配的PGN集(即,将结果掩码中的“不在乎”位的数量保持在最小值)。不过,由于J1939的速度相对较慢,在软件中过滤掉一些不需要的消息应该不会是一个巨大的负担

  • 使用连接线STM32部件,如STM32F107VC。这些部件的CAN过滤器组数量增加了一倍


  • 我使用列表模式让它工作。棘手的部分是,PGN需要转换成32位的报头,这样它就可以匹配“can_RI0R”寄存器来触发中断。例如,我希望接收发动机转速,即PGN 61444(0xF004)。需要将其转换为以下标题:

    0xC7802004

    如何计算:

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

  • 与掩码模式相比,此方法的唯一警告是,据我所知,您只能从一个ECU接收消息,因为源地址包含在报头中,并且必须完全匹配。也就是说,您只能从发动机ECU(0x00)接收消息。例如,0x18F004XX,其中XX是源地址。使用掩码模式时,您可以忽略源地址位,并从任何ECU接收PGN。

    Perfect,我将使用列表标识符模式而不是掩码模式对其进行测试。谢谢