STM8CAN 滤波器设置

Posted FreedomQQkiko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM8CAN 滤波器设置相关的知识,希望对你有一定的参考价值。

前言

学习了STM8的CAN总线的IdMask模式。在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)

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

 技术分享

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

首先我们把这两个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

 技术分享

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;

 技术分享

技术分享

 

以上是关于STM8CAN 滤波器设置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Kalman 滤波器时正确设置测量噪声矩阵

有人用过PinTech品致的示波器探头吗上面的10X是啥意思?

几种常见空间滤波器MATLAB实现

图像的滤波与增强

亮度滤波器opengl中的多彩噪声

用matlab设计低通滤波器