最近看了下STM32 CAN 通讯其中标示符过滤器设置大有讲究。特别是你要使用ST库函数时,当过滤器工作在屏蔽模式下,并且你把屏蔽位设了1也就是标示符对应位必须全部匹配才能通过,这是由其要小心。
举个例子吧,过滤器长度为32位,模式为屏蔽模式,假如我要发送的标示符为0x1314;那过滤器设置如下
一、过滤器完全无效 接收到的标示符全部通过
0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100
CAN_Filter xxxx xxxx xxxxxxxx xxxx xxxx xxxx xxxx
CAN_FilterMask 0000 0000 0000 0000 0000 0000 0000 0000
因为 CAN_FilterMask屏蔽寄存器所有位都是0 ,对应标示符全为“不关心”,也就是接收到数据的ID(标示符)不用与 CAN_Filter寄存器的任何一位进行匹配。
二、过滤器完全有效接收到的标示符要跟据MASK寄存器指定需要匹配的位进行比较
部分匹配
0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100
CAN_Filter xxxx xxxx xxxxxxxx xxxx xxx1 xxxx xxxx
CAN_FilterMask 0000 0000 0000 0000 0000 0001 0000 0000
CAN_FilterMask 寄存器指定接收到的标示符要与第8位进行匹配,其他位不管。也就是说接收到的标示符第8位必须为1,否则报文就会被丢弃。
全部匹配
0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100
CAN_Fil