Arm 如何在列表模式下配置我的CAN筛选器?

Arm 如何在列表模式下配置我的CAN筛选器?,arm,embedded,stm32,can-bus,stm32f4,Arm,Embedded,Stm32,Can Bus,Stm32f4,我已经编写了一些代码来发送/接收CAN消息,我的过滤器出现了一些问题。首先,我要说的是,我了解掩码模式,并已设法使其与以下配置一起工作: uint16_t id = 0x12; // 0001 0010 uint16_t mask = 0xFC; // 1111 1100 sFilterConfig.FilterBank=0; sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale=CAN_FILTER

我已经编写了一些代码来发送/接收CAN消息,我的过滤器出现了一些问题。首先,我要说的是,我了解掩码模式,并已设法使其与以下配置一起工作:

uint16_t id = 0x12; // 0001 0010
uint16_t mask = 0xFC; // 1111 1100

sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh=id<<5;
sFilterConfig.FilterIdLow=0;
sFilterConfig.FilterMaskIdHigh=mask<<5;
sFilterConfig.FilterMaskIdLow=0;
sFilterConfig.FilterFIFOAssignment=0;
sFilterConfig.FilterActivation=ENABLE;

HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
uint16\u t id=0x12;//0001 0010
uint16_t mask=0xFC;//1111 1100
sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN\u FilterMode\u IDMASK;
sFilterConfig.FilterScale=CAN\U FilterScale\U 32位;

sFilterConfig.FilterIdHigh=id我猜您是在混合使用过滤器和掩码: 滤波器掩码用于确定将接收帧的标识符中的哪些位与滤波器进行比较

如果掩码位设置为零,则无论过滤器位的值如何,都将自动接受相应的ID位


如果将掩码位设置为1,则将相应的ID位与滤波器位的值进行比较;如果匹配,则接受该帧,否则拒绝该帧。

这不是掩码模式吗?那么列表模式和掩码模式有何不同呢?RM0090说:“在标识符列表模式下,掩码寄存器用作标识符寄存器。因此,不定义标识符和掩码,而是指定两个标识符,使单个标识符的数量增加一倍。传入标识符的所有位必须与过滤器寄存器中指定的位匹配。”我还没有真正理解这意味着什么,也找不到更好的文档。我不熟悉RM0090,但我想你需要一个所有输入ID的完整列表。不是IDx到IDy的范围。我不能代表这个特定的can控制器,但一般来说,您有一个标识符接受筛选器,它是传入标识符必须匹配的位序列,还有一个标识符掩码,它告诉您筛选器中应用的位。然后,各种控制器都有各种或多或少复杂的方法来组合接受寄存器和屏蔽寄存器。大多数情况下,使用这些寄存器产生的问题比它们解决的问题多得多。一个更好的解决方案是找到一个具有“邮箱”功能的CAN控制器,这在当今非常常见。
uint16_t id = 0x120; // 0001 0010 0000
uint16_t mask = 0x1FA; // 0001 1111 1010

sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN_FILTERMODE_IDLIST;
sFilterConfig.FilterScale=CAN_FILTERSCALE_16BIT;
sFilterConfig.FilterIdHigh=mask<<5;
sFilterConfig.FilterIdLow=id<<5;
sFilterConfig.FilterMaskIdHigh=0;//mask<<5;
sFilterConfig.FilterMaskIdLow=0;
sFilterConfig.FilterFIFOAssignment=0;
sFilterConfig.FilterActivation=ENABLE;

HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);