我需要以仅 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
对我来说是正确的值。请参阅参考手册中的滤波器组规模配置 - 寄存器组织图
这个方法我试过了,问题是只有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
对我来说是正确的值。请参阅参考手册中的滤波器组规模配置 - 寄存器组织图