[研电赛技术支持] GD32 CAN过滤器配置

[复制链接]
 楼主| 荣陶陶 发表于 2025-5-13 12:11 | 显示全部楼层 |阅读模式
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 设置无效。

13303682292deb9ba5.png

在图片的低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

磨砂 发表于 2025-6-3 14:43 | 显示全部楼层
GD32 CAN过滤器是GD32微控制器中用于CAN总线通信的重要功能模块,主要用于筛选接收的CAN报文,确保只有符合预设条件的数据帧被处理
晓伍 发表于 2025-6-3 17:10 | 显示全部楼层
can过滤器过滤不需要的CAN报文,减少CPU负载,提高通信效率
八层楼 发表于 2025-6-3 19:34 | 显示全部楼层
非CL系列有14个过滤器 CL系列有28个过滤器
观海 发表于 2025-6-3 21:52 | 显示全部楼层
每个过滤器单元包含2个寄存器,可配置为32位或16位模式
guanjiaer 发表于 2025-6-4 07:58 | 显示全部楼层
通过[size=0.875]CAN_FxDATA0设置预设标识符,[size=0.875]CAN_FxDATA1设置掩码值,指定哪些位需要匹配
heimaojingzhang 发表于 2025-6-4 10:30 | 显示全部楼层
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


keaibukelian 发表于 2025-6-4 12:53 | 显示全部楼层
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);          // 应用过滤器配置


paotangsan 发表于 2025-6-4 15:28 | 显示全部楼层
结合发送邮箱的优先级功能,实现关键数据的优先传输
renzheshengui 发表于 2025-6-4 17:55 | 显示全部楼层
GD32 CAN过滤器通过灵活的掩码和列表模式,支持多级筛选,适用于复杂CAN网络环境
wowu 发表于 2025-6-4 20:18 | 显示全部楼层
我们需要注意过滤器编号与硬件资源的对应关系
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

210

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

50

主题

210

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部