我需要以仅 ID 0x80 和 0x200 和 0x300 之间的 ID 通过所有其他不允许通过的方式配置 CAN 过滤器

I need to configure CAN filters in such a way that only ID 0x80 and IDs between 0x200 and 0x300 passes all others are not allowed to be passed

这个方法我试过了,问题是只有200-300可以通过,80h没有通过。如果我使用 if-else,则只传递 80h 而不是 200-300h。所以,问题是我可以通过 80h 或 200h-300h。不是 80 小时和 200-300 小时。

#define Filter_ID1  0x80

#define Filter_ID2  0x200


#if Filter_ID1

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

sFilterConfig.FilterBank = 0;

sFilterConfig.FilterIdHigh=0x80<<5;

sFilterConfig.FilterMaskIdHigh=0xff<<5;

sFilterConfig.FilterIdLow = 0x0000;

sFilterConfig.FilterMaskIdLow = 0x0000;

sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

sFilterConfig.FilterActivation = ENABLE;

#endif


#if Filter_ID2

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

sFilterConfig.FilterBank = 1;

sFilterConfig.FilterIdHigh=0x200<<5;

sFilterConfig.FilterMaskIdHigh=0x300<<5;

sFilterConfig.FilterIdLow = 0x0000;

sFilterConfig.FilterMaskIdLow = 0x0000;

sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

sFilterConfig.FilterActivation = ENABLE;

#endif

您需要配置两个滤波器组:

对于[0x200, 0x300)范围(0x300除外),需要Identifier Mask模式。在这种情况下:

  • 掩码 (FxR2) = 0x300(检查位 8 和 9,忽略其他位)
  • ID (FxR1) = 0x200(第 8 位和第 9 位需要为 0b10)

对于0x80,你需要标识符列表模式。对于 32 位列表,过滤器组包含 2 个项目。为了只接受0x80,你需要用相同的值填充它们(0x80两次)

  • ID (FxR1) = 0x80
  • ID (FxR2) = 0x80

可以同时激活多个滤波器组。

FiRx是参考手册使用的命名约定,其中i = 0..27(滤波器组编号)和x = 1,2(注册号)。不知道你用的库是怎么调用的

当然,我提到的值只是逻辑值。您需要 shift/modify 它们以适合您的硬件寄存器。我不确定左移 5 是否正确。看来 << 3 对我来说是正确的值。请参阅参考手册中的滤波器组规模配置 - 寄存器组织