基于STM32的CAN网络开发笔记之滤波器配置和ID设置

发布者:雅意盎然最新更新时间:2017-10-01 来源: eefocus关键字:STM32  CAN网络  滤波器配置  ID设置 手机看文章 扫描二维码
随时随地手机看文章

    看了很多关于配置滤波器和设置ID(StdID ExtID)的文章,发现都有问题。经过自己实验测试,得到的结果如下:

(1)  设置ID

   如果你想使用的StdID,则ExtID可以随意设置,只需要配置正确StdID即可。同时,需要设置IDE=0。如果你想使用的是EXTID,则只需要正确配置EXTID即可,STDID可随意设置。注意,这一点很多地方认为是扩展ID的前11位由StdID设置,后18位由ExtID设置。而实际情况是,ExtID本身就是一个32位无符号整数,只需要正确设置它即可。这是我通过查看STM32的固件库函数和类型定义而得出来的,经过了实验的检验。设置ID还可参考我曾经发表过的一篇博文。

(2)  配置滤波器

滤波器有四种模式:1,1个32位标识符屏蔽过滤器;2,1个32位标识符列表过滤器;3,2个16位标识符屏蔽过滤器4,2个16位标识符列表过滤器。先看寄存器图,如下:


这里注意一点:如果使用STDID,图中的EXID就没有意义了,无需设置,默认为0即可;如果使用了ExtID,则ExtID的前11位设置为STID,后18位为EXID值,其效果就是将ExtID右移3位即可。当然,设置寄存器时,还需要设置IDE和RTR.。

模式1:举个简单的例子,我们设置过滤器组 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 表示不关心)。也就是,第一个寄存器给出一个值,第二个寄存器给出的那些值为1的位就是发送过来消息的ID与第一个寄存器的ID必须匹配的位。

模式2:就是列出两个ID,然后系统硬件就自动过滤过往的报文,只接收与这两个ID匹配的ID的信息。

模式3,4其实就是模式1,2的mini版,其作用就是在使用StdID时,能够得到更多的过滤选项。

(3)  在STM32中的具体实现

    现在假设是要从网桥1中的节点1处与管理中心进行通信。则管理中心中应该设置的EXTID为:0000001 0000001 0000000 0000000 0,共29位,最后一位默认为0,无效位。STM32终端处滤波器的配置为:

    CAN_FilterInitStructure.CAN_FilterNumber=0;      //过滤器0

    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;

    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位

    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0082;////32位ID

    CAN_FilterInitStructure.CAN_FilterIdLow=0x0004;

    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0080;//32位MASK

    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0004;

    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//关联到FIFO0

    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0

重点看滤波器模式和设置。滤波器模式设置为32位标识符列表模式(CAN_FilterMode_IdList),即只接收发送到该节点的信息和发送到网桥1的广播信息。滤波器ID=EXTID<<3+IDE<<2+RTR<<1。注意,IDE取值为0或1,与程序中的设置发送数据ID格式(CAN_Id_Standard =1,CAN_Id_Extended =4)不一样。本终端不设计远程帧,所以RTR=0。所以,ID=00000010000001000000000000000<<3+1<<2=0X820004。如果为广播帧(管理中心到网桥,用于轮询),ID=0000001 0000000 0 0000000 0000000<<3+1<<2=0X800004。所以,对于IdHigh=0x0082, IdLow=0x0004, MaskIdHigh=0x0080, MaskIdLow=0x0004。


关键字:STM32  CAN网络  滤波器配置  ID设置 引用地址:基于STM32的CAN网络开发笔记之滤波器配置和ID设置

上一篇:基于STM32,低速CAN通信的收发器芯片选择问题
下一篇:基于STM32的CAN通信网-----一种ID配置方法

推荐阅读最新更新时间:2024-03-16 15:39

关于STM32开发工具之STM Studio调试和诊断工具讲解
STM Studio这个工具出来很久了,可能很多人都没听说过。之前没写过,今天就写点关于STM Studio的内容。 1写在前面 针对 STM32 软件的开发工具有很多,从开篇图片也能看到,不知大家用过其中哪些工具? STM32软件开发工具地址: https://www.st.com/en/development-tools/stm32-software-development-tools.html 本文就重点讲述其中的一个工具:STM Studio. 2关于STM Studio STM Studio是通过实时读取和显示变量来帮助调试和诊断STM32应用程序。 STM Studio在PC上运行,通过标准的ST-LINK开发
[单片机]
关于<font color='red'>STM32</font>开发工具之STM Studio调试和诊断工具讲解
stm32USB设备的连接枚举过程
1) USB 的插入检测 当12脚短接,Q1截止,Q2导通,D+上拉,windows 就会认为 USB 接口有一个全速设备,马上复位总线,并开始枚举设备。 如果23脚短接,则 Q1状态取决于 USB-DISCONNECT(PD2)脚的状态。CPU 复位后,GPIO 引脚处于浮空输入状态。所以此时,Q1导通,Q2截止,主机检测不到设备。 在程序初始化了 USB 相关部分后,可以通过设置 PD2=0 低电平使 Q1截止, Q2导通。则 USB 检测到设备,开始枚举过程。 所以要控制开发板作为 USB 设备工作,必须23短接。 当12脚短接,Q1截止,Q2导通,D+上拉,windows 就会认为 USB 接口有一个全
[单片机]
stm32USB设备的连接枚举过程
stm32专题十六:IIC(二)stm32 IIC通讯过程 标志位
1 IIC进入主模式的步骤: 在主模式时,I 2 C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。 以下是主模式所要求的操作顺序: ● 在I2C_CR2寄存器中设定该模块的输入时钟以产生正确的时序 ● 配置时钟控制寄存器 ● 配置上升时间寄存器 ● 编程I2C_CR1寄存器启动外设 ● 置I2C_CR1寄存器中的START位为1,产生起始条件 2 作为主机发送器时的传送时序图 主发送器发送流程及事件说明如下: (1) 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对 SR1 寄存器的“SB”位置 1
[单片机]
<font color='red'>stm32</font>专题十六:IIC(二)<font color='red'>stm32</font> IIC通讯过程 标志位
STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus区别
一个是获取状态的,一个是获取中断的。 EXTI_GetFlagStatus只是纯粹读取中断标志位的状态,但是不一定会响应中断(EXT_IMR寄存器对该中断进行屏蔽);而EXTI_GetITStatus除了读取中断标志位,还查看EXT_IMR寄存器是否对该中断进行屏蔽,在中断挂起&没有屏蔽的情况下就会响应中断。仔细看看代码就知道区别了 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) { FlagStatus bitstatus = RESET; assert_param(IS_GET_EXTI_LINE(EXTI_Line)); if ((EXTI- PR & EX
[单片机]
通过USB转TTL串口下载stm32程序
目录: 1.硬件及其接线 2.驱动及软件 3.下载程序测试 1.硬件及其接线 1.1 USB转TTL刷机板(CH340模块升级小板) 1.2 主芯片STM32F103C8T6开发板 1.3接线 1.3.1 转串口模块接线 注:3V3和5V由短路冒选择。 1.3.2 核心板接线 其中 BOOT0置1,BOOT1置0。 2.驱动及软件 2.1 CH340驱动及安装方法 2.2 程序下载软件 3.下载测试 下载实验一流水灯程序测试。 实验一流水灯 写入程序成功后,将BOO0与BOOT1均置为0。 实验结果显示程序按预定设想成
[单片机]
通过USB转TTL串口下载<font color='red'>stm32</font>程序
STM32的GPIO的寄存器介绍和设置
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。 数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端
[单片机]
STM32 实战 按键点亮LED(中断)
来看看最简单的点亮一个灯的实验你把,实验要求使用KEY4*4按键,按键按下灯亮,按键拿起灯灭,如此一直循环: 程序的思路如下: 1、首先需要设置的是时钟:你将灯的管脚连在哪个端口的某个引脚上面,你就开启哪个端口的时钟,比如灯连在A端口的某个引脚,就要开启A端口的时钟。 2、其次,设置管脚(我们要设置LED和矩阵键盘中的一个键的管脚): 我们需要对GPIO进行初始化设置,我们只需调用 GPIO_InitTypeDef的结构体,对每个成员进行设置,要设置的有PIN管脚的位置GPIO_Pin,还有管脚的速率GPIO_Speed,还有管脚的工作状态GPIO_Mode,最后在调用一下初始化的函数GPIO_Init, 3、然后
[单片机]
按键开关机电路图 按键开关机电路设计方案
最近做个基于STM32脑波检测的项目,甲方爸爸要求使用按键进行开关机。在网上查了一些资料,找到了很多案例分享,在此进行总结。 主要分为以下两部分: 单片机控制按键开关机电路 独立按键开关机电路 1、单片机控制按键开关机电路 1.1、简约版 图中Ctr和Key接单片机管脚,作用如下: Ctr作为开关控制用 Key作为按键检测用 操作流程: 开机:按下按键,Q1导通,单片机上电,控制Ctr为低电平,保持Q1导通。 关机:再按下按键,单片机控制Ctr为高电平,此时松开按键Q1截至,单片机停电。 如图: 简约版 优缺点分析: 优点:电路简单,元器件比较少。 缺点:在停机状态下单片机的IO口依旧带电,正常使用没问
[单片机]
按键开关机电路图 按键开关机电路设计方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved