GD32 CAN滤波器设置

这篇具有很好参考价值的文章主要介绍了GD32 CAN滤波器设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、CAN简介

CAN(Controller Area Network)总线是一种可以在无主机情况下实现微处理器或者设备之间
相互通信的总线标准。
CAN 总线控制器作为 CAN 网络接口,遵循 CAN 总线协议 2.0A 和 2.0B。 CAN 总线控制器可
以处理总线上的数据收发并具有 28 个过滤器, 过滤器用于筛选并接收用户需要的消息。 用户
可以通过 3 个发送邮箱将待发送数据传输至总线, 邮箱发送的顺序由发送调度器决定。并通过
2 个深度为 3 的接收 FIFO 获取总线上的数据,接收 FIFO 的管理完全由硬件控制。 同时 CAN
总线控制器硬件支持时间触发通信(Time-trigger communication) 功能。

2、CAN掩码模式下滤波器设置

      2.1标准帧滤波器分析

一个待接收的数据帧会根据其标识符(Identifier)进行过滤:硬件会将通过过滤的帧送至接收FIFO, 并丢弃没有通过过滤器的帧。标准帧ID为11位(0x000-0x7FF),假设在32位掩码模式下,标准帧的过滤功能原理如下(基于GD32标准固件库):按图4原理要求,预设标识符(list_high和list_low:0x05FF 0000)左移5位后被填写进FxDATA0寄存器中,掩码(0xE000 0004)被填入FxDATA1中,通过过滤器0后绑定到FIFO1。即高16位0x5FF左移5位后填进FxDATA0高16位(0xBFE0),故FxDATA0[31:21]位是:1011 1111 111;同理,32位掩码高16位0x700左移5位, FxDATA1[31:21]位是:1110 0000 000;因此对于CAN接收的标准帧ID的第11位,第10位,第9位满足101即可通过该滤波器被CAN FIFO1接收.

因此0x500-0x5FF均可通过该滤波器,配置代码已附注,滤波器0的寄存器值如图5。区别于扩展帧,标准帧仅需关注SFID[10:0]即可

can滤波器怎么设置,单片机,嵌入式硬件

图4 32-bit 位宽掩码模式过滤器

  /* initialize filter */   

    can_filter.filter_mode = CAN_FILTERMODE_MASK;

    can_filter.filter_bits = CAN_FILTERBITS_32BIT;

    can_filter.filter_list_high = 0x5FF<<5;

    can_filter.filter_list_low = 0x0000;

    can_filter.filter_mask_high = (0x700 << 5) ;

    can_filter.filter_mask_low = (1U << 2);   

    can_filter.filter_fifo_number=CAN_FIFO1;  

    can_filter.filter_enable = ENABLE;

    can_filter_init(&can_filter);

注:在标准帧掩码模式下,FF为要置1,即“can_filter.filter_mask_low = (1U << 2);”

can滤波器怎么设置,单片机,嵌入式硬件

                                               图5 滤波器0的寄存器值

        2.2扩展帧滤波器分析

扩展帧ID为29位(0x0000 0000-0x1FFF FFFF),假设在32位掩码模式下,扩展帧的过滤功能原理如下(基于GD标准固件库):按图4原理要求,预设标识符(list_high和list_low:0x501E 0004)被填写进FxDATA0寄存器中,掩码(0xFFFF FF84)被填入FxDATA1中,通过过滤器0后绑定到FIFO1。需注意,扩展帧需要匹配SFID[10:0]和EFID[17:0]。故 FxDATA0[31:3]位是:0101 0000 0001 1110 0000 0000 0000 0;同理, FxDATA1[31:3]位是:1111 1111 1111 1111 1111 1111 1111 0

因此对于CAN接收的扩展帧ID的前28位必须满足0 1010 0000 0011 1100 0000 0000,第29位不关注,满足该条件即可通过该滤波器被CAN FIFO1接收,即0x0a03c000-0x0a03c00f均可通过该滤波器,配置代码已附注,滤波器0的寄存器值如图6,扩展帧匹配需关注SFID[10:0]+EFID[17:0]

    can_filter.filter_mode = CAN_FILTERMODE_MASK;

    can_filter.filter_bits = CAN_FILTERBITS_32BIT;

    can_filter.filter_list_high =(uint16_t)(0x0a03c000 >> 13);

    can_filter.filter_list_low = (uint16_t)(((uint16_t)0x0a03c000<<3)|(1U<< 2));

    can_filter.filter_mask_high =(uint16_t)(0x1ffffff0>>13);

    can_filter.filter_mask_low =(uint16_t)(((uint16_t)0x1ffffff0<<3)|(1U << 2));    

    can_filter.filter_fifo_number = CAN_FIFO1;

    can_filter.filter_enable = ENABLE;

    can_filter_init(&can_filter);

can滤波器怎么设置,单片机,嵌入式硬件

图6 滤波器0的寄存器值

注:在扩展帧掩码模式下,FF为要置1,即“can_filter.filter_mask_low = (1U << 2);对应的FxDATA0位也要置1,详情参见代码。

3CAN列表模式滤波器设置

      3.1标准帧滤波器分析

在32位列表模式下,标准帧的过滤功能原理如下(基于GD标准固件库):按图7原理要求,预设标识符1(list_high和list_low:0x04C6 0000)左移5位后被填写进FxDATA0寄存器中,预设标识符2(Msak_high和Mask_low:0x0700 0000)被填入FxDATA1中,通过过滤器0后绑定到FIFO1。故 FxDATA0[31:21]位是:1001 1000 110(0x4C6);同理, FxDATA1[31:21]位是:1110 0000 000(0x700)

因此对于CAN接收的标准帧ID是预设标识符1(0x4C6)或者预设标识符2(0x700)即可通过该滤波器被CAN FIFO1接收,配置代码已附注。区别于扩展帧,标准帧仅需关注SFID[10:0]即可

can滤波器怎么设置,单片机,嵌入式硬件

图7 32-bit 位宽列表模式过滤器

    can_filter.filter_mode = CAN_FILTERMODE_LIST;

    can_filter.filter_bits = CAN_FILTERBITS_32BIT;

    can_filter.filter_list_high =0x4C6 << 5;

    can_filter.filter_list_low =0x0000;

    can_filter.filter_mask_high =0x700 << 5;

    can_filter.filter_mask_low =0x0000;   

    can_filter.filter_fifo_number = CAN_FIFO1;

    can_filter.filter_enable = ENABLE;

    can_filter_init(&can_filter);

3.2扩展帧滤波器分析

在32位列表模式下,扩展帧的过滤功能原理如下(基于GD标准固件库):按图7原理要求,预设标识符1(list_high和list_low:0x0CF0 0400)右移13位后取高16位,左移3位后取低16位,填写进FxDATA0寄存器中,预设标识符2(Msak_high和Mask_low: 0x18FE E900)被填入FxDATA1中,通过过滤器0后绑定到FIFO0。故 FxDATA0[31:3]位是:0110 0111 1000 0000 0010 0000 0000 0 (0x0CF0 0400);同理, FxDATA1[31:21]位是:0001 1000 1111 1110 1110 1001 0000 0 (0x18FE E900)

因此对于CAN接收的扩展帧ID是预设标识符1(0x0CF0 0400)或者预设标识符2(0x18FE E900)即可通过该滤波器被CAN FIFO1接收,配置代码已附注。扩展帧匹配需关注SFID[10:0]+EFID[17:0]

   can_filter.filter_mode = CAN_FILTERMODE_LIST;

    can_filter.filter_bits = CAN_FILTERBITS_32BIT;

    can_filter.filter_list_high =(uint16_t)(0x0CF00400 >> 13);

    can_filter.filter_list_low =(uint16_t)(((uint16_t)0x0CF00400 << 3) | (1U << 2)); 

    can_filter.filter_mask_high =(uint16_t)(0x18FEE900 >> 13);  

    can_filter.filter_mask_low =(uint16_t)(((uint16_t)0x18FEE900 << 3) | (1U << 2));   

    can_filter.filter_fifo_number = CAN_FIFO1;

    can_filter.filter_enable = ENABLE;

    can_filter_init(&can_filter);

4、16位CAN列表模式滤波器设置和掩码模式原理和32位一致,不再赘述,对于16位掩码模式可通过4符合条件的帧ID,16位列表模式可通过4符合条件的帧ID,此外如果客户想要绑定多个滤波器,可以将配置过程封装成一个函数。

注:该篇文章滤波器设置适用GD32F10x、GD32F30x、GD32F4xx、GD32E50x等,具体细节差异欢迎留言或私信。文章来源地址https://www.toymoban.com/news/detail-526622.html

到了这里,关于GD32 CAN滤波器设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-3+4

    本文仅供学习使用 本文参考: B站:DR_CAN

    2024年01月20日
    浏览(49)
  • Matlab设置滤波器

    一.matlab滤波器的设计 1.首先打开App,从里面找到滤波器设计工具,或者在命令行输入fadtool打开滤波器设计工具    ResponseType用于选择低通、高通、带通、带阻等类型, 这里选择低通滤波“Lowpass”。图中Design Method用于选择IIR滤波器还是FIR滤波器,这里我们选择IIR滤波器,类型

    2024年02月14日
    浏览(38)
  • STM32 FIR实时数字滤波器实现

    首先是生成不同周期的正弦波:         由于定时器设置为250us进入一次中断,每秒可进入中断4000次,为了生成25HZ的正弦信号,一个周期内生成160个数据;为了生成200HZ的正弦信号,一个周期内生成20个数据,故代码如下:     sin_1=arm_sin_f32(3.141592654*i/80)+1;//25HZ 信号   

    2024年02月14日
    浏览(43)
  • STM32 FIR滤波器使用要点,STM32 DSP篇

    STM32搭配的CMSIS的DSP库已经写好了FIR,我们做的就是用好用稳定! 2.1使用MATLAB的Filter Designer生成滤波器的参数(直接在MATLAB命令中输入filterDesigner即可调出此工具,配置好参数后,选择Targets-Generate C header) 2.2调用arm_fir_init_f32或arm_fir_init_q31或arm_fir_init_q15等等视实际使用情况而

    2024年02月14日
    浏览(42)
  • GD32F30x系列---CAN通信收发配置

    GD32F30x系列CAN通信配置: 先找到CAN模块时钟时挂载在APB1总线上的,如下图所示: APB1总线的最大频率为60MHz,如下图所示: 根据总线频率可以计算出对应波特率的配置BS1,BS2等; 如果不会计算的话也可以直接使用工具,如下图所示: 这里工具会直接帮你你计算好BS1、BS2、P

    2024年01月19日
    浏览(98)
  • RT-Thread GD32F4xx CAN驱动

      在RT-Thread的bsp文档中没有找到GD32F4xx的CAN驱动文件,此处参考STM32的drv_can编写CAN驱动。

    2024年02月02日
    浏览(48)
  • 使用C++设计滤波器(低通滤波器,高通滤波器,带通滤波器)

    以下是一个使用C++语言编写的基本低通滤波器的示例代码,它可以对输入信号进行滤波以降低高频成分: 在这个示例中,我们使用一个一阶滤波器来实现低通滤波器。该滤波器具有一个截止频率,所有高于该频率的信号成分都会被过滤掉。在构造函数中,我们根据采样率和截

    2024年02月11日
    浏览(38)
  • python实现陷波滤波器、低通滤波器、高斯滤波器、巴特沃斯滤波器

    在一幅图像中,其低频成分对应者图像变化缓慢的部分,对应着图像大致的相貌和轮廓,而其高频成分则对应着图像变化剧烈的部分,对应着图像的细节(图像的噪声也属于高频成分)。 低频滤波器,顾名思义,就是过滤掉或者大幅度衰减图像的高频成分,让图像的低频成分

    2024年02月11日
    浏览(41)
  • 高通滤波器,低通滤波器

    1.高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。   确实容易看出,第三种效果最好。 2. 使用medianBlur()作为模糊函数,它对去除数字化的视频噪声非常有效。  从BGR色彩空间转灰度色彩空间   使用Laplacian()作为边缘检测函数,它会产生明显的边缘线条 

    2024年02月14日
    浏览(34)
  • 【图像处理:频率域平滑与锐化】理想滤波器,巴特沃思滤波器,高斯滤波器

    本文主要介绍频率域滤波器,此处的频率域是基于傅立叶变换得出。 在一幅图像中, 低频对应图像变化缓慢的部分 ,即图像大致外观和轮廓。 高频部分对应图像变化剧烈的部分即图像细节 。低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包