STM32 CAN滤波器配置注意事项

1.最重要的一点,先看下图:

图中显示滤波器可以配置为32位和16位两种模式,当处于32位模式时高11位是标准标识符、中间18位是扩展标识符、低三位为其它;而在16位模式时,高11位才是标准标识符;因此,在配置标准/扩展标识符时要注意左移;如在16位标识符列表模式时,要配置滤波器允许接收标准标识符为0x1234的帧:CAN_FilterInitStructure.CAN_FilterIdHigh=0x1234<<5,左移5位是因为高11位才是标准标识符。

2.标准标识符只有11位,因此最大为:0x7ff,主要是最高位最大为1+2+4=7,超过7将无效。

3.在配置为标识符掩码模式时,若配置了多组标识符掩码,则只要接收到的标识符符合其中任意一组掩码的都会通过滤波器,所以千万不要有其中一组是通配的(即掩码为0x0000),否则你设置的其它掩码组都会无效,这个问题在配置为16位标识符掩码模式时很容易犯,因为这个时候你必须得配两组,很多人就会只配置了自己要的那一组(因为很多时候都是只需要一组掩码就够了),另外一组就不配了(0x0000,即通配),如下代码:

CAN_FilterInitStructure.CAN_FilterIdHigh=0x1200<<5;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000<<5;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xff00;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

代码本意是要让符合0x12xx的标识符通过滤波器,但是由于它第二组的掩码设置为0x0000,导致所有的标识符都通配了;如果要实现预期效果,则应该把第二组的ID和Mask也设置为一样,或者只把mask改为0xffff,这样就比预期多了一个0x0000可以通过滤波器。

4.在设置为16位标识符列表模式时,原16位标识符掩码模式的掩码部分都用作列表项了,所以一个滤波器组可以配置4个列表项,14个滤波器组就可以配置56个列表项,还是很可观的。

5.有的STM32单片机有两个CAN,若CAN1和CAN2同时都需要使用,则应该分别使用不同的接收缓冲,并且CAN1只能使用滤波器组0-13,CAN2只能使用滤波器组14-27;若只使用了CAN2,则在初始化CAN2时要把CAN1的时钟也开启了,否则工作不正常。在接收中断方面,若CAN2使用的是 CAN_Filter_FIFO1 ,则其接收中断函数应为 CAN2_RX1_IRQHandler。

猜你喜欢

转载自blog.csdn.net/u011764302/article/details/108316345