我目前正在使用STM32F103RD处理器,该处理器在CAN1总线上有14个可用的滤波器。
我正在连接J1939总线,我需要监控大约20个PGN。如何只使用14个过滤器来设置20个PGN?
这20个PGN不是顺序的,所以我无法设置允许的特定范围。这20个可能到处都是。
答案 0 :(得分:1)
您有14个滤波器组,但每个组都可以使用标识符列表模式(FBMx = 0)匹配两个不同的PGN。所以你实际上可以匹配这个部分最多28个PGN!有关详细信息,请参阅STM32F10x reference manual(第655页)的第24.7.4节。
如果您需要匹配超过28个PGN,您有两个选择:
选择三个或更多PGN的集合,并使用单个掩码模式滤波器组匹配每个集合。为了减少匹配的不需要的消息的数量,您需要仔细选择匹配的PGN集(即,将结果掩码中“不关心”位的数量保持最小)。但是,由于J1939 相对慢,因此在软件中过滤掉一些不需要的消息不应该是一个巨大的负担。
使用连接线STM32部件,例如STM32F107VC。这些部件的CAN滤波器组数量增加了一倍。
答案 1 :(得分:0)
我使用列表模式工作了。棘手的部分是PGN需要转移到32位头中,以便它可以匹配“CAN_RI0R”寄存器来触发中断。例如,我想要接收引擎RPM,即PGN 61444(0xF004)。这需要转换为以下标题:
0xC7802004
如何计算:
这种方法与掩模模式的唯一警告是,据我所知,您只能从一个ECU接收消息,因为源地址包含在标题中,并且必须完全匹配。这意味着,您只能从发动机ECU(0x00)接收消息。例如,0x18F004XX,其中XX是源地址。使用屏蔽模式时,可以忽略源地址位,并从任何ECU接收PGN。