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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值