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