关于STM32的CAN的过滤器

STM32普通型芯片的CAN有14组过滤器组,互联型有28组过滤器组.
一般我们用的都是普通型的,所以在本文中可以说STM32有14组过滤器组.

根据配置,每1组过滤器组可以有1个,2个或4个过滤器.
这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文
从这些过滤器上"过"一下,能通过的报文是有效报文,收进FIFO中,
不能通过的是无效报文(不是发给"我"的报文),直接丢弃.
所有的过滤器是并联的,即,一个报文只要通过了一个过滤器,就是算是有效的.

每组过滤器组有两种工作模式: 标识符列表模式,标识符屏蔽位模式.
在标识符列表模式下,收到报文的标识符必须与过滤器的值完全相等,才能通过.
在标识符屏蔽位模式下,可以指定标识符的哪些位为何值时,就算通过.这其实就是限定了处于某一范围的标识符能够通过.
在一组过滤器中,整组的过滤器都使用同一种工作模式.

另外,每组过滤器中的过滤器宽度是可变的,可以是32位或16位.
由工作模式和宽度,一个过滤器组可以变成以下几中形式之一:
(1) 1个32位的屏蔽位模式的过滤器.
(2) 2个32位的列表模式的过滤器.
(3) 2个16位的屏蔽位模式的过滤器.
(4) 4个16位的列表模式的过滤器.
所有的过滤器是并联的,即,一个报文只要通过了一个过滤器,就是算是有效的.

每组过滤器组有两个32位的寄存器用于存储过滤用的"标准值",分别是FxR1,FxR2.
在32位的屏蔽位模式下:
    有1个过滤器,
    FxR2用于指定需要关心哪些位,FxR1用于指定这些位的标准值.
在32位的列表模式下:
    有两个过滤器.
    FxR1指定过滤器0的标准值,收到报文的标识符只有跟FxR1完全相同时,才算通过.
    FxR2指定过滤器1的标准值.
在16位的屏蔽位模式下:
    有2个过滤器.
    FxR1配置过滤器0,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值.
    FxR2配置过滤器1,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值.
在16位的列表模式下:
    有4个过滤器.
    FxR1的[15-0]位配置过滤器0,FxR1的[31-16]位配置过滤器1.
    FxR2的[15-0]位配置过滤器2,FxR2的[31-16]位配置过滤器3.

STM32的CAN有两个FIFO,分别是FIFO0,FIFO1.为了便于区分,下面FIFO0写作FIFO_0,FIFO1写作FIFO_1.
每组过滤器组必须关联且只能关联一个FIFO.复位默认都关联到FIFO_0.
所谓"关联",是指假如收到的报文从某个过滤器通过了,那么该报文会被存到该过滤器相连的FIFO.
从另一方面来说,每个FIFO都关联了一串的过滤器组,两个FIFO刚好瓜分了所有的过滤器组.

每当收到一个报文,CAN就将这个报文先与FIFO_0关联的过滤器比较,如果被匹配,就将此报文放入FIFO_0中.
如果不匹配,再将报文与FIFO_1关联的过滤器比较,如果被匹配,些报文就放入FIFO_1中.
如果还是不匹配,此报文就被丢弃.

每个FIFO的所有过滤器都是并联的,只要通过了其中任何一个过滤器,该报文就有效.
如果一个报文既符合FIFO_0的规定,又符合FIFO_1的规定,显然,根据操作顺序,它只会放到FIFO_0中.

每个FIFO中只有激活了的过滤器才起作用,换句话说,如果一个FIFO有20个过滤器,但是只激话了5个,
那么比较报文时,只拿这5个过滤器作比较.
一般要用到某个过滤器时,在初始化阶段就直接将它激活.
需要注意的是,每个FIFO必须至少激活一个过滤器,它才有可能收到报文.如果一个过滤器都没有激活,
那么是所有报文都报废的.
一般的,如果不想用复杂的过滤功能,FIFO可以只激活一组过滤器组,且将它设置成32位的屏蔽位模式,
两个标准值寄存器(FxR1,FxR2)都设置成0.这样所有报文均能通过.

STM32 CAN中,另一个较难理解的就是过滤器编号.
过滤器编号用于加速CPU对收到报文的处理.
收到一个有效报文时, CAN会将收到的报文, 以及它所通过的过滤器编号, 一起存入接收邮箱中,
CPU在处理时,可以根据过滤器编号,快速的知道该报文的用途,从而作出处理.
不用过滤器编号其实也是可以的, 这时候CPU就要分析所收报文的标识符, 从而知道报文的用途.
由于标识符所含的信息较多,处理起来就慢一点了.

STM32使用以下规则对过滤器编号:
(1) FIFO_0和FIFO_1的过滤器分别独囗立编号,均从0开始按顺序编号.
(2) 所有关联同一个FIFO的过滤器,不管有没有被激活,均统一进行编号.
(3) 编号从0开始,按过滤器组的编号从小到大,按顺序排列.
(4) 在同一过滤器组内,按寄存器从小到大编号.FxR1配置的过滤器编号小,FxR2配置的过滤器编号大.
(5) 同一个寄存器内,按位序从小到大编号. [15-0]位配置的过滤器编号小,[31-16]位配置的过滤器编号大.
(6) 过滤器编号是囗弹性的. 当更改了设置时,每个过滤器的编号都会改变.
    但是在设置不变的情况下,各个过滤器的编号是相对稳定的.

这样,每个过滤器在自己在FIFO中都有编号. 
在FIFO_0中,编号从0 -- (M-1), 其中M为它的过滤器总数.
在FIFO_1中,编号从0 -- (N-1), 其中N为它的过滤器总数.

一个FIFO如果有很多的过滤器, 可能会有一条报文, 在几个过滤器上均能通过,
这时候, 这条报文算是从哪儿过来的呢? 
STM32在使用过滤器时,按以下顺序进行过滤
(1) 位宽为32位的过滤器,优先级高于位宽为16位的过滤器
(2) 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式
(3) 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高

按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被存入接收邮箱中.

关于STM32的CAN的过滤器的更多相关文章

  1. STM32 CAN总线标识符过滤器难点解析

    STM32 CAN总线标识符过滤器难点解析 原创 2016年05月31日 15:12:24 标签: stm32 / CAN 4910 CAN总线是目前应用非常多的一种总线,在汽车电子,航空航天中应用广 ...

  2. stm32之can总线过滤器研究

    stm32的can总线的配置如下:       CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式      CAN_InitStructure.CAN_A ...

  3. STM32 CAN

    STM32普通型芯片的 CAN 有14组过滤器组(互联型有28组过滤器组) ,用以对接收到的帧进行过滤.每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和 CAN_FxR1.对于过滤器组, ...

  4. STM32之CAN ---CAN ID过滤器分析

      1 前言 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的.因此,发送者以广播的形式把报文发送给所有的接收者.节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该 ...

  5. STM32使用以下规则对过滤器编号:

    STM32使用以下规则对过滤器编号:(1) FIFO_0和 FIFO_1的过滤器分别独立编号,均从0开始按顺序编号.(2) 所有关联同一个 FIFO 的过滤器,不管有没有被激活,均统一进行编号.(3) ...

  6. 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结

    1. 前言 bxCAN是STM32系列最稳定的IP核之一,无论有哪个新型号出来,这个IP核基本未变,可见这个IP核的设计是相当成熟的.本文所讲述的内容属于这个IP核的一部分,掌握了本文所讲内容,就可以 ...

  7. STM32之CAN通讯接收过滤器过滤分析

    一.前言 学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就 ...

  8. stm32 CAN过滤器组

    在互联型产品中, CAN1和CAN2分享28个过滤器组 其它STM32F103xx系列产品中有14个过滤器组 位宽设置 四种配置方式: 1个32位的屏蔽位模式 2个32位的标识符列表模式,可以过滤2个 ...

  9. STM32——CAN总线过滤器设置

    STM32CAN控制器每个筛选器组由两个32位的寄存器组成. 根据所需位宽的不同,各个筛选器可配置成16位或32位模式(如下图,当FSCx=1为32位模式,FSCx=0时为16位模式).同时,筛选器的 ...

随机推荐

  1. fist-第六天冲刺随笔

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  2. JZOJ 11.28 提高B组反思

    JZOJ 11.28 提高B组反思 被打崩了呀 下次打提高A去了(逃 T1 刚开始没有读懂题,后来读懂了以后没有思路.没有想到是一个构造题,对同构的性质没有了解清楚,题解也讲的不明不白,懵-- T2 ...

  3. 单调栈高封装模板hia hia hia

    这个单调栈应该可以了,舒服舒服 #include <bits/stdc++.h> using namespace std; #define limit (400000 + 5)//防止溢出 ...

  4. java ipv6发邮件需要注意的点

    和ipv4发邮件一样,毕竟ip只是用来找地址的,v4 v6使用上基本没区别. 但有一点得注意:java ipv6采用发送RST包来通知邮件服务器断开连接,这样会导致客户端抛 MessagingExce ...

  5. moviepy音视频剪辑:AudioClip的max_volume方法报TypeError: bad operand type for abs(): ‘list‘错

    ☞ ░ 前往老猿Python博文目录 ░ 一.环境 操作系统:win7 64位 moviepy:1.0.3 numpy:1.19.0 Python:3.7.2 二.应用代码及报错信息 应用代码 imp ...

  6. moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...

  7. 第7.13节 案例详解:Python类变量

    第7.13节 案例详解:Python类变量 上节介绍了类变量的定义和使用方法,并举例进行了说明.本节将通过一个更完整的例子来说明. 一.    定义函数dirp def dirp(iter): ret ...

  8. 第10.3节 Python导入模块能否取消导入?

    模块导入后,是否可以取消导入?实际上当模块导入后,是无法逆向还原到导入前的状态的,但是可以利用"del 模块名"进行导入模块的删除,此时的删除只是删除了导入模块对应的模块变量名,删 ...

  9. PyQt(Python+Qt)学习随笔:QTreeWidget的topLevelItemCount属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidget的topLevelItemCount属性是一个只读属性,用于保存树型部件中顶层 ...

  10. PyQt(Python+Qt)学习随笔:图例解释QFrame类的lineWidth、midLineWidth以及frameWidth属性

    老猿Python博文目录 老猿Python博客地址 QFrame类有四个跟宽度相关的属性,分别是width.lineWidth.midLineWidth以及frameWidth属性.width是整个Q ...