我写了一些代码来发送/接收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);
它接受ID为0x1X的消息,其中X为0到3。由于它们与掩码无关,我不太了解ID的最后2位的用途,我的想法是否正确?无论如何,这不是主要问题。
现在已通读RM0090,我正在尝试构建一个过滤器,该过滤器将使用以下代码接受ID 0x120至0x1FA的消息:
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);
它无法按预期运行,它似乎只接受ID 0x120和0x00,我对列表模式的理解不正确还是我的过滤器实现?或两者?
编辑:
我对遮罩/列表模式的理解是错误的。我知道如何使用掩码,但我认为可以使用列表模式来创建一系列可接受的ID,但是看来您只能使用列表模式来捕获几个特定的ID。我发现this page很有帮助。
正如我在上面链接的页面所述,您只能以2 ^ N-(2 ^(N-1)-1)的形式获取范围。
我的问题现在变成Mask低/高和filterID低/高的意义是什么?最初,我认为它可能是32位寄存器的低16位/高16位,但是每个低/高变量已经是uint32了,所以这个主意对我来说没有意义。任何清晰度将不胜感激。
干杯!
答案 0 :(得分:1)
我想您正在混合滤镜和面膜: 过滤器掩码用于确定将接收到的帧的标识符中的哪些位与过滤器进行比较
如果屏蔽位设置为零,则无论过滤器位的值如何,都将自动接受相应的ID位。
如果屏蔽位设置为1,则将相应的ID位与过滤器位的值进行比较;如果它们匹配,则接受该帧,否则该帧将被拒绝。