CAN接收报文并过滤之标识符过滤:(重点、难点)

  在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
  为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。这两个寄存器用途在下面有大用处;

可变的位宽: 

  每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:

    1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位===用于扩展ID(28位)和标准ID(11位)

    2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位====只用于标准ID

    可参见图126

  此外过滤器可配置为,屏蔽位模式和标识符列表模式。

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

  标识符列表模式

    在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用1个标识符加1个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须

  跟过滤器标识符相同。

  BxCAN过滤器的编号

    在stm32中,过滤器编号用于加速CPU对收到报文的处理。当受到一个有效报文时,BxCAN会将收到的报文以及它所通过的过滤器编号,一起存入邮箱中。当CPU处理时,可以根据过滤器编号,快速地知道该报文的用途,从而做出处理。其实,不用过滤器编号也是可以的,这时CPU就要分析所收到报文的标识符,从而知道报文的用途。由于标识符所含的信息较多,处理起来就相对慢一些;

  

报文存储 

  邮箱是软件和硬件之间关于报文的接口。邮箱包含了所有跟报文有关的信息:标识符、数据、控制、状态和时间戳信息。

  发送邮箱
    软件需要在一个空的发送邮箱中,把待发送报文的各种信息设置好(然后再发出发送的请求)。发送的状态可通过查询CAN_TSR寄存器获知。

  接收邮箱(FIFO)    

    在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置1,来释放该报文,以便为后面收到的报文留出存储空间。过滤器匹配序号存放在CAN_RDTxR寄存器的FMI域中。16位的时间戳存放在CAN_RDTxR寄存器的TIME[15:0]域中。

  

    邮箱中保存的是完整的报文信息;解析邮箱参见手册;

时间特性:(涉及波特率的计算)

  位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步,及通过跟后面的边沿进行重新同步,来调整其采样点。它的操作可以简单解释为,如

下所述把名义上的每位的时间分为3段:

  同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x tCAN)。

  时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
   时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。

重新同步跳跃宽度(SJW)定义了,在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。 

stm32之CAN发送、接收详解的更多相关文章

  1. STM32接口FSMC/FMC难点详解

    STM32接口FSMC/FMC难点详解 转载   http://blog.sina.com.cn/s/blog_808bca130102x94k.html STM32F767的FMC将外部存储器划分为 ...

  2. STM32开发 -- 4G模块开发详解(转)

    STM32开发 -- 4G模块开发详解(1) STM32开发 -- 4G模块开发详解(2) STM32开发 -- 4G模块开发详解(3) STM32开发 -- 4G模块开发详解(4)

  3. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

  4. STM32的时钟树深入详解以及RCC配置

    在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT ...

  5. JavaMail使用SMTP协议发送电子邮件(详解)

    Properties props = new Properties(); props.setProperty("mail.transport.protocol", "sm ...

  6. STM32时钟初始化函数SystemInit()详解【转】

    花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出): 使用的是3.5的库,用的是STM32F107VC,开发环境RVM ...

  7. 使用JavaMail发送邮箱详解

    package com.gqz.forfuture.email; import java.util.Date; import java.util.Properties; import javax.ma ...

  8. si4745 FM-AM-SW 音量控制芯片 驱动详解

    在论坛上看到有人发这个dsp 芯片,仔细看了下,发现功能正合我意,网上能找到的资料(源码)不多 软件环境:linux4.1.36  arm-linux-gcc 4.3.2 实现功能:自动搜台,上一台, ...

  9. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 首先 详解 STM32 以太网数据 到达 的第一站: ETH DMA 中断函数

    要 运行  LWIP  不光 要实现  OS  的 一些 接口  ,还要 有 硬件 数据 接口 移植 ,即 网线上 来的 数据 怎么个形式 传递给  LWIP ,去解析 做出相应的 应答  ,2017 ...

随机推荐

  1. How to access the properties of an object in Javascript

    Javascript has three different kinds of properties: named data property, named accessor property and ...

  2. PHP第一章学习——了解PHP(下)

    继续昨天的部分! —————————————————————————————— 首先Ubuntu下安装Apache软件: ubuntu更新源有问题,又要解决半天! 我现在很冷静! 安装Apache教程 ...

  3. javadoc入门

    斌斌 (给我写信) 原创博文(http://blog.csdn.net/binbinxyz),转载请注明出处! java凝视 java里面有两种类型的凝视.一种是以"/*"起头,以 ...

  4. 赵雅智:service_startService生命周期

    案例演示 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  5. 用nodejs安装hexo,将hexo部署到github

    跌跌撞撞写这篇博文,希望下一篇可以好点 运行环境:最新版本的nodejs + git 安装好nodejs 和 git ,注册好github账号,新建仓库****.github.io(****为gith ...

  6. 【转】emulator: ERROR: Could not load OpenGLES emulation library: lib64OpenglRender.so

    [转]emulator: ERROR: Could not load OpenGLES emulation library: lib64OpenglRender.so ./emulator64-arm ...

  7. mac 上搭建SVN

    copy from 广东小码哥,M了个J. 在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装 ...

  8. 找出N^N的最左边的一位数和最后边的一位数

    问题:找出N^N的最左边的一位数和最右边的一个数,N(1<=N<=1,000,000,000). 找最右边一位: 分析:其实找左右边的一位数还挺简单的,快速幂每次都只取结果的最后一位参加下 ...

  9. Value Categories

    Value categories Three primary categories primary categories mixed special Each C++ expression (an o ...

  10. Linux内存分析

    Linux命令----分析内存的瓶颈    为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cac ...