我正在使用STM8AF5286UDY,正在尝试设置CAN接口。对于编程,我使用标准的外围设备库。目前,我的CAN接口工作正常。唯一不起作用的是过滤。
我使用扩展ID,并希望获取从0x18FEC100到0x18FEC999的所有ID。我的代码如下:
/* CAN filter init */
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1=0x18FEC101;
CAN_FilterID2=0;
CAN_FilterID3=0;
CAN_FilterID4=0;
CAN_FilterIDMask1=0x1FFFF000;
CAN_FilterIDMask2=0;
CAN_FilterIDMask3=0;
CAN_FilterIDMask4=0;
CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,
CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,
CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,
CAN_FilterIDMask3, CAN_FilterIDMask4);
我将不胜感激!谢谢!
EDIT:在我的初始代码中,我忘了在寻址时包括IDE和RTR。同样,在库中,每个地址和掩码都是8位值。因此,我将代码更改为以下内容:
/* CAN filter init */
CAN_FilterNumber = CAN_FilterNumber_2;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1=0xc7;
CAN_FilterID2=0xed;
CAN_FilterID3=0x02;
CAN_FilterID4=0x02;
CAN_FilterIDMask1=0xFF;
CAN_FilterIDMask2=0xE7;
CAN_FilterIDMask3=0xE0;
CAN_FilterIDMask4=0x00;
CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,
CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,
CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,
CAN_FilterIDMask3, CAN_FilterIDMask4);
此过滤器适用于前16位,因此在使用0x18FEC101时,它将过滤0x18FE。不知何故,它不适用于其他16位。
在库中,以下代码用于以32位将地址和掩码写入过滤器组:
else if (CAN_FilterScale == CAN_FilterScale_32Bit)
{
CAN->Page.Filter.FR01 = CAN_FilterID1;
CAN->Page.Filter.FR02 = CAN_FilterID2;
CAN->Page.Filter.FR03 = CAN_FilterID3;
CAN->Page.Filter.FR04 = CAN_FilterID4;
CAN->Page.Filter.FR05 = CAN_FilterIDMask1;
CAN->Page.Filter.FR06 = CAN_FilterIDMask2;
CAN->Page.Filter.FR07 = CAN_FilterIDMask3;
CAN->Page.Filter.FR08 = CAN_FilterIDMask4;
}
有什么想法,我的错误可能是什么?谢谢!
掩码过滤按位工作。因此,您无法创建过滤器以接受0x18FEC100-0x18FEC999之间的值。您需要考虑二进制。
在过滤器掩码寄存器中,1表示“必须匹配”,0表示“无关”。
ID = 0x18FEC101和Mask = 0x1FFFF000意味着它将接受0x18FEC000-0x18FECFFF之间的值,因为过滤器将忽略最低有效12位。
然而,硬件寄存器的位安排使处理过程更加复杂。请注意,RTR和IDE位也包含在过滤器寄存器中。我不知道标准的外围设备库是否可以处理此问题,但可能不会。您可能需要手动排列这些位,以确定正确的寄存器值。在参考手册(RM0016)中,请参考图148。