首页 > 其他分享 >关于STM32CAN通信中过滤器两种模式的配置

关于STM32CAN通信中过滤器两种模式的配置

时间:2022-12-21 18:00:50浏览次数:41  
标签:16 32 通信 掩码 寄存器 过滤器 STM32CAN ID

一、关于问题的阐述:最近在完善vesc的CAN通信相关代码,在配置过滤器时碰到了问题。

  1.1 对过滤器的两种模式理解不全面

    1.1.1 关于过滤器的掩码模式。当时由于学习较浅,始终没有认真学习,主要是不太清楚两个32位的标识符寄存器(CAN_FxR1和CAN_FxR2)中每个位置究竟存放着什么。比如我的11位的标准ID在32位寄存器中的存放位置?现在终于得到解决。

    1.1.2 关于过滤器的列表模式。这个的问题主要是出在手上现有的一套祖传代码。这里有一个很迷惑的左移5位的位操作,导致我一直对列表模式不解,现在也得到解决。

                                         

 

  1.2 关于vesc中使用的扩展ID在过滤器中配置。

二、解决问题前的知识学习

  2.1 CAN的过滤器组

    2.1.1 stm32中,CAN共有14个过滤器组,28个32位过滤过滤器,输入值对应为0~27(若同时使用CAN1和CAN2,一般CAN1为0-13,CAN2为14-27),其中每个过滤器组的结构如下。每个过滤器组包含2个32位的寄存器,分别为CAN_FxR0和CAN_FxR1(x=0,1,2....13),它们用来存储要筛选的ID或者掩码。下文中引用的图中FSCx=1代表寄存器的长度(位宽)为32位,FSCx=0代表寄存器的长度为16位。FBMx用来标识过滤器是列表还是掩码模式。

      注:当前图中结构是位宽为32位。

                             

    2.1.2 对上图的详细解读:在掩码模式下:

      (1)过滤器第0位保留空白。

      (2)从第3位开始为扩展ID的第0位,EXTID共18位,STID共11位。

      (3)过滤器高16位中后5位为扩展ID

  2.2 CAN屏蔽两种模式

    2.2.1 列表模式:

      (1)当过滤器的位宽为16时:上图中的两个32位寄存器全部用来存放需要过滤的ID(此时上图中的“映像”标识无用)。一个过滤器组共能存放4个,分别为CAN_FxR1和CAN_FxR1的高16位和低16位。只要收到的ID与过滤器组中的某一个ID匹配即可。(只能过滤标准帧)

      (2)当过滤器的位宽为32时:一个过滤器组共能存放2个ID。

      (3)位宽:即配置的寄存器的位数:

    2.2.2 掩码模式:

      (1)当过滤器位宽为32时:一个32位寄存器CAN_FxR0存放要过滤的ID(位置要与上图中的“映像”标识相匹配),另一个32位寄存器CAN_FxR1中的0和1表示接收到的报文是否要与CAN_FxR0中对应位置匹配,0为不要求匹配,1为要求匹配。

      (2)当过滤器位宽为16时:也是只能过滤标准帧,但遵循格式见下图。

                                                                          

三、问题的解决

  3.1 关于掩码模式中存放要过滤的ID。(这里只谈寄存器位宽为32位下的情况

    3.1.1 若我们要存放的是扩展ID:

      

 

 

       解释:id<<3是因为我们的过滤器位置要匹配(见2.1.1中图,前三位分别为0、RTR、IDE),所以在此左移3位。位操作就不用详说了。

    3.1.2 若我们要存放的是标准ID:

      

      解释:std_id<<5是因为 2.1.1中图,寄存器高16位中,后5位为扩展ID,所以要左移5位。(可见2.1.2中(3)的说明)

    3.1.3 关于对应掩码寄存器中的配置:

  3.2 关于列表模式中存放要过滤的ID。(这里只谈寄存器位宽为16位下的情况

    由2.2.2中的表格可知,我们要把标准ID左移5位放入才可。见下图

          

 

               

标签:16,32,通信,掩码,寄存器,过滤器,STM32CAN,ID
From: https://www.cnblogs.com/chfanyang/p/16996836.html

相关文章

  • Ubuntu18.04下调用fastdds实现通信
    提纲1、编写idl2、fastddsgen生成cpp的源代码文件3、编译生成可执行文件4、执行可执行文件完成通讯1、编写idl现在我们可以编写一个简单的IDL:2、fastddsgen生......
  • 16【TCP、UDP、网络通信】
    上一篇:​​15【IO流增强】​​下一篇:​​17【测试单元、反射、注解、Lombok插件】​​目录:​​【JavaSE零基础系列教程目录】​​文章目录​​16【TCP、UDP、网络通信】​......
  • 1003.模板变量及模板过滤器
    一、模板路径总结1.DIRS定义一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。将templates放在主项目目录下;2.APP_DIRS告诉模板引擎是否应该进入每个已安......
  • m无线通信的调制解调过程的matlab仿真,包括ASK,FSK,PSK
    1.算法概述      传输模拟信号时一样,传输数字信号时也有三种基本的调制方式:幅移键控(ASK)、频移键控(FSK)和相移键控(PSK)。它们分别对应于用载波(正弦波)的幅度、频......
  • 北汇信息与臻融科技达成战略合作,共同推进分布式通信技术在汽车领域的应用
      南京臻融科技有限公司(简称瑧融科技)是从事中间件研发的创新型国家高新技术企业,拥有多项具有完全自主知识产权的核心技术和中间件产品,在网络化计算、中间件平台、云边......
  • m无线通信的调制解调过程的matlab仿真,包括ASK,FSK,PSK
    1.算法概述传输模拟信号时一样,传输数字信号时也有三种基本的调制方式:幅移键控(ASK)、频移键控(FSK)和相移键控(PSK)。它们分别对应于用载波(正弦波)的幅度、频率和相位来传递......
  • vue组件间通信
    使用props和$emit实现父子组件通信首先在父组件中使用这个:<children:listdata='listdata'/>然后就可以在子组件的props中拿到使用pubsub实现任意组件通信需要下载......
  • Condition-线程通信更高效的方式
     那么引入本篇的主角,Condition,Condition将Object监视器方法(wait、notify和notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提......
  • linux网络编程-进程间通信——信号
    信号是进程间通信的方式之一,进程之间通过发送和接收不同的值来通信,这些不同的值被标示为各种信号。我们使用kill指令杀死一个进程,本质上是kill这个程序给对应的进程发送了......
  • Axios异步通信
    四.Axios异步通信1什么是Axios?Axios是一个类库,基于Promise管理的HTTP库,是前端通信框架,可以用在浏览器和node.js中。axios实现了对ajax的封装,常用于Ajax请求。注解......