CAN过滤器详解

CAN过滤器详解

在嵌入式开发中,不可避免的会使用到can通信,通常情况下,代码是在can中断中进行can帧的处理,代码如下
在这里插入图片描述

                           中断向量表

在这里插入图片描述

                        中断处理函数

在各种工况中,同一条can线上的消息是繁杂的,如果不对can帧进行滤波,程序就会频繁的进入中断,增加CPU负载。
那么接下来,我们就一起来学习下can过滤相关内容

1.CAN过滤器组

我们以stm32单片机为例,stm32单片机的can过滤器支持多个过滤器组,不同型号的 STM32 单片机可能会有不同数量的 CAN 过滤器组。以常见的 STM32F1、STM32F4 和 STM32F7 系列为例,它们通常具有 14 到 28 个过滤器组。

不同的过滤器组是以并联的关系存在的,也就意味着任意一个过滤器组的规则通过,那么该can帧就会被接收到FIFO(First In, First Out,先进先出队列,CAN控制器一般会有两个FIFO队列来管理CAN帧,分别为FIFO0与FIFO1,配置过滤器规则本质上就是对FIFO队列进入规则进行配置,当接收到的 CAN 帧符合某个过滤器的条件时,该帧将被放入对应的 FIFO 队列)中。

2. CAN过滤器过滤模式

每一个can过滤器组都可以配置其模式与位宽,模式分别为掩码模式与列表模式,位宽为16或32位,模式与位宽排列组合可得出,can过滤器组共有四种模式。

2.1 16位列表模式:

列表模式是精确匹配CAN帧的,标准帧长度为11位,在寄存器高位,所以我们匹配的can帧要左移五位,代码如下:
在这里插入图片描述

16位列表模式一次可以匹配4个标准帧

2.2 32位列表模式

32位列表模式可以匹配两个标准帧或者拓展帧数,代码如下:
在这里插入图片描述

2.3 16位掩码模式

掩码模式相对复杂,其为了匹配满足一系列规则的can帧,接下来我们结合代码对掩码模式进行解析,代码如下:
在这里插入图片描述

16位掩码模式下的can过滤组可以配置两套掩码规则,首先我们分析第一套掩码规则,id位0x1234,掩码为0xFFFF,其二进制数据分别为:

ID: 0001 0010 0011 0100
掩码:1111 1111 1111 1111
掩码为1的表示关注该位,,只有与该位置ID同样值的才可以通过
掩码为0的表示不关注该位,于是该过滤器规则表示只有canID为0x1234的can帧能被接收并且放入FIFO0队列
紧接着我们分析第二个规则,id为0x5678,掩码为0XFFF0
ID: 0101 0110 0111 1000
掩码:1111 1111 1111 0000
结论:0101 0110 0111 xxxx
所以该过滤器允许通过0x5670(0x01 0110 0111 0000)到0x567F(0101 0110 0111 1111)之间的所有值

16位掩码模式通常用于过滤标准帧
标准帧过滤如上图所示,但是在实际使用中与上图的区别在于标准帧id需左移5位,掩码也需左移5位,如果不明白原理说明上面没仔细看,请从2.1再次仔细阅读。
16位掩码模式过滤拓展帧相对比较复杂,通常情况下不会使用16位掩码模式过滤拓展帧

2.4 32位掩码模式

32为掩码模式与16为掩码模式原理一致,只不过其通常用于过滤拓展帧(也可以用于过滤标准帧),实例代码如下:
在这里插入图片描述

该CAN过滤器组过可以满足0x1811这样的拓展帧ID通过

3. 配置过滤器组到底是在配置什么

过滤器其实可以看作是2个32位寄存器,根据不同的过滤模式,这两个32位寄存器可以被看做4个16位过滤器,用于过滤4个标准帧,也可以看作两个32位过滤器,用于过滤2个拓展帧,也可以看作两个16位掩码寄存器,或者一个32位掩码寄存器。
我们配置不同的模式,其实本质就是对这两个寄存器进行操作

吃饭时间到了,未完待续···

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值