CAN的过滤器设置

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位模式

猜你喜欢

转载自blog.csdn.net/weixin_44651073/article/details/125830189