0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM8单片机CAN滤波器的设置

jf_pJlTbmA9 来源:玩转嵌入式 作者:玩转嵌入式 2023-10-17 14:50 次阅读

今天和大家分享一下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)设置滤波宽度,

wKgaomUD75WAUYrLAABhCSuW28s012.jpg

就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)

将扩展帧ID填入CAN帧ID格式中

wKgZomUD75eADiHJAABKWVMIsVU754.jpg

RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,因为我们的ID是29位的,所以RTR = 0;IDE = 1;

在滤波器中填充如下:

wKgZomUD75mAQBpbAABSrk3fdP4201.jpg

如果要关心到具体的某一个比特位置;如果要过滤让它只接收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 ;所以填入到:

wKgZomUD75qASIuVAABPpezDKnw419.jpg

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的数据帧。(工作在标识符列表模式)

首先我们把这两个ID写成二进制:

0x1828A0EF:0001 1000 0010 1000 1010 0000 1110 1111 0x1828A0EE:0001 1000 0010 1000 1010 0000 1110 1110

然后我们将0x1828A0EF二进制的格数据组成如上图mapping所示的格式

Can_fxr1:1100 0001 0xc1 Can _fxr2:0100 1001 0x49 //这里有个RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID, Can _fxr3:0100 0001 0x41 Can _fxr4:1101 1110 0xDE

这时我们工作在标识符列表模式,identifier/Mask的寄存器相当于identifier使用。

再将0x1828A0EE二进制的格数据组成如上图mapping所示的格式

Can _fxr5:1100 0001 0xc1 Can _fxr6:0100 1001 0x49 //这里有个RTR位我们设置为零表示数据帧,IDE设置为1表示扩展ID Can _fxr7:0100 0001 0x41 Can _fxr8:1101 1100 0xDC

wKgaomUD75uAdko2AABzzEtbZuo707.jpg

16位配置模式也经常使用,如CAN网络管理中往往涉及到网络管理ID-0x4xx,因此需要利用ID和Mask模式,其余的采用ID模式,可以建立滤波器设置寄存器数组。

0x400网段,0x330,0x320 0x400: 展开 0000 0100 0000 0000,采用标准帧数据帧格式 0x330: 展开 0000 0011 0011 0000 0x320: 展开 0000 0011 0010 0000 CAN_F0R1: 100 0000 0 0x80 CAN_F0R2: 000 00 000 0x00 CAN_F0R3: 111 0000 0 0xE0 CAN_F0R4: 00000000 0x00 CAN_F0R5: 011 0011 0 0x66 CAN_F0R6: 00000000 0x00 CAN_F0R7: 011 0010 0 0x64 CAN_F0R8: 00000000 0x00 FSC00 = 0; FSC01 = 1; FMH0 = 1; FML0 = 0; FACT0 = 1;

wKgaomUD75yAN-84AACHOa3bv3c349.jpg

wKgaomUD756AJi8vAACK_dJO_Gg003.jpg

在以往的项目中用过多个品牌的单片机,包括国产的,一直感觉ST的滤波器设置比较麻烦,每次用到的时候都要花较长时间去回忆。

来源:玩转嵌入式
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620869
  • 滤波器
    +关注

    关注

    158

    文章

    7332

    浏览量

    174789
  • CAN
    CAN
    +关注

    关注

    56

    文章

    2470

    浏览量

    459268
  • STM8
    +关注

    关注

    18

    文章

    391

    浏览量

    56251
收藏 人收藏

    评论

    相关推荐

    STM8单片机

    单片机8单片机STM8
    jf_72064266
    发布于 :2022年10月04日 05:27:41

    基于AT89S52单片机的程控滤波器设计

    以AT89S52单片机作为控制核心,设计一个高性能的程控滤波器。放大电路采用由单片机AT89S52、DAC0832和集成运放组成的程控放大电路,可实现对放大器增益的设置,同时实现增益的
    发表于 05-13 09:05

    基于ATMEGA128单片机的程控滤波器

    基于ATMEGA128单片机的程控滤波器
    发表于 08-06 10:46

    基于ATMEGA128单片机的程控滤波器

    基于ATMEGA128单片机的程控滤波器
    发表于 08-17 23:50

    STM8单片机快速入门

    本帖最后由 betting 于 2013-12-11 16:19 编辑 STM8单片机快速入门
    发表于 12-11 16:18

    stm8单片机怎样尽快学会?

    STM单片机的寄存 中断 定时等功能,要足够的例程学习会这些功能,同时要教怎样使用集成开发环境,现在上网查了一下有ST VISUAL和IAP 不知道对不对,有的话请提供下载链表给我,没有的话,告诉我该如何尽快学成
    发表于 06-06 22:05

    STM8视频教程 单片机串口原理与应用

    STM8寄存版视频 第28讲 单片机串口原理与应用(上)[media=swf,***,***]http://player.youku.com/player.php/sid
    发表于 09-01 11:56

    STM32单片机CAN通信

    STM32单片机CAN通信与DMA方式ADC调试记录1.Can滤波器1.1.滤波器组合11.2.滤波器
    发表于 08-19 07:19

    stm8的寄存相关资料分享

    stm8单片机上,使用比较多的就是寄存stm8的寄存也比较少,设置起来也比较简单。  但是
    发表于 12-10 06:25

    STM8单片机开发环境由什么组成

    STM8单片机开发环境的由3部分组成:电脑端开发环境、目标板、烧录仿真。我们要具备以上3个条件才能开始STM8单片机的开发,下面我们为大家
    发表于 01-24 07:10

    使用IAR编译STM8单片机竟然报错这是为什么

    使用IAR编译STM8单片机竟然报错这是为什么?怎样去解决使用IAR编译STM8单片机报错的问题呢?
    发表于 01-27 07:16

    stm8单片机例程分享

    使用stm8单片机模拟串口功能实现STM8S003单片机串口实现printf函数功能STM8单片机
    发表于 01-27 07:37

    设置STM8单片机选项字的方法

    STM8单片机在使用的时候有个问题比较麻烦,就是如果要使用某些引脚的第二功能时需要设置选项字,设置选项字可以通过代码设置。但是代码
    发表于 01-27 08:10

    如何设置STM8单片机选项字

    如何设置STM8单片机选项字
    发表于 12-03 12:36 12次下载
    如何<b class='flag-5'>设置</b><b class='flag-5'>STM8</b><b class='flag-5'>单片机</b>选项字

    关于CAN滤波器相关的内容

    。为了解决这个问题,可以通过设置滤波器实现只接收特定ID。ST系列单片机滤波器设置非常绕,很容易把自己绕晕了,下面以
    的头像 发表于 09-08 09:39 2477次阅读