CAN过滤器配置以及常见问题总结
过滤器组
在具有两个CAN的产品中,CAN1和CAN2分享28个过滤器组,只有一个CAN的系列产品中有14个过滤器组,用以对接收到的帧进行过滤。
• 设置为掩码模式主要是为了过滤出一组(多个)符合要求的ID;
• 设置为列表模式主要是为了过滤出一个或多个符合要求的ID;
• 设置16位过滤器只能用来过滤标准帧ID;
• 设置32位过滤器一般用来过滤扩展帧ID(当然也可以过滤标准帧);
一个过滤器组是由两个32位寄存器组成,可以将其配置为:
• 四个16位列表模式的过滤器,可以过滤出来四个ID号的信息;
• 两个16位掩码模式过滤器
• 一个32位掩码模式过滤器
下面介绍下掩码模式:
当我们设置为掩码模式时:一般我们称CAN_FxR1寄存器为ID寄存器(或者验证码寄存器),CAN_FxR1为掩码寄存器。
具体代码体现为:(315,316,317,318,均是需要左移五位填入相应寄存器的。注意32位掩码模式具体怎么移位可参考下面的32位列表ID怎么移位的)
掩码模式的过滤器计算逻辑为:其实就是掩码位与ID位对应,掩码位为1的通过,掩码位为0的随意。可参考如下示例:假设ID和掩码分别为
ID码: 11 0001 0110 //0x316
掩码: 11 0001 0111//0x317
那么计算结果就为:
1 1 x x x 1 x 1 1 0 ,(x可为0,可为1)这些数据均可通过过滤器。
如此可自行计算上面可通过的ID是什么?
下面介绍下列表模式:
可过滤出一个标识。此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐。
所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。
按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:
(1) 1个32位的屏蔽位模式的过滤器。
(2) 2个32位的列表模式的过滤器。
(3) 2个16位的屏蔽位模式的过滤器。
(4) 4个16位的列表模式的过滤器。
如下面配置,四个16位ID(0x314,0x315,0x316,0x317)都可通过
那么32ID该怎么配置呢,此时不是简单像上述16位模式左移五位实现,具体参考如下(我们以32位列表为例,下面配置则通过的ID为0x12345678),至于为什么这样移位这里不再赘述,想知道的具体可看下寄存器手册
总结:我们发现ID是通过移位来实现的,具体原因参考手册中此寄存器
那么可对比列表模式和掩码模式优缺点:
常见CAN配置问题:
1.怎么配置多个过滤器?
像上面那种配置则表示过滤器组0,1与fifo0绑定,每个过滤器独立,可随意配置,如过滤器0可绑定fifo0,也可绑定fifo1。
2.CAN最多可配置几个过滤器组?
如果设备只有一个CAN,则最多14个(0-13),若有两个CAN,则最多27个(程序若不进行配置则默认CAN1可用0-13,CAN2可用14-27),可配置CAN2过滤器开始组,需注意CAN2使用的过滤器组好默认为开始组以后。
具体参考代码如下:如果这里填9,那么CAN1能使用的过滤器组为0-8,CAN2为9-27。
3.例程改为CAN2不能使用?
可参考上面的问题,需注意CAN2使用的过滤器组好默认为开始组以后,如果不进行配置则按照默认值分配。相关寄存器如下,可看到默认值为01110,则CAN2默认开始组为14。