本文主要是介绍关于NXP的S32K,K3系列关于CAN接收过滤的掩码设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
恩智浦芯片目前CAN这块干了两种项目,关于CAN接收这一块,上一个项目都是用MB0接收所有的CAN帧,不做物理过滤设置;接手第二种项目,是每一个MB(message buffer),对应一个掩码过滤,导致新增加的报文接收不到,先不说第一种项目会不会有丢帧(目前在手册中没有找到相关的描述,如果所有的最多32个MB都被不过滤的任意的报文占满,会不会出现RMB丢帧的情况,或者去覆盖最低优先级的MB)或硬件资源浪费(中断受各种报文的响应)的情况,第二种面临的问题就是需要把目前这个CAN接收的过滤区放大来增加可以接收到的报文。现在对S32K,K3系列的CAN 接收过滤这一块做一个总结,主要参考资料就是芯片手册(Datesheet)。
1.关于手册过滤功能中有这样一句话,这句话对设置掩码过滤非常重要:“对于邮箱接收,匹配算法可以仅将接收到的帧存储在ID字段中编程的具有相同ID 的MB中,掩码方案可以将MB上的编程的ID与接收到的CAN帧上的一系列ID相匹配。”,
2.手册中讲到很多FIFO,或者其他分类的情况,因为这个项目用到的是CANFD,不支持FIFO,所以以下描述都是基于MB接收的。
3.这段话第一个提到的是“匹配算法”,那么先介绍S32K,K3的MB的匹配算法。
这段话描述了,如果你为所有的邮箱设置了匹配算法,他的优先级是当RMB(一个通用的MB缓冲区)收到消息和ID时,在32个配置成接收邮箱的匹配顺序是从MB0到MB31。如果匹配不到则丢掉,当然还有一种特殊的情况,当不设置过滤掩码,或者过滤掩码设置的一样的话,会遵循下边这种情况。
如果有两个过滤相同的邮箱,则首先匹配索引号比较靠前的MB邮箱,(MB2)。然后匹配MB5。如果都放满的话,就覆盖后边的邮箱MB5。
关于邮箱的接收状态,文档有描述四种状态:会在下图的payload中有预留的(CODE段)
上一段话中描述有提到,IRMQ这个MCR的寄存器的标志位,下来说一下这个主要用来设置选配相应的屏蔽过滤寄存器。
当选择为0时,单独掩码寄存器和队列被关闭;启用全局掩码寄存器(RX14,RX15,RXGLAB,这个后续的文档会描述,这里就不描述了)。在这里我们项目选择,1:打开使用单独掩码寄存器,即每个邮箱都可以设置单独的掩码过滤。
即,每个邮箱都有一个单独的RXIMR(Rx Individual Mask Registers),根据相应的ID长度选配需要设置的过滤掩码。
0:表示不关心此位,此位0和1都会接收。
1:表示关心此位,必须和编程ID缓冲段的字段相同。
比如本项目设置的是CAN2.0的标准帧,只有11位。具体的填充位置与接收缓存区的位置相同。如下图方框内所示:
所以标准帧的掩码寄存器设置的位置为:28-19位;
好了,介绍完手册上的知识,让我们回到第一段话。现在设置掩码过滤需要配置的是两个地方(这里不考虑远程帧,本项目也没有用到),首先配置的是邮箱的ID段,如上图所示的0x04的位置的ID(Standard),因为本项目用的是标准帧。然后就是配置RXIMR的IM,也是配置的是28到19位。最后记住的是要将MCR的IRMQ配置为1,开启单独掩码寄存器。
举个例子:
IRMQ=1;
邮箱的ID段本项目是通过偏移量算出来ID段的位置,RXIMR0-RXIMR31都有相应的寄存器。
比如ID0=0x12D (11位标准帧);RXIMR0(28-19位)=7FF 则当前邮箱只能通过12D这个ID。
ID0=0x12D(11位标准帧); RXIMR0(28-19位)=700 ,则当前邮箱通过1xx的十一位报文。
ID0=0x12D(11位标准帧);RXIMR0(28-19位)=00F,则当前邮箱通过xxD的十一位报文。
ID0=0x12D(11位标准帧);RXIMR0(28-19位)=000,则当前邮箱通过任意报文,此时邮箱ID段填写的ID将无意义。
这篇关于关于NXP的S32K,K3系列关于CAN接收过滤的掩码设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!