STM32之CAN ---CAN ID过滤器分析
和FMI4被存入FIFO。
如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。
如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。
3 与过滤器相关的寄存器
3.1 CAN 过滤器主控寄存器 (CAN_FMR)
地址偏移量: 0x200
复位值: 0x2A1C 0E01
注: 该寄存器的非保留位完全由软件控制。
图4
位31:1 | 保留位,强制为复位值。 |
位0 | FINIT : 过滤器初始化模式 针对所有过滤器组的初始化模式设置。 0: 过滤器组工作在正常模式; 1: 过滤器组工作在初始化模式。 |
3.2 CAN 过滤器模式寄存器 (CAN_FM1R)
地址偏移量: 0x204
复位值: 0x0000 0000
注: 只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。
图5
位31:14 | 保留位,硬件强制为0 |
位13:0 | FBMx : 过滤器模式 过滤器组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:0 | FSCx : 过滤器位宽设置 过滤器组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:0 | FFAx : 过滤器位宽设置 报文在通过了某过滤器的过滤后,将被存放到其关联的FIFO中。 0:过滤器被关联到FIFO0; 1:过滤器被关联到FIFO1。 |
3.5 CAN 过滤器激活寄存器 (CAN_FA1R)
地址偏移量: 0x21C
复位值: 0x0000 0000
图7
位31:14 | 保留位,硬件强制为0。 |
位13:0 | FACTx : 过滤器激活 软件对某位设置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:0 | FB[31:0] : 过滤器位
0: 期望相应位为显性位; 1: 期望相应位为隐性位。
0: 不关心,该位不用于比较; 1: 必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。 |
屏蔽位模式下的屏蔽/标识符寄存器,跟标识符列表模式下的寄存器位定义相同。
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(扩展
STM32CANID过滤 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)