微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32之CAN ---CAN ID过滤器分析

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

时间:11-10 来源:互联网 点击:

和FMI4被存入FIFO。

如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。
如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。

3 与过滤器相关的寄存器

3.1 CAN 过滤器主控寄存器 (CAN_FMR)

地址偏移量: 0x200

复位值: 0x2A1C 0E01

注: 该寄存器的非保留位完全由软件控制。

图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 CAN 过滤器位宽寄存器 (CAN_FS1R)

地址偏移量: 0x20C
复位值: 0x0000 0000
注: 只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。

图6

位31:14保留位,硬件强制为0
位13:0FSCx : 过滤器位宽设置
过滤器组x(13~0)的位宽。
0:过滤器位宽为2个16位;
1:过滤器位宽为单个32位。

3.4 CAN 过滤器FIFO关联寄存器 (CAN_FFA1R)

地址偏移量: 0x214
复位值: 0x0000 0000
注: 只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。

图7

位31:14保留位,硬件强制为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_FxR[0:1])。
0:过滤器被禁用;
1:过滤器被激活。

3.6 CAN 过滤器组x寄存器 (CAN_FiRx) (i=0..13,x=1..2)

地址偏移量:0x240h..0x2AC
复位值:未定义位
注: 共有14组过滤器:i=0..13。每组过滤器由2个32位的寄存器,CAN_FiR[2:1]组成。只有在CAN_FaxR寄存器(CAN过滤器激活寄存器)相应的FACTx位清’0’,或CAN_FMR寄存器(CAN过滤器主控寄存器)的FINIT位为’1’时,才能修改相应的过滤器寄存器。

图8

位31:0FB[31:0] : 过滤器位
  • 当为标识符模式时:
寄存器的每位对应于所期望的标识符的相应位的电平。
0: 期望相应位为显性位;
1: 期望相应位为隐性位。
  • 当为屏蔽位模式时:
寄存器的每位指示是否对应的标识符寄存器位一定要与期望的标识符的相应位一致。
0: 不关心,该位不用于比较;
1: 必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。
注: 根据过滤器位宽和模式的不同设置,过滤器组中的两个寄存器的功能也不尽相同。。关于过滤器的映射,功能描述和屏蔽寄存器的关联,请参见2节标识符过滤。

屏蔽位模式下的屏蔽/标识符寄存器,跟标识符列表模式下的寄存器位定义相同。

4 代码实例

4.1 CAN ID值的结构分析

在讲到代码实例之前,首先大家都弄懂一件事,当给定一个CAN ID,如0x1800f001,当然这个是扩展ID,这里要问的是,这个CAN ID的值本身包含两部分,即基本ID与扩展ID,即么你知道这个扩展ID0x1800f001的哪些位是基本ID,哪些位又是扩展ID?(在基本CANID格式下不存在这个问题)

在回答这个问题之前我们来看看ISO11898的定义,如下图:

图9

如上图,基本格式不存在扩展ID,而扩展格式中ID0~ID17为Extension ID,而ID18~ID28为Base ID.

因此CAN ID值0x1800f001用二进制表示为:0b 0001 1000 0000 0000 1111 0000 0000 0001,用括号分别区别为:0b 000[1 1000 0000 00][00 1111 0000 0000 0001],红色部分为扩展ID,蓝色部分为基本ID。那么知道这些有什么用呢?接下来的代码示例中你就会有什么用了。

4.2 位宽为32位的屏蔽模式

在此种模式下中过滤多个CAN ID,此时,过滤器包含两个寄存器,屏蔽码寄存器和标识符寄存器。此模式下最多只存在一个屏蔽过滤器。

如下图所示:

图10

如上图,上面的ID为标识符寄存器,中间部分的MASK为屏蔽码寄存器。每个寄存器都是32位的。最下边显示的是与CAN ID各位定位的映射关系。由4.1的知识很快可以发现,上图最下边的映射关系恰好等于扩展CAN值左移3位再补上IDE(扩展

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top