在CAN通信中,有时候我们只想接收需要的ID,而滤出掉不需要的消息,这时候我们就需要添加滤波配置,本次以STM32F103RC为例来说明,首先来看什么是有效报文
01
有效报文
根据CAN协议,当报文被正确接收,这里指的是直到最后一位都没有报错,且通过了标识符过滤,那么该报文被认为是有效报文,是我们需要的报文。那么什么是标识符过滤呢?
02
标识符过滤
你可以简单的把他理解成和我们日常生活中的过滤一样,就是滤掉不需要的,剩下我们需要的,在CAN协议里,报文的标识符是跟报文的内容相关的,过滤是配置后,硬件完成,无需CPU开销,在F103中有14个位宽可变的可配置的过滤器组,每个过滤器组由两个32位寄存器组成。每个过滤器的位宽都可以独立配置,以满足应用程序的不同需求。可配置为屏蔽位模式和标识符列表模式。
屏蔽位模式:
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照
“必须匹配”或“不用关心”处理。
标识符列表模式:
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一
个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符
相同。
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。应用程序不用的过滤器组,应该保持在禁用状态。过滤器组中的每个过滤器,都被编号为(叫做过滤器号)从0开始,到某个最大数值-取决于过滤器组的模式和位宽的设置。 更多详细的描述大家可以参考官方手册,这里不在赘述,主要给大家来说明下软件上如何设置
03
软件实现
软件实现上,按照手册描述,我们以配置标识符列表模式为例来说明,假设在我的软件里,我想过滤的标识符为
那么在CAN的初始化程序里面,我们就要加上过滤
然后在启动CAN使能中断,初始化就完成了。
04
添加多条过滤
上一节我们添加了一个过滤,那么只会过滤出一个ID,可是如果我想要另一个ID也进来呢,那么我们可以在上图代码中第一个过滤后继续添加
注意到两组中的不同,一个是sFilterConfig.FilterBank的不同,另一个就是要过滤的ID标识符不同。至此基于标识符列表的过滤模式就算完成,屏蔽位模式大家下去可以自己对照手册研究下。
温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。