STM32 CAN 通讯通讯 标示符过滤器设置标示符过滤器设置
最近看了下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_Filter00000000000000000000 001100010100
CAN_FilterMask11111111111111111111 11111111 1111
这种情况最为严格,接收到的标示符必须每一位都得与过滤器中的标示符的每一位进行匹配,有一位不对报文就会被丢弃。
(这个标示符匹配的工作是CAN 模块内部硬件自动完成的)
三、利用ST库进行CAN 过滤器的配置
同样发送端和接收端数据标示符都为0x1314
第一种:过滤器无效,全部通过
static void CAN_Filter_Config(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber=0;//过滤器组0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//工作在标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为单个32位。
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//要过滤的ID高位
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //要过滤的ID低位 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=
0x0000;//过滤器高16位每位无须匹配
CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0x0000;//过滤器低16位每无必须匹配
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ;//过滤器被关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);