Board logo

标题: STM32之CAN ---CAN ID过滤器分析(4) [打印本页]

作者: yuyang911220    时间: 2015-3-27 22:54     标题: STM32之CAN ---CAN ID过滤器分析(4)

4.2 位宽为32位的屏蔽模式
                                                                                在此种模式下中过滤多个CAN ID,此时,过滤器包含两个寄存器,屏蔽码寄存器和标识符寄存器。此模式下最多只存在一个屏蔽过滤器。                       
                                                        如下图所示:                       
                                                                               
                                                                                                                                         图10                       
                                                        如上图,上面的ID为标识符寄存器,中间部分的MASK为屏蔽码寄存器。每个寄存器都是32位的。最下边显示的是与CAN ID各位定位的映射关系。由4.1的知识很快可以发现,上图最下边的映射关系恰好等于扩展CAN值左移3位再补上IDE(扩展帧标识),RTR(远程帧标志)。                       
                       
                                                        因此,我们初步得出这样的推论:对于一个扩展CAN ID,不能单纯地将它看到的一个数,而应该将它看成两部分,基本ID和扩展ID(当然标准CAN ID只包含基本ID部分),过滤器屏蔽码寄存器和标识符寄存器也应该看成多个部分,然后问题就变成了如何将CAN ID所表示的各部分如何针对过滤器寄存器各部分对号入座的问题了。                       
                                                        对号入座的方法多种多样,但万变不离其心,主要是掌握其核心思想即可:1:在各种过滤器模式下,CAN ID与寄存器相应位置一定要匹配;2:在屏蔽方式下,屏蔽码寄存器某位为1表示接收到的CAN ID对应的位必须对验证码寄存器对应的位相同。                       
                       
                                                        下面给出一个代码例子,假设我们要接收多个ID:0x7e9,0x1800f001,前面为标准ID,后面为扩展ID,要同时能接收这两个ID,那么该如何设置这个过滤器呢?                       
                       
                                                                                                                                                [cpp] view plaincopyprint?                                       
                               
                                                       
                                                        总结可知,当过滤器为屏蔽模式时,标识符寄存器对应的ID内容可为任意一需求接收的ID值,当同时要接收标准帧和扩展帧时,标识符寄存器对应IDE位也随意设置,屏蔽寄存器的IDE位设置为0,表示不关心标准帧还是扩展帧。而屏蔽寄存器对应的ID内容为各需求接收的ID值依次异或的结果再取反。                       
                                                        4.3 位宽为32位的标识符列表模式                                                                                在此种模式下,过滤器组包含的两个寄存器含义一样,此模式下只多存在两个标识符列表过滤器如下图:                       
                                                                               
                                                                                                                                                           图11                       
                       
                                                                                                                                                [cpp] view plaincopyprint?                                       
                               
                                                       
                                                        4.4 位宽为16位的屏蔽码模式                                                                                在此模式下,最多存在两个屏蔽码过滤器,如下图:                       
                                                                               
                                                                                                                                                                  图12                       
                                                        由上图映射可知,最下面的映射只包含STDID0~ID10,因此,此模式下的两个屏蔽过滤器只能实现对标准ID的过滤。具体代码就不介绍了,参见上图的映射即可。                       
                       
                                                        4.5 位宽为16位的标识符列表模式                                                                                                       
                                                                                                                                                      图13                       
                                                        在此模式下,由于标识符寄存器的高16位和低16位,屏蔽寄存器的高16位和低16位都用来做标识符寄存器,因此,最多可存在4个标识符过滤器。同样,只能实现对标准帧的过滤。具体代码就不介绍了,参见上图的映射即可。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0