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

时间:2015-12-23 21:03:24

标签: stm32 can-bus

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

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

这20个PGN不是顺序的,所以我无法设置允许的特定范围。这20个可能到处都是。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

0xC7802004

如何计算:

  1. 从PGN 61444(0xF004)开始
  2. 将其向左移8位,使其处于正确的J1939帧格式位置。
  3. 或者它与0x0018000000
  4. 将其向左移3位,使其与STID / EXID的STM32寄存器位置匹配。
  5. 或者与0x4一起设置“扩展”位,表示它是扩展标题。
  6. 这种方法与掩模模式的唯一警告是,据我所知,您只能从一个ECU接收消息,因为源地址包含在标题中,并且必须完全匹配。这意味着,您只能从发动机ECU(0x00)接收消息。例如,0x18F004XX,其中XX是源地址。使用屏蔽模式时,可以忽略源地址位,并从任何ECU接收PGN。