STM32之CAN---CANID过滤器分析.docx

上传人:壹****1 文档编号:547782004 上传时间:2023-07-31 格式:DOCX 页数:11 大小:636.09KB
返回 下载 相关 举报
STM32之CAN---CANID过滤器分析.docx_第1页
第1页 / 共11页
STM32之CAN---CANID过滤器分析.docx_第2页
第2页 / 共11页
STM32之CAN---CANID过滤器分析.docx_第3页
第3页 / 共11页
STM32之CAN---CANID过滤器分析.docx_第4页
第4页 / 共11页
STM32之CAN---CANID过滤器分析.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《STM32之CAN---CANID过滤器分析.docx》由会员分享,可在线阅读,更多相关《STM32之CAN---CANID过滤器分析.docx(11页珍藏版)》请在金锄头文库上搜索。

1、前言在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(130),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。为了让大家了解STM32的bxCAN的接收过滤机制,首先大家需

2、要了解几个概念。2 几个重要的概念2.1 过滤器组STM32总共提供14个过滤器组来处理CAN接收过滤问题,每个过滤器组包含两个32位寄存器CAN_FxR0和CAN_FxR1组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值(这时最大值并非13,而是取决于14个过滤器组的模式和位宽的设置,当全部配置为位宽为16,且为标识符列表模式时,最大编号为14*4-1=55)。2.2 过滤器的过滤模式STM32提供两种过滤模式供用户设置:屏蔽位模式和标识符列表模式。2.2.1 屏蔽位模式为了过滤出一组标识符,应

3、该设置过滤器组工作在屏蔽位模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。2.2.2 标识符列表模式为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。2.3 过滤器的位宽每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:1个32位过滤器,包括:STDID10:0、EXTID17:0、IDE和RTR位2

4、个16位过滤器,包括:STDID10:0、IDE、RTR和EXTID17:15位2.3 过滤器组的过滤模式和位宽设置过滤器组可以通过相应的CAN_FMR寄存器(CAN过滤器主控寄存器)配置。但是不是什么时候都可以直接配置,在配置一个过滤器组前,必须通过清除CAN_FAR寄存器(CAN过滤器激活寄存器)的FACT位,把它设置为禁用状态。然后才能设置或设置过滤器组的配置。 通过设置CAN_FS1R(CAN过滤器位宽寄存器)的相应FSCx位,可以配置一个过滤器组的位宽。 通过CAN_FM1R(CAN过滤器模式寄存器)的FBMx位,可以配置对应的屏蔽/标识符寄存器的标识符列表模式或屏蔽位模式。(见后续

5、3.2节)应用程序不用的过滤器组,应该保持在禁用状态。关于过滤器配置,可参见下图:图12.4 过滤器匹配序号一旦收到的报文被存入FIFO,就可被应用程序访问。通常情况下,报文中的数据被拷贝到SRAM中;为了把数据拷贝到合适的位置,应用程序需要根据报文的标识符来辨别不同的数据。bxCAN提供了过滤器匹配序号,以简化这一辨别过程。根据过滤器优先级规则,过滤器匹配序号和报文一起,被存入邮箱中。因此每个收到的报文,都有与它相关联的过滤器匹配序号。过滤器匹配序号可以通过下面两种方式来使用: 把过滤器匹配序号跟一系列所期望的值进行比较 把过滤器匹配序号当作一个索引来访问目标地址对于标识符列表模式下的过滤器

6、(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。在给过滤器编号时,并不考虑过滤器组是否为激活状态。另外,每个FIFO各自对其关联的过滤器进行编号,如下图:图22.5 过滤器优先级规则根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定: 位宽为32位的过滤器,优先级高于位宽为16位的过滤器 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高如下

7、图:图3如上图,在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤器的序号(这时为4)被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。3 与过滤器相关的寄存器3.1 CAN 过滤器主控寄存器 (CAN_FMR)地址偏移量: 0x200复位值: 0x2A1C 0E01注: 该寄存器的非保留位完全由软

8、件控制。图4位31:1保留位,强制为复位值。位0FINIT : 过滤器初始化模式针对所有过滤器组的初始化模式设置。0: 过滤器组工作在正常模式;1: 过滤器组工作在初始化模式。3.2 CAN 过滤器模式寄存器 (CAN_FM1R)地址偏移量: 0x204复位值: 0x0000 0000注: 只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。图5位31:14保留位,硬件强制为0位13:0FBMx : 过滤器模式过滤器组x的工作模式。0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式;1: 过滤器组x的2个32位寄存器工作在标识符列表模式。3.3 CA

9、N 过滤器位宽寄存器 (CAN_FS1R)地址偏移量: 0x20C复位值: 0x0000 0000注: 只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。图6位31:14保留位,硬件强制为0位13:0FSCx : 过滤器位宽设置过滤器组x(130)的位宽。0:过滤器位宽为2个16位;1:过滤器位宽为单个32位。3.4 CAN 过滤器FIFO关联寄存器 (CAN_FFA1R)地址偏移量: 0x214复位值: 0x0000 0000注: 只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。图7位31:14保留位,硬件强制

10、为0。位13:0FFAx : 过滤器位宽设置报文在通过了某过滤器的过滤后,将被存放到其关联的FIFO中。0:过滤器被关联到FIFO0;1:过滤器被关联到FIFO1。3.5 CAN 过滤器激活寄存器 (CAN_FA1R)地址偏移量: 0x21C复位值: 0x0000 0000图7位31:14保留位,硬件强制为0。位13:0FACTx : 过滤器激活软件对某位设置1来激活相应的过滤器。只有对FACTx位清0,或对CAN_FMR寄存器的FINIT位设置1后,才能修改相应的过滤器寄存器x(CAN_FxR0:1)。0:过滤器被禁用;1:过滤器被激活。3.6 CAN 过滤器组x寄存器 (CAN_FiRx)

11、 (i0.13,x=1.2)地址偏移量:0x240h.0x2AC复位值:未定义位注: 共有14组过滤器:i=0.13。每组过滤器由2个32位的寄存器,CAN_FiR2:1组成。只有在CAN_FaxR寄存器(CAN过滤器激活寄存器)相应的FACTx位清0,或CAN_FMR寄存器(CAN过滤器主控寄存器)的FINIT位为1时,才能修改相应的过滤器寄存器。图8位31:0FB31:0 : 过滤器位 当为标识符模式时:寄存器的每位对应于所期望的标识符的相应位的电平。0: 期望相应位为显性位;1: 期望相应位为隐性位。 当为屏蔽位模式时:寄存器的每位指示是否对应的标识符寄存器位一定要与期望的标识符的相应位

12、一致。0: 不关心,该位不用于比较;1: 必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。注: 根据过滤器位宽和模式的不同设置,过滤器组中的两个寄存器的功能也不尽相同。关于过滤器的映射,功能描述和屏蔽寄存器的关联,请参见2节标识符过滤。屏蔽位模式下的屏蔽/标识符寄存器,跟标识符列表模式下的寄存器位定义相同。4 代码实例4.1 CAN ID值的结构分析在讲到代码实例之前,首先大家都弄懂一件事,当给定一个CAN ID,如0x1800f001,当然这个是扩展ID,这里要问的是,这个CAN ID的值本身包含两部分,即基本ID与扩展ID,即么你知道这个扩展ID0x1800f001的哪些位

13、是基本ID,哪些位又是扩展ID?(在基本CANID格式下不存在这个问题)在回答这个问题之前我们来看看ISO11898的定义,如下图:图9如上图,基本格式不存在扩展ID,而扩展格式中ID0ID17为Extension ID,而ID18ID28为Base ID.因此CAN ID值0x1800f001用二进制表示为:0b 0001 1000 0000 0000 1111 0000 0000 0001,用括号分别区别为:0b 0001 1000 0000 0000 1111 0000 0000 0001,红色部分为扩展ID,蓝色部分为基本ID。那么知道这些有什么用呢?接下来的代码示例中你就会有什么用了

14、。4.2 位宽为32位的屏蔽模式在此种模式下中过滤多个CAN ID,此时,过滤器包含两个寄存器,屏蔽码寄存器和标识符寄存器。此模式下最多只存在一个屏蔽过滤器。如下图所示:图10如上图,上面的ID为标识符寄存器,中间部分的MASK为屏蔽码寄存器。每个寄存器都是32位的。最下边显示的是与CAN ID各位定位的映射关系。由4.1的知识很快可以发现,上图最下边的映射关系恰好等于扩展CAN值左移3位再补上IDE(扩展帧标识),RTR(远程帧标志)。因此,我们初步得出这样的推论:对于一个扩展CAN ID,不能单纯地将它看到的一个数,而应该将它看成两部分,基本ID和扩展ID(当然标准CAN ID只包含基本I

15、D部分),过滤器屏蔽码寄存器和标识符寄存器也应该看成多个部分,然后问题就变成了如何将CAN ID所表示的各部分如何针对过滤器寄存器各部分对号入座的问题了。对号入座的方法多种多样,但万变不离其心,主要是掌握其核心思想即可:1:在各种过滤器模式下,CAN ID与寄存器相应位置一定要匹配;2:在屏蔽方式下,屏蔽码寄存器某位为1表示接收到的CAN ID对应的位必须对验证码寄存器对应的位相同。下面给出一个代码例子,假设我们要接收多个ID:0x7e9,0x1800f001,前面为标准ID,后面为扩展ID,要同时能接收这两个ID,那么该如何设置这个过滤器呢?cpp view plaincopyprint?1. CAN_FilterInitTypeDef CAN_FilterInitStructure; 2. U16 std_id =0x7e9; 3. U32 ext_id =0x1800f001; 4. U32 mask =0; 5.6. CAN_FilterInit(&CAN_F

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号