大家好,我是小舒,今天和大家分享一下CAN滤波器相关的内容,滤波器主要用来设置CAN的接收ID,当CAN总线上所挂接的节点较多,数据量较大的话,对单节点的接收判断可能造成较大的压力、占用较多的资源。为了解决这个问题,可以通过设置滤波器实现只接收特定ID。ST系列单片机的滤波器设置非常绕,很容易把自己绕晕了,下面以STM8为例和大家分享一下。
在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到RAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,beCAN为应用程序提供了个可配置的、位宽可变的6个(0-5)过滤器组,用于只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件进行过滤,从而占用一定的CPU资源。滤波器设置包括下面几个寄存器:CAN滤波模式寄存器1 (CAN_FMR1)和CAN滤波模式寄存器2(CAN_FMR2)、CAN滤波配置寄存器1 (CAN_FCR1)、CAN滤波配置寄存器2 (CAN_FCR2)和CAN滤波配置寄存器3 (CAN_FCR3),CAN滤波组i寄存器x (CAN_FiRx) (i = 0 .. 5, x = 1 .. 8)。滤波模式寄存器用于设置滤波器为标识符列表模式和掩码模式,滤波配置寄存器用于开启或关闭滤波器和滤波器的宽度设置,滤波组用于具体滤波设置。6个可配置的位宽可变的过滤器组,通过FSCx0(x=1..6)和FSCx1(x=1..6)设置滤波宽度,就32位滤波器设置进行解读,CAN报文分为标准帧和扩展帧,标准帧ID11位,扩展帧29位,ID与滤波配置映射关系如上表所示,如滤波模式设置可知可以分为两个ID或者一个ID+Mask。当需要过滤某一段ID时,使用ID+Mask模式,当过滤具体ID时直接使用ID模式即可。如果我的扩展id是0x12345678 ;想只接收0x12xxxxxx的标识符号,该如何设置滤波器,此处采用32位滤波器0进行滤波配置,因此FSC00 = 1;FSC01 = 1;FMH0 = 0;FML0 = 0;扩展id为0x12345678 (0001,0010,0011,0100,0101,0110,0111,1000)RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,因为我们的ID是29位的,所以RTR = 0;IDE = 1;如果要关心到具体的某一个比特位置;如果要过滤让它只接收0x12xxxxxx的表示符号;这时候要根据它实际在identify中的位置去修改idmask ; 前八个比特,对应的就是黄色和绿色的部分,所以其他的颜色,可以都填0表示不需要关心,则这里填入:1 1 1 1 ,1 x x x,我们这里填0xF8 ;CAN_F0R1 = 0x91; CAN_F0R2 = 0x00; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00;CAN_F0R5 = 0x91; CAN_F0R6 = 0x00; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;同理,对于下面的配置是只接收标准id= 0x321(0011,0010,0001)的ID(也是32位过滤器),因为也是数据帧,所以RTR = 0,标准的id,所以IDE = 0 ;所以填入到:CAN_F0R1 = 0x64; CAN_F0R2 = 0x20; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00;CAN_F0R5 = 0xFF; CAN_F0R6 = 0xE0; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;设置过滤器0只接收ID为0x1828A0EF和0x1828A0EE的数据帧。(工作在标识符列表模式)0x1828A0EF:0001 1000 0010 1000 1010 0000 1110 11110x1828A0EE:0001 1000 0010 1000 1010 0000 1110 1110然后我们将0x1828A0EF二进制的格数据组成如上图mapping所示的格式Can _fxr2:0100 1001 0x49 //这里有个RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,这时我们工作在标识符列表模式,identifier/Mask的寄存器相当于identifier使用。再将0x1828A0EE二进制的格数据组成如上图mapping所示的格式Can _fxr6:0100 1001 0x49 //这里有个RTR位我们设置为零表示数据帧,IDE设置为1表示扩展ID16位配置模式也经常使用,如CAN网络管理中往往涉及到网络管理ID-0x4xx,因此需要利用ID和Mask模式,其余的采用ID模式,可以建立滤波器设置寄存器数组.
0x400网段,0x330,0x3200x400: 展开 0000 0100 0000 0000,采用标准帧数据帧格式0x330: 展开 0000 0011 0011 00000x320: 展开 0000 0011 0010 0000CAN_F0R1: 100 0000 0 0x80CAN_F0R2: 000 00 000 0x00CAN_F0R3: 111 0000 0 0xE0CAN_F0R4: 00000000 0x00CAN_F0R5: 011 0011 0 0x66CAN_F0R6: 00000000 0x00CAN_F0R7: 011 0010 0 0x64CAN_F0R8: 00000000 0x00FSC00 = 0; FSC01 = 1; FMH0 = 1; FML0 = 0; FACT0 = 1;
在以往的项目中用过多个品牌的单片机,包括国产的,一直感觉ST的滤波器设置比较麻烦,每次用到的时候都要花较长时间去回忆。
关键字:STM8 单片机 CAN滤波器 设置
引用地址:
STM8单片机CAN滤波器的设置
推荐阅读最新更新时间:2024-11-10 05:37
基于MSP430单片机的CPU卡模板程序(一)
1.端口、变量定义 #include msp430x41x.h ;#defineRESET_VECTOR15*2/*0xFFFEReset */ ;******P1端口定义****** ICPOWERSET4H//IC卡的VCC ICRSTset8h//IC卡的RST ICIOset20h//IC卡的I/O ICKEYSET40H ;******P4端口定义****** ;SAMCLKSET2H SAMPOWERset4h SAMRSTset08h SAMIOset10h ;******ICFlag0,1标志位定义****** #defineICSAM01h,&ICF
[单片机]
基于MSP430单片机的智能防夹电子密码锁
传统的锁具由于其构造简单,被强行破坏导致用户财产被盗的事件屡见不鲜,电子密码锁安全系数高,使用方便,性价比高,受到了广大用户的喜爱。锁具发展至今已有数千年的历史了,但是传统锁具都有不同程度上的缺点:传统锁具制作工艺在技术上已经明显落后,其制造材料无法抵抗强力破坏,无法阻止技术手段的开启,并且很多密码锁存在着夹手的问题。随着电子技术和人工智能技术的不断发展,电 子类产品的发展更趋向智能化和自动化。针对目前 市面上密码锁存在的问题,设计了一款基于MSP430 单片机的智能防夹电子密码锁,可以满足大多数用 户对于家庭防盗的需求。 1电子锁设计特点本设计从经济实用、防夹手的角度出发,采用MSP430 单片机作为主控系统,设计了一款具有
[单片机]
51的单片机学习——定时器
1、关于定时器 定时器由高8位和低8位两个寄存器组成。 TMOD是定时器的工作方式寄存器,由它确定定时器的工作方式; TCON是定时器的控制寄存器,用于控制定时器的启动和停止以及设置溢出标志。 2、对定时器的控制 工作方式寄存器TMOD的设置:对TMOD的访问是按字节访问,所以对TMOD进行设置时需要8位;其工作方式有方式0~方式3四种工作方式,一般选用方式1,即设置TMOD=0x01; 控制寄存器TCON的设置:若选用定时器T0,使用时,设置TR0=1;若选用定时器T1,使用时,设置TR1=1; 3、使用定时器的方法 第一:设置TMOD,配置好工作模式; 第二:设置TH0和TL0的初值; 第三:设置TCON,通过TR0=
[单片机]
基于51单片机的简易电子琴源码
用到了数码管显示,矩阵键盘,蜂鸣器,适合新接触51的朋友们,只是程序,一看就明白 c语言程序 单片机源程序如下: /********************************************************************************************* 程序名: 8键电子琴C程序 编写人: 杜洋 编写时间: 2009年5月18日 硬件支持: STC系列单片机 12MHz 接口说明: 修改日志: NO.1- /**************************************
[单片机]
ARM芯片和51单片机区别
第一,处理速度块、处理能力强、储存容量大、给用户带来便利。 传统的51单片机为8为处理器,而ARM芯片为32位处理器,简单的说,51单片机就是前期我们应用的 赛扬 式电脑,而ARM芯片就是我们现在应用的 双核 式电脑。虽然两者本质区别不大,都能够作为硬件设计平台去实现技术要求,但是ARM芯片由于自身特性(处理速度、处理能力和储存容量等)比51单片机都要强很多,为此在技术实现上也显得比51单片机游刃有余。正是这种游刃有余,后期更容易给客户提供升级、扩容、改造等便利。 第二
[单片机]
单片机C语言教程(七)
上两课说了常量和变量,先来补充一个用以重新定义数据类型的的语句吧。这个语句就是typedef,这是 个很好用的语句,但我自己却不常用它,通常我定义变量的数据类型时都是使用标准的关键字,这样别人可以 很方便的研读你的程序。如果你是个DELPHI编程爱好者或是程序员,你对变量的定义也许习惯了DELPHI的关键 字,如int类型常会用关键字Integer来定义,在用C51时你还想用回这个的话,你可以这样写: typedef int integer; integer a,b; 这两句在编译时,其实是先把integer定义为int,在以后的语句中遇到integer就用int置换,
[单片机]
S7-GRAPH FB参数设置和顺序块控制解读
S7-GRAPH FB参数设置包括4种类型:
1. Minimum , FB只包括SQ_ INIT 启动参数,如果用户的程序仅仅会运行在自动模式,并且不需要其它的控制及监控功能,可以选择此模式
2. Standard, FB包括默认参数,如果用户希望程序运行在各种模式,并提供反馈及确认消息功能。可以选择此模式。
3. um (S7-GRAPH 版本=》 V4.x) FB 包括默认参数,扩展参数,提供更多的控制,监控参数
4. User-defined (S7-GRAPH 版本=》 V5. x)包括默认参数,扩展参数,提供更多的控制,监控参数
顺序步
[机器人]
智能软启动柜怎么设置
智能软启动柜是一种用于电动机起动和控制的电气设备,它通过控制电动机的起动电流和起动时间,实现对电动机的软启动和软停止,从而减少电动机起动时对电网和设备的冲击,延长设备的使用寿命。本文将详细介绍智能软启动柜的设置方法和步骤。 一、智能软启动柜的组成 主电路:智能软启动柜的主电路主要由晶闸管、接触器、断路器等组成,用于控制电动机的起动和停止。 控制电路:智能软启动柜的控制电路主要由微处理器、输入输出接口、显示面板等组成,用于实现对电动机的控制和参数设置。 保护电路:智能软启动柜的保护电路主要由过载保护、短路保护、过热保护等组成,用于保护电动机和软启动柜的安全运行。 二、智能软启动柜的设置方法 接线:首先,需要将智能软启动
[嵌入式]