关于过滤器的设置:
1、过滤器是针对接收的,有两种方式分别为列表模式和掩码模式。每种模式下有16位位宽和32位位宽的差异。因此组合起来就有4种不同的设置。
- 列表模式:将需要进行接收的报文ID写入过滤器,在接收时会根据列表进行接收,不在列表中的报文ID会进行过滤不接收。在列表模式下,16位位宽和32位位宽差异在于接收报文ID的数量不同。32位位宽的过滤器,在列表模式下每个过滤器只能写入两个报文ID,将希望存入的报文ID放入CAN_FxR1和CAN_FxR2这两个寄存器,而16位位宽最多可以写入4个报文ID,将CAN_FxR1和CAN_FxR2这两个寄存器进行拆分即可。
在列表模式下,需要注意的是对应HAL库是FilterIdHigh是CAN_FxR1的高16位,FilterIdLow是CAN_FxR1的低16位。在ID填写过程中需要注意该寄存器的存放位置说明,并不是直接将ID进行赋值就行。
以32位为例,我们可以看到标准ID(共11bit)是被分开成两部分的,在FilterIdHigh寄存器的bit5-bit15。扩展ID(共18bit)也是被分开的,分为3部分,IDE是指标准ID还是扩展ID,RTR是数据帧还是远程帧。
一般列表模式都是针对ID数量不多的情况下进行的,能准确过滤。
- 掩码模式:只需要设置某些位就可以。打个比方假设筛查1990—1999年出生的人,我其实可以只检查199x这三个数字就行,不需要最后一位也进行检查,此时假设我们观察的是身份证信息,那么在出生年份前面和后面其实还有很多位,我们把身份证号的其它位不需要进行检测就与0去进行与操作,需要进行检测的就是与1去进行与操作,这个与的操作就是屏蔽码的作用,而与后剩下的就是出生年份这一项,与199比较就是验证码。这个就是使用了掩码的方式,只取公共位就行,先进行大致的筛查。对应程序中也是在CAN_FxR1和CAN_FxR2这两个寄存器进行设置。我们需要设置屏蔽码和验证码这两个。其中对于32位位宽的过滤器来说CAN_FxR1就是存放验证码,CAN_FxR2存放屏蔽码。而16位位宽的就会拆分为2对验证码和屏蔽码,但此时只针对标准ID。
掩码过滤时就按上面的寄存器标示进行设置即可。由于在列表模式下已经讲过就不再赘述。后面我们再讲讲具体的程序操作。