您的位置:首页 > 其它

CAN总线之CAN ID过滤器分析

2018-02-28 12:20 288 查看
(参考博客:http://blog.csdn.net/flydream0/article/details/8148791)
1.CAN报文标识符:并不代表节点的地址 而是和报文的内容有关 发送者以广播的形式发送消息 节点在接收报文时根据标识符(CAN ID)决定是否需要该报文
 如果需要则拷贝到SRAM中 不需要则丢弃
实现硬件过滤 节省CPU开销

2.过滤器组 Filterx  x为过滤器号
 STM32总共提供14个过滤器组来处理CAN接收过滤问题,每个过滤器组包含两个32位寄存器CAN_FxR0和CAN_FxR1组成

3.过滤器的过滤模式 通过CAN_FilterMode设置
a.屏蔽位模式IdMask:为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。 在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。如需要出生年月需要找出1995的则出生年月中年份的四位必须匹配 月和日则不用关心
b.标识符列表模式IdList:为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。

4.过滤器的位宽 通过CAN_FilterScale设置
每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
●1个32位过滤器CAN_FilterScale_32bit,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
●2个16位过滤器CAN_FilterScale_16bit,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

5.过滤器组的过滤模式和位宽设置 通过相应的C
4000
AN_FMR寄存器(CAN过滤器主控寄存器)配置



FSCx=1时为1个32位寄存器位宽为32
FSCx=0时为2个16位寄存器位宽为32

6.过滤器匹配序号
对于标识符列表模式下的过滤器(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。
对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。

7.CAN 过滤器组x寄存器 (CAN_FiRx) (i=0..13,x=1..2)
FB[31:0] : 过滤器位
当为标识符模式时:
             寄存器的每位对应于所期望的标识符的相应位的电平。
             0: 期望相应位为显性位;
             1: 期望相应位为隐性位。
当为屏蔽位模式时:
             寄存器的每位指示是否对应的标识符寄存器位一定要与期望的标识符的相应位一致。
             0: 不关心,该位不用于比较;
             1: 必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。

CAN ID值的结构分析



如上图,基本格式不存在扩展ID,而扩展格式中ID0~ID17为Extension ID(扩展ID),而ID18~ID28为Base ID(基本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。

8.位宽为32位的屏蔽模式



STID为标准ID EXID为扩展ID 如果STID为0x06 扩展ID为0x00则 CAN ID值0x00060000用二进制表示为0b000[0 0000 0001 10](标准ID) [00 0000 0000 0000 0000](扩展ID)
在屏蔽方式下,屏蔽码寄存器某位为1表示接收到的CAN ID对应的位必须对验证码寄存器对应的位相同
则CAN_FilterIdHigh(标识符寄存器高字节)为上图中的ID16到31位应该为0b0000 0000 0001 1000
0x0018 
屏蔽寄存器的设置:
在只接收标准ID时 将STDID对应寄存器的值填入ID32位寄存器即CAN_FilterIdHigh高16位 其中EXID及其他各位都设置为0因为在这个时候IDE(帧格式 标准帧(CAN_ID_STD 0)或者是扩展帧( CAN_ID_EXT0x1))和RTR(数据帧0或者为遥控帧1) 再将对应的需要保准ID32位中需要一样的为1放入mask寄存器中 
接收其他类型的ID时类似
 位宽为32位的标识符列表模式
在列表模式下如果位宽为32为则可以设置两个ID列表

16位模式可以设置4个ID列表



16位宽的列表模式
在16位宽的列表模式下,FilterIdHigh,FilterIdLow,FilterMaskIdHigh,FilterMaskIdLow这4个16位变量都是用来存储一个标准CAN ID,这样,就可以存放4个标准CAN ID了,需要注意地是,此种模式下,是不能处理扩展CANID,凡是需要过滤扩展CAN ID的,都是需要用到32位宽的模式。

在32位宽的列表模式下,CAN_FxR1与CAN_FxR2都用来存储希望通过的CAN ID,由于是32位宽的,因此既可以存储标准CAN ID,也可以存储扩展CAN ID。注意看上图最底下的各位定义,可以看出,从右到左,首先,最低位是没有用的,然后是RTR,表示是否为远程帧,接着IDE,扩展帧标志,然后才是EXID[0:17]这18位扩展ID,最后才是STID[0:10]这11位标准ID,也就是前面所说的基本ID。在进行配置的时候,即将希望通过的CAN ID写入的时候,要注意各个位对号入座,即基本ID放到对应的STD[0:10],扩展ID对应放到EXID[0:17],若是扩展帧,则需要将IDE设为“1”,标准帧则为“0”,数据帧设RTR为“0”,远程帧设RTR为“1”

32位宽模式下,FilterIdHigh与FilterIdLow合在一起表示CAN_FxR1寄存器,用来存放验证码,而FilterMaskIdHigh与FilterMaskIdLow合在一起表示CAN_FxR2寄存器,用来存放屏蔽码,关于验证码与屏蔽码的概念在之前的2.3节已经明确说明了,不清楚的可以回过去看看2.3节的内容。在32位宽的掩码模式下,既可以过滤标准CAN ID,也可以过滤扩展CAN ID,甚至两者混合这来也是可以的
对所有的ID先进行异或操作 再将异或后的值中为1的写入mask中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: