GD32 CAN过滤器配置
can_filter.filter_number = 0;can_filter.filter_mode = CAN_FILTERMODE_MASK;
can_filter.filter_bits = CAN_FILTERBITS_32BIT;
can_filter.filter_list_high = ((0X0757A800<<3)&0XFFFF0000)>>16;
can_filter.filter_list_low = (uint16_t)((0X0757A800<<3)|(4)&0XFFFF);
can_filter.filter_mask_high = 0XFFFF;
can_filter.filter_mask_low = (uint16_t)(0XFF00<<3);
can_filter.filter_fifo_number = CAN_FIFO0;
can_filter.filter_enable = ENABLE;
can_filter_init(&can_filter);
can_filter.filter_number = 1;
can_filter.filter_mode = CAN_FILTERMODE_LIST;
can_filter.filter_bits = CAN_FILTERBITS_32BIT;
can_filter.filter_list_high = ((0X0757A900<<3)&0XFFFF0000)>>16;
can_filter.filter_list_low = (uint16_t)((0X0757A900<<3)|(4)&0XFFFF);
can_filter.filter_mask_high = 0;
can_filter.filter_mask_low = 0;
can_filter.filter_fifo_number = CAN_FIFO0;
can_filter.filter_enable = ENABLE;
can_filter_init(&can_filter);
AI写代码
c
运行
对于过滤器0,设置掩码模式,配置为扩展帧ID,接收范围0X0757A800到0X0757A8FF,低8位可以为任意值,由filter_mask_high 和filter_mask_low决定 。对于过滤器1,设置列表模式,配置为扩展帧ID,只能接收0X0757A900这个ID,filter_mask_high 和filter_mask_low 设置无效。
在图片的低3位,FF:1表示扩展帧,0表示标准帧。FT:1表示遥控帧,0表示数据帧。所以过滤数据ID值和掩码值需要左移3位,然后在filter_list_low 加4,表示扩展帧,按道理filter_mask_low 也要加4,但是我没加,也可以达到目的。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_45449075/article/details/147889796
GD32 CAN过滤器是GD32微控制器中用于CAN总线通信的重要功能模块,主要用于筛选接收的CAN报文,确保只有符合预设条件的数据帧被处理 can过滤器过滤不需要的CAN报文,减少CPU负载,提高通信效率 非CL系列有14个过滤器 CL系列有28个过滤器
每个过滤器单元包含2个寄存器,可配置为32位或16位模式
通过CAN_FxDATA0设置预设标识符,CAN_FxDATA1设置掩码值,指定哪些位需要匹配
can_parameter_struct can_init_param;
can_init_param.working_mode = CAN_NORMAL_MODE; // 正常模式
can_init_param.prescaler = 12; // 分频系数
can_init(CAN0, &can_init_param); // 初始化CAN0
can_filter_parameter_struct can_filter_param;
can_filter_param.filter_number = 0; // 过滤器编号(0~27)
can_filter_param.filter_mode = CAN_FILTERMODE_MASK; // 掩码模式
can_filter_param.filter_bits = CAN_FILTER_BITS_32BIT; // 32位模式
can_filter_param.filter_list_high = 0x000; // 预设ID高16位(如标准帧)
can_filter_param.filter_list_low = 0x000; // 预设ID低16位
can_filter_param.filter_mask_high = 0x7FF; // 掩码高16位(匹配ID前11位)
can_filter_param.filter_mask_low = 0xFFFF; // 掩码低16位(全匹配)
can_filter_init(&can_filter_param); // 应用过滤器配置
结合发送邮箱的优先级功能,实现关键数据的优先传输
GD32 CAN过滤器通过灵活的掩码和列表模式,支持多级筛选,适用于复杂CAN网络环境
我们需要注意过滤器编号与硬件资源的对应关系
页:
[1]