STM32 CAN总线标识符过滤器难点解析

原创 2016年05月31日 15:12:24
  • 4910
CAN总线是目前应用非常多的一种总线,在汽车电子,航空航天中应用广泛,博主用的是战舰的STM32开发板。CAN的介绍和功能特点就不讲了,书本上网上都有,请大家在阅读本文前了解CAN总线协议的特点和功能。今天博主将和大家共同学习CAN总线标识符过滤器的使用(非常重要!)
      请认真读这段话(来自STM32中文参考手册):在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接受者。节点在接收报文时,根据标识符的值,决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就丢弃,且无需软件的干预。在,STM32F103ZET6这款芯片中,bxCAN控制器为应用程序提供了14个位宽可变的,可配置的过滤器组(13~0),以便只接受那些软件需要的报文。硬件过滤的做法节省了CPU的开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

有些读者看了之后觉得,报文,标识符,过滤器,他们是什么?他们有什么联系?有这些问题说明你就要懂了。。别急,听我慢慢道来~~~
      过滤器:过滤器在接收时使用,在发送时不需配置过滤器!过滤器会根据标识符而决定节点要不要发送者发过来的报文。通俗一点:是我想要的,我就要;不是我想要的,我就不要。

报文:报文(MESSAGE)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,期长短不一致,长度不限且可变。注意(这里才是重点!):报文也是网络传输的单位,传输过程中会不断的封装成分组,包,帧来传输,封装的方式就是加一些信息段,那些就是报文头以一定格式组织起来的数据。

这里补充一点:CAN总线上的报文传输由4个不同的帧类型表示和控制。1、数据帧 2、远程帧 3、错误帧 4、过载帧。接着看下文:

  • 在报文传输时,不同帧有不同的而传输结构(例如数据帧有7个段构成,帧起始,仲裁段,控制端,数据段,CRC段,ACK段,帧结束),只有严格按照该帧的结构进行帧的传输,才能被节点正确的接收和发送。
  • 另外,在数据帧和遥控帧有标准格式和扩展格式两种格式,标准格式有11位的标识符,扩展格式有29位的标识符。如下图:

标识符:标识符主要包括如下,也可以理解为仅包含ID号,但是在这里下面这些都是要包含的:

  • 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
  • 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

例如在数据帧和远程帧中,标识符都是包含在里面的,而数据帧和远程帧是报文的一种表示类型。故,发送端发帧数据给接收端后,接收端根据标识符来进行筛选,决定取舍。

看完上面三个定义,再回头看上面那段话应该没有问题了吧~

下面重点介绍过滤器:

STM32提供两种过滤器模式供用户选择,屏蔽位模式(标识符屏蔽位模式)和标识符列表模式。上图:

屏蔽位模式:

在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”和“不用关心”处理。

标识符列表模式:

在标识符列表模式下,屏蔽寄存器也被当做标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是采用两个标识符寄存器。接收报文的每一位都必须跟过滤器标识符相同。

标识符列表模式很好理解:就是指过滤器寄存器的所有位都用来过滤,也就是说,发送端发送的标识符所有的位必须和接收端的过滤器的寄存器定义的一模一样,有一个为不同,都拒收次消息!

而屏蔽位模式稍微复杂一点,但也好理解:举个简单的例子,我们过滤器组0工作在:1个32位过滤器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中,存放到CAN_F0R1的值是期望收到的ID,即我们希望收到的映像(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位[31:24]和位[15:8]这16个位,必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不必关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。也就是说,屏蔽位(CAN_F0R2)中的数值:

1:必须匹配,到来的标识符位必须和过滤器对应的标识符寄存器位相一致。

0:不关心,可以一样,也可以不一样,都认为是正确的ID

因此:

为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式

为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式

注意:应用程序不用的过滤器组,应该保持在禁用模式。(这个很好理解)
最后关于CAN的发送和接收流程,这个可以看看手册上的流程图,讲的很详细。

STM32 CAN总线标识符过滤器难点解析的更多相关文章

  1. 关于STM32的CAN的过滤器

    关于STM32的CAN的过滤器STM32普通型芯片的CAN有14组过滤器组,互联型有28组过滤器组.一般我们用的都是普通型的,所以在本文中可以说STM32有14组过滤器组.根据配置,每1组过滤器组可以 ...

  2. .NET_RSA加密全接触(重、难点解析)

    .NET_RSA加密全接触(重.难点解析) .NET Framework提供了两个类供我们使用RSA算法,分别是:用于加密数据的RSACryptoServiceProvider和用于数字签名的DSAC ...

  3. STM32——CAN总线过滤器设置

    STM32CAN控制器每个筛选器组由两个32位的寄存器组成. 根据所需位宽的不同,各个筛选器可配置成16位或32位模式(如下图,当FSCx=1为32位模式,FSCx=0时为16位模式).同时,筛选器的 ...

  4. 【转】STM32 FSMC总线深入研究

    原文:http://group.chinaaet.com/116/48112 由于CPU与FPGA通信的需要,以及对8080总线的熟悉,首选采用了STM32的FSMC总线,作为片间通信接口.FSMC能 ...

  5. STM32——CAN总线波特率和位时序详解

    本人用的单片机是STM32F407,其它型号的单片机类似,可做参考! 一.标准CAN协议位时序概念 由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间 ...

  6. 笔记:stm32 printf重定向到UART疑点解析

    在调试过程中往往需要通过打印来看系统运行状态:在STM32平台上,打印重定向有多种实现方案:其一是编译时使用keil自带的MacroLIB,据说这个库对一些C语言基础设施做了新的实现,代码结构更加紧凑 ...

  7. 中间件(WAS、WMQ)运维 9个常见难点解析

    本文由社区中间件达人wangxuefeng266.ayy216226分享整理,包括WAS.WMQ在安装.巡检.监控.优化过程中的常见难点. 安装 1.was 负载均衡的机制的粘连性,was负载均衡异常 ...

  8. Django模版中的过滤器详细解析 Django filter大全

    就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法. 过滤器看起来是这样的: {{ name|lower }} 显示的内容是变量 {{ name }} 被过滤器 lower 处 ...

  9. 百度DMA+小度App的蓝牙语音解决方案技术难点解析

    前记   你平时在商场看到的语音助手,看起来非常的简单,其实,这个小小语音助手的背后,是一个非常的复杂的技术支撑.从前端到后端的技术依次是:前端语音降噪技术,高效的音频编解码技术,蓝牙双模技术,DMA ...

随机推荐

  1. 回调地狱以及用promise怎么解决回调地狱

    哈哈哈,我又又又回来了,不好意思,最近枸杞喝的比较到位,精力比较旺盛. 现在我们来聊一聊啥是回调地狱,注意是回调地狱啊   不是RB人民最爱拍的那啥地狱啊,来吧,上车吧少年,这是去幼儿园的车 都让开, ...

  2. 转 .md即markdown文件的基本常用编写语法(图文并茂)

    原文链接:.md即markdown文件的基本常用编写语法(图文并茂) 序言: 很久没有写博客了,感觉只要是不写博客,人就很变得很懒,学的知识点感觉还是记不住,渐渐地让我明白,看的越多,懂的越少(你这话 ...

  3. CountDownTimer 源码分析

    倒计时的功能,比如说:发送短信验证码倒计时. public class CountDownTimerActivity extends Activity { private Button mSend; ...

  4. View的layout机制

    View框架的工作流程为:测量每个View大小(measure)-->把每个View放置到相应的位置(layout)-->绘制每个View(draw). 源代码分析 在View的源代码中, ...

  5. [Android] 布局优化技巧

    看了一些关于优化布局的资料,了解了很多平时不怎么注意的问题,于是把资料整理了一下,一部分内容是翻译来的,一部分是自己理解加上的.每部分内容都有demo,有些资料里的demo比较好的,我就直接拿来用了: ...

  6. HttpServletRequest的使用

    当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest对象,使用这个对象可以取得所有HTTP请求中的信息,可以在Servlet中进行处理,也可以转发给其 ...

  7. BaseDAL最牛数据层基类2

    using System; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using Syste ...

  8. 使用GitHub-Pages创建博客和图片上传问题解决

    title: 使用GitHub Pages创建博客和图片上传问题解决 date: 2017-10-22 20:44:11 tags: IT 技术 toc: true 搭建博客 博客的搭建过程完全参照小 ...

  9. [zz]VC2005-应用程序正常初始化失败-0xc0150002

    最近几天被这个问题困惑了许久. 不禁感叹微软的东东真是越做越烂了,也终于明白了时隔12年大家仍然死守VC6的原因.. 用VC2005编译的程序,编译时没有任何错误,但是运行时就是提示“应用程序正常初始 ...

  10. leveldb源码阅读

    http://blog.csdn.net/sparkliang/article/details/8567602 http://brg-liuwei.github.io/tech/2014/10/15/ ...