STM32完全学习——CAN过滤器

一、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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值