CAN节点通过ID过滤可以选择性接收消息,stm32的CAN过滤器有两种模式:列表模式和掩码模式。
(1)列表模式
列表模式只接收符合指定ID的帧,保存指定ID使用2个32位寄存器,分为16位模式和32位模式。
16位列表模式一个ID占16位,一共存4个16位ID,通常用于标准帧,标准帧的ID存入16位的高11位,扩展帧只能存15~17于低3位,另外两位分别存RTR和IDE位,分别表示标准帧(0)/扩展帧(1),数据帧(0)/遥控帧(1)
32位列表模式一个ID占32位,一共存2个32位ID,通常用于扩展帧,扩展帧的ID存入32位寄存器的高29位,另外3位分别存IDE,RTR和0。
//初始化过滤器------16位列表模式
CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;//使能过滤器
CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;//安装过滤器到FIFO0
CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdList;//过滤器模式 --- 列表
CAN_FilterInitStruct.CAN_FilterNumber = 0;//过滤器0
CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_16bit;//过滤器长度
//提供两个标准帧ID 0x123 , 0x321;提供两个掩码0x7af,0x000
CAN_FilterInitStruct.CAN_FilterIdHigh = 0x123<<5;
CAN_FilterInitStruct.CAN_FilterIdLow = 0x321<<5;
CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0x7af<<5;
CAN_FilterInitStruct.CAN_FilterMaskIdLow = 0x000;
CAN_FilterInit(&CAN_FilterInitStruct);
//初始化过滤器------16位掩码模式
CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;//使能过滤器
CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;//安装过滤器到FIFO0
CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdList;//过滤器模式 ---列表
CAN_FilterInitStruct.CAN_FilterNumber = 0;//过滤器0
CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_16bit;//过滤器长度
//提供一个标准帧ID 0x6789abc,0xcba9876
//ID高16位
CAN_FilterInitStruct.CAN_FilterIdHigh = 0x6789abc>>13;
//ID低13位放高位,IDE-1
CAN_FilterInitStruct.CAN_FilterIdLow = (0x6789abc<<5)& 0xffff | (0x1)<<2;
//ID高16位
CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0xcba9876>>13;
//ID低13位放高位,IDE-1
CAN_FilterInitStruct.CAN_FilterMaskIdLow = (0xcba9876<<3)& 0xffff | (0x1)<<2;
CAN_FilterInit(&CAN_FilterInitStruct);
(2)掩码模式
掩码模式只接收符合掩码要求的帧,一个32位的寄存器存储ID,一个32位的寄存器存储掩码,也分为16位模式和32位模式。
只有第一个寄存器中对应第二个寄存器中为1的为才需要匹配。
//初始化过滤器------16位掩码模式
CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;//使能过滤器
CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;//安装过滤器到FIFO0
CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;//过滤器模式 --- 列表
CAN_FilterInitStruct.CAN_FilterNumber = 0;//过滤器0
CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_16bit;//过滤器长度
//提供两个标准帧ID 0x123 , 0x321;提供两个掩码0x0f0,0xf0f0
CAN_FilterInitStruct.CAN_FilterIdHigh = 0x123<<5;
CAN_FilterInitStruct.CAN_FilterIdLow = 0x321<<5;
CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0x0f0<<5;
CAN_FilterInitStruct.CAN_FilterMaskIdLow = ((0xcba9876<<3) & 0xffff)|(0x1<<2);
CAN_FilterInit(&CAN_FilterInitStruct);
请试着设置CN总线过滤器32位模式