一、16位标识符过滤器
如果这两个32位的寄存器,来配置16为标识符过滤器,可以配置出来4个不同的过滤器。这配置最为简单,就是将需要匹配的ID号,左移5位,和下面红色的圈出来的那个,按位对齐就行。下面那3个也可以这样配置,都是一样的。
sFilterConfig.FilterIdHigh = ID << 5;
sFilterConfig.FilterIdLow = 0;
sFilterConfig.FilterMaskIdHigh = 0;
sFilterConfig.FilterMaskIdLow = 0;
二、16位标识符掩码过滤器
使用掩码的好处是,不用像只用标识符那样100%匹配成功,而是按照掩码所指示的进行匹配。和上面不同的是,这样我们只能配置出来2个过滤器,0x36就是需要匹配的ID,如果掩码下面也是0x36表示,每个位都要匹配成功。也就是和上面16为标识符一样的,如果你不关心哪一位就将这一位变成0就可以了,如果变成全0,也就是让任何的消息都可以过来,也就起不到过滤的作用了。过滤器只比较掩码为1的位,注意两个高的寄存器是一组,2个低的寄存器是一组,不要搞混了。
sFilterConfig.FilterIdHigh = 0x36 << 5;
sFilterConfig.FilterIdLow = 0;
sFilterConfig.FilterMaskIdHigh = 0x36 << 5;
sFilterConfig.FilterMaskIdLow = 0x0000;
三、32位标识符过滤器
稍微比16位的复杂一点,他可以过滤4个32标准帧或者2个扩展帧,咱们这里先说标准帧。我们从代码就可以看出来,首先我们先将我们需要比较的ID左移21位,和表中的数据对齐,然后我们在位与其实没啥用,然后再右移16位。其实也可以直接左移5位就行,但是不好理解。还是一样只有标识符全部一样才可以以通过过滤器。
sFilterConfig.FilterIdHigh = ((0x34 << 21) & 0xffff0000) >> 16;
sFilterConfig.FilterIdLow = ((0x35 << 21) & 0xffff0000) >> 16;
sFilterConfig.FilterMaskIdHigh = ((0x31 << 21) & 0xffff0000) >> 16;
sFilterConfig.FilterMaskIdLow = 0x0000;
四、32位标识符掩码过滤器
在前面的基础上,再加一个掩码就可以了,这个可以过滤2个标准帧。掩码只会比较0x30中,为1的位,这样可以通过过滤的就不止0x34一个ID可以。
sFilterConfig.FilterIdHigh = ((0x34 << 21) & 0xffff0000) >> 16;
sFilterConfig.FilterIdLow = 0;
sFilterConfig.FilterMaskIdHigh = ((0x30 << 21) & 0xffff0000) >> 16; //掩码位
sFilterConfig.FilterMaskIdLow = 0x0000;
五、使用32位标识符过滤扩展帧
首先我们知道扩展帧一共有29位,如下框所示。原理和上面的标准帧,差不多,但是略有不同。注意这个只能过滤1个扩展帧。主要就是将高16位取出来放到高的寄存器里面,将低16位取出来放到低的寄存器里面,这里的0x345675可以是任何的数,只要他小于29位就行。
sFilterConfig.FilterIdHigh = ((0x345675 << 3) & 0xffff0000) >> 16;
sFilterConfig.FilterIdLow = ((0x345675 << 3) & 0xffff);
sFilterConfig.FilterMaskIdHigh = 0;
sFilterConfig.FilterMaskIdLow =0;
六、使用32位标识符掩码过滤扩展帧
和上面一样只能过滤1个扩展帧,而且只匹配掩码为1的位,这样就可以有很多个都可以通过过滤了。
sFilterConfig.FilterIdHigh = ((0x345675 << 3) & 0xffff0000) >> 16;
sFilterConfig.FilterIdLow = ((0x345675 << 3) & 0xffff);
sFilterConfig.FilterMaskIdHigh = ((0x340670 << 3) & 0xffff0000) >> 16;
sFilterConfig.FilterMaskIdLow = ((0x340670 << 3) & 0xffff);