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
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于GD32F3xx系列芯片的CAN初始化配置及注释示例: ```c #include "gd32f3xx.h" void CAN_Configuration(void) { /* 使能CAN时钟 */ rcu_periph_clock_enable(RCU_CAN0); /* 配置CAN GPIO */ gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8 | GPIO_PIN_9); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9); gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_8 | GPIO_PIN_9); /* CAN 初始化 */ can_deinit(CAN0); can_struct_para_init(&can_init_struct); /* 定义CAN时钟分频 */ can_init_struct.can_frequency = 36000000U; /* 定义CAN位速率 */ can_init_struct.can_tx_sjw = CAN_SJW_1TQ; can_init_struct.can_rx_sjw = CAN_SJW_1TQ; can_init_struct.can_bs1 = CAN_BS1_13TQ; can_init_struct.can_bs2 = CAN_BS2_2TQ; /* 定义过滤器 */ can_filter_struct_para_init(&can_filter_init_struct); /* 过滤器模式 */ can_filter_init_struct.can_filter_bits = CAN_FILTERBITS_32BIT; /* 过滤器ID */ can_filter_init_struct.can_filter_id_high = 0x0000; can_filter_init_struct.can_filter_id_low = 0x0000; /* 过滤器掩码 */ can_filter_init_struct.can_filter_mask_id_high = 0x0000; can_filter_init_struct.can_filter_mask_id_low = 0x0000; /* 过滤器FIFO */ can_filter_init_struct.can_filter_fifo_number = CAN_FIFO0; /* 过滤器使能 */ can_filter_enable(CAN0, 0); /* CAN 初始化 */ can_init(CAN0, &can_init_struct); /* 配置CAN中断 */ nvic_irq_enable(CAN0_RX0_IRQn, 0, 0); can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0); /* 启动CAN */ can_enable(CAN0); } ``` 注释: 1. `rcu_periph_clock_enable(RCU_CAN0)`:使能CAN时钟 2. `gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8 | GPIO_PIN_9)`:配置CAN相关GPIO为复用功能 3. `gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_8 | GPIO_PIN_9)`:配置CAN相关GPIO复用功能为CAN 4. `can_deinit(CAN0)`:复位CAN控制器 5. `can_init_struct`:CAN初始化结构体,使用`can_struct_para_init`函数初始化为默认值 6. `can_init_struct.can_frequency = 36000000U`:定义CAN时钟分频 7. `can_init_struct.can_tx_sjw = CAN_SJW_1TQ`:定义CAN发送同步跳转宽度 8. `can_init_struct.can_rx_sjw = CAN_SJW_1TQ`:定义CAN接收同步跳转宽度 9. `can_init_struct.can_bs1 = CAN_BS1_13TQ`:定义CAN位时间段1的时间长度 10. `can_init_struct.can_bs2 = CAN_BS2_2TQ`:定义CAN位时间段2的时间长度 11. `can_filter_init_struct`:CAN过滤器结构体,使用`can_filter_struct_para_init`函数初始化为默认值 12. `can_filter_init_struct.can_filter_bits = CAN_FILTERBITS_32BIT`:定义过滤器模式 13. `can_filter_init_struct.can_filter_id_high`:定义过滤器ID高位 14. `can_filter_init_struct.can_filter_id_low`:定义过滤器ID低位 15. `can_filter_init_struct.can_filter_mask_id_high`:定义过滤器掩码高位 16. `can_filter_init_struct.can_filter_mask_id_low`:定义过滤器掩码低位 17. `can_filter_init_struct.can_filter_fifo_number = CAN_FIFO0`:定义过滤器FIFO 18. `can_filter_enable(CAN0, 0)`:使能过滤器 19. `can_init(CAN0, &can_init_struct)`:初始化CAN控制器 20. `nvic_irq_enable(CAN0_RX0_IRQn, 0, 0)`:使能CAN中断 21. `can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0)`:使能CAN接收中断 22. `can_enable(CAN0)`:启动CAN控制器

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肖爱Kun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值