你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32之CAN通讯接收过滤器过滤分析

[复制链接]
STMCU小助手 发布时间:2022-1-20 20:56
一、前言
学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有标识符的协议。如下图所示的CAN通讯发送数据的数据帧,Arbitration Field即是具有优先级的标识ID,Data Field即是要发送的数据,Arbitration Field、Data Field就是我们关注的重点,因为CAN通讯协议里边这些发送出来的标识ID并不代表节点的地址,数据是以广播形式发送出来,每个节点都是可以接收,至于接收到的数据是不是想要的?就需要对这些标识的ID进行筛选和过滤,再去提取数据。
1 T2 a) [  O/ Y) s6 Z' s
二、CAN 通讯接收过滤器的分析
首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。
# d; P6 n- q/ x, v6 _) z/ D
  1. typedef struct
    - g  E7 F" w3 d7 I3 ?+ X! Y1 ]$ g1 F
  2. {1 D4 W4 |  r; ~; u( j
  3.   uint32_t StdId;    //11位 标准帧ID即Arbitration Field
    7 S4 s+ s8 s2 ]- }/ e5 z
  4.   uint32_t ExtId;    //29位 扩展帧ID
    ) W5 K) D/ O& p2 K( ^+ \! O
  5.   uint8_t IDE;       //1位  O:标准帧,1:扩展帧
    6 \" O  h& L1 r7 ^# F9 G
  6.   uint8_t RTR;       //1位  0:数据帧,1:远程帧7 Q% M! \9 N7 x7 t8 B' l+ Q( O6 [
  7.   uint8_t DLC;       //4位  发送的数据的长度; P  h; g* a4 q  p* C
  8.   uint8_t Data[8];   //8位  发送的数据即Data Field/ w" D7 v+ V0 l6 l
  9. } CanTxMsg;
    ( l9 U2 g" l8 q
复制代码

% [! m8 p2 W  d  q" O, {, o
因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMx,FSCx的设置,如下图所示:
+ M3 [8 ]4 y* o2 Q! D3 L% n+ b
1100486-20170306184647656-1740544022.png

4 @5 @; h$ }: m1 x1 o. Y1 x( p) `$ g# q2 t1 L. N
看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识IDCanTxMsg.StdId是0x000~0x00f,接收过滤先用标识符屏蔽模式来过滤标识的ID,如下所示:
  1. <font color="rgb(255, 0, 0)">ID  :</font>     000 0000 0000 <font color="rgb(163, 21, 21)">xxxx</font>               <div><font color="rgb(163, 21, 21)">屏蔽</font> <font color="rgb(163, 21, 21)">:</font>     111 1111 1111 0000   </div>
复制代码

- M3 q8 N4 Q6 p, B
x代表0或者1都是可以通过,0000到1111的任意组合,这样就可以过滤出0x000~0x00f的数据的,所以屏蔽的意思就是让某个范围的标识符ID可以通过,目的是过滤出一组标志符。那么如果想过滤出一个数据0x003,用标识符屏蔽模式实现方式如下,
  1. <div><font color="rgb(255, 0, 0)">ID  :</font>     000 0000 0000 0011               </div><div><font color="rgb(163, 21, 21)">屏蔽</font> <font color="rgb(163, 21, 21)">:</font>     111 1111 1111 1111   </div>
复制代码
: u# d/ T" z8 S/ r0 ]

1 y* l) J0 O5 Q* I8 E
如果接收过滤使用标识符列表模式来过滤标识ID,如下所示,
  1. <div><font color="rgb(255, 0, 0)">ID  :</font>    000 0000 0001  </div><div><font color="rgb(255, 0, 0)">ID  :</font>    000 0000 0010</div>
复制代码
4 R' r3 P) O3 E7 X
; G3 o  \9 I! c
这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID后跟发送过来的CanTxMsg.StdId进行校对,如果是则去接收数据,不是则过滤掉数据,标识符列表模式目的是过滤出一个标志符ID。
三、CAN 接收过滤器的四种工作模式的程序配置  z" M) J: }  F: O
1、32位标识符屏蔽模式  Y+ b. C% ~3 K* B3 l
% `, r9 d  z6 `4 B
1100486-20170306174607938-1478027373.png * n5 F, h+ v- [# p$ {

+ N; L# d3 J; v0 b1 o假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f
  1. ID      : 0000 001x xxx0 0000 0000 0000 0000 0000  //分别对应CAN_FxR1高16位、CAN_FxR1低16位
    ; x8 x5 I0 X5 E. _) j, q+ u/ Z
  2. 屏蔽    : 1111 1110 0001 1111 1111 1111 1111 1111  //分别对应CAN_FxR2高16位、CAN_FxR2低16位
复制代码
3 ?9 p$ c! v) ?) c7 r

% A" g9 D5 ~1 n5 f5 M
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX32IDMASK);                                      //32位标识符屏蔽模式3 ]& E. x! c$ k* D! V# B
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
    & a5 c  \) B4 N& L& ^5 Y: V
  3. {- x+ T! ^3 |" J% c
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;6 ]% C. I& q3 K$ h$ E0 _0 c9 K
  5.    , l  m/ o" x6 v9 h
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选
    7 @2 x, [1 C0 @) d4 r$ _( S! {
  7.    if(FilterMode==CANRX32IDMASK)0 r! ?/ P3 H) H" |" |9 q
  8.    {
    0 L0 M& r0 J7 B
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式% ^) i' H1 p$ o: ?: G2 S
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 ) f& }) s. \3 U+ [- f+ T
  11.    }3 @5 ^; _% ]5 C9 W' r# E  Y
  12.    else if(FilterMode==CANRX32IDLIST)$ |" @0 c5 M5 W' r0 h- t
  13.    {4 I  n4 L- J6 @
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    % O- e9 q' G( T% c
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    ! }+ j9 P6 o3 _6 O) ^
  16.    }
    7 N3 u% `% m; X  f
  17.    else if(FilterMode==CANRX16IDMASK)8 Q* R4 [4 a# h1 e
  18.    {
    / n$ C4 v. L1 ]: x
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    4 k7 ]8 d* ~/ L% }6 ~+ l
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽 $ t- R  G: C/ @/ e, y& H
  21.    }: q  a5 Y8 K7 t3 a! d
  22.    else if(FilterMode==CANRX16IDLIST)
    ( n! p6 @! e6 ~' H
  23.    {
    % O+ ]9 F: A& y7 H6 n# a7 C
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    ; c1 Q9 [9 Q& }  l
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    . P( @. A. A9 o' I8 B3 ^
  26.    }$ X1 {! @! e9 p& w3 T5 E3 _2 x
  27.     //标识符寄存器FxR1# o" R0 @" \: b9 L5 h- M# l1 ]
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5;                  //32位ID,高16位
    % B* g' H& x' s5 W
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                     //低16位9 B' q6 N" z- F5 E$ j* @0 o' o
  30.    //屏蔽寄存器FxR2
    1 w- m2 Z( h: W# s1 p& V9 b( ^$ v! d
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f;                //32位MASK,高16位1 N9 Q' W: A) _- l9 ^
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;                 //低16位7 Q) }$ ^0 p7 V% G& L
  33.         8 G. @, A9 y! L; C$ @
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO04 z# ]4 l0 Q6 `; D* o
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0" ^* m! J0 x% r' D6 w! V

  36.   q# z( F  S9 A
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化' Q8 `# ^. g6 w% P  O
  38. }
    ( [8 i* z/ x+ F
复制代码
6 d) v; k) {: s6 o# `4 L" N

2 R7 a- J2 }' l8 Y; g) y. H. L
* t+ e* |5 f9 `: E9 o; @2、32位标识符列表模式) y4 \, M7 W: k: w* k8 E

4 X0 {) Y* [( H3 b  [ 1100486-20170308163452531-1730489200.png
, }  M+ l9 U* s( l
( m. {4 p: K% ]2 g
假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。
  1. ID      : 0000 0010 0010 0000 0000 0000 0000 0000  //分别对应CAN_FxR1高16位、CAN_FxR1低16位  //0x011
    7 g+ _: y" Y8 S9 W9 r2 N
  2. 屏蔽    : 0000 0010 0100 1111 1111 1111 1111 1111  //分别对应CAN_FxR2高16位、CAN_FxR2低16位  //0x012
    ( a$ O& |, M* E+ u. ]# J! ]9 f7 [
复制代码

  Q4 X( N) q% g% m* A( z/ E3 p' B# m$ V
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX32IDLIST);                                      //32位标识符列表模式
    ' K) e5 N; _* ]( B6 o" T3 ~
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)- b; @8 F( O9 C+ N( g
  3. {
    6 l6 K, H4 k8 m
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;. o$ Y9 I3 p* h4 s# l- K
  5.    4 C5 U( n% S: t, P' k  m
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选$ A5 U5 m/ C" A( P
  7.    if(FilterMode==CANRX32IDMASK)+ P' D9 ^: F6 e; K( f4 U5 X
  8.    {' x) @0 c% D3 B/ |- i- ?
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式3 o# X0 Z- l0 I1 K" Z
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 0 s5 x  y4 q3 x( V5 n2 @4 ~' W
  11.    }* i& j) g+ c7 l. j8 S* j
  12.    else if(FilterMode==CANRX32IDLIST)4 {! t' F- x' L  ?+ a$ I# S
  13.    {5 }( H3 G) ^" V" i
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式( _  K& c/ F5 F, u3 ~
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    * [' {0 |, L' u5 y/ ?
  16.    }) X* Z) j* Q: o$ `& W
  17.    else if(FilterMode==CANRX16IDMASK)3 o$ y; u6 L( J1 p7 Z
  18.    {
    . B( [  k7 x+ i( f- D7 ]5 F* `
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    , k2 }- j8 t+ ]
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    9 }- j9 [( t8 Y5 n$ Z3 y# R7 o2 m
  21.    }( \' R; A) o' p( G% {
  22.    else if(FilterMode==CANRX16IDLIST)) g% S" B8 e( Q
  23.    {
    & p/ ?4 Y0 Z# t+ w6 @! M
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式, J7 v( C  Y( N' q
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    " i8 N! |& |5 D7 _' ^1 V
  26.    }0 ]6 |  S+ J" _7 Z) L
  27.     //标识符寄存器FxR19 E: s( ~7 L( |$ q0 `! Q
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5;                  //32位ID,高16位* P; }- u. R4 {1 _* V% q* A4 y
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                     //低16位
    ) f  U# ~1 N& Y% [* s6 U( f
  30.    //屏蔽寄存器FxR2
    # m% t( G; A5 C9 C1 x: |6 o- r* K
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5;              //32位MASK,高16位
    " f  p/ K& V+ f0 v
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;                 //低16位" U" A; B( e3 I; `
  33.        
    0 e- X- e) \) W% `. c9 R
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0
    . U; [1 g' P, i& X% }  P
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0* N( n2 i& s5 z8 c
  36. 1 g* `8 T: L* M
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化" g' E4 d$ D' f+ y7 \  F. V
  38. }
    " ~, ?6 [! E2 {- Q/ e+ c
复制代码
/ B0 \' I- e; U. U8 N
) m$ ~4 Z1 W, |2 y2 D6 I. L: h
3、16位标识符屏蔽模式* ?/ N( K2 K6 [% F: @0 r2 K
2 @) X% m2 _; s+ h! X( o
1100486-20170308164239641-1269194157.png + t8 E4 G: Q  X

* n8 x0 f9 a% n& u6 U! m假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。
  1. ID      : 0000 001x xxx0 0000  //分别对应CAN_FxR1低16位  CAN_FilterIdLow
    " M% n+ o) H% s4 E* ?" M
  2. 屏蔽    : 1111 1110 0001 1111  //分别对应CAN_FxR1高16位  CAN_FilterIdHigh" V  S, s* H5 Z
  3. * s  c6 P9 x( l: m
  4. ID      : 0000 000x xxx0 0000  //分别对应CAN_FxR2低16位  CAN_FilterMaskIdLow
    3 D$ n" l( ]$ @9 z+ F" ~
  5. 屏蔽    : 1111 1110 0001 1111  //分别对应CAN_FxR2高16位  CAN_FilterMaskIdHigh# J' c3 q1 K2 _8 {( X
复制代码

- @: N& H/ A" l/ V" }- |
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX16IDMASK);                                      //16位标识符屏蔽模式
    ! n- s! b  c0 L8 r& n
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)4 ~7 |  y* T5 }) ?
  3. {( G5 M' u. V. V) }: I
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;
    ! n+ x2 _+ z" u" O7 v. y+ j6 _
  5.    
    , `4 p8 C# z9 F1 o8 s6 S: _$ e( p5 C
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选
    2 ~( [2 y  W7 s& t
  7.    if(FilterMode==CANRX32IDMASK)
    9 V9 S1 F' Q1 e$ Q9 T: x
  8.    {
    6 q$ L; L/ ~* Z  ^+ _
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    9 u/ g6 A( E; l) H% t1 I4 Q2 F5 a
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 ! D4 `# `1 ?6 Q/ ~1 }& Y! u
  11.    }
    1 ^9 N' i5 v" X3 J( S% z& D
  12.    else if(FilterMode==CANRX32IDLIST)
    : \, ^: P% N" }! x2 x. l- p0 i
  13.    {
    ; v" X2 ]! ]7 V/ |
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式- n# o; N7 a; I7 K/ k# f
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    ; n, }4 G5 k7 r
  16.    }; e% I$ P9 f4 r
  17.    else if(FilterMode==CANRX16IDMASK)) M7 b- E9 I% r+ h9 `  k2 E
  18.    {) C, `0 W2 Y1 `( y
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式8 f: {0 l. u5 y
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽 - p  ?* J" z& i$ _4 L
  21.    }. }0 y( s  \; w& v4 w2 V1 d0 x! a
  22.    else if(FilterMode==CANRX16IDLIST)" {1 Y. i' ]1 i- t& Q4 N
  23.    {
    ( s1 Z/ o" b% h/ q- t
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式0 d; F& R' z5 e6 x3 M  Q( O/ s5 K
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽$ n9 G" z$ A0 U) s9 t7 F7 h
  26.    }6 C2 }& _2 M8 @" R. u$ }2 ^
  27.     //标识符寄存器FxR1
    * q, h1 G6 P8 A8 {
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f;                    //32位ID,高16位, g5 b. D8 w* \) L8 |( w. M
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5;                   //低16位
    " C4 Z" s& u/ ~6 v8 v
  30.    //屏蔽寄存器FxR2
    ' d9 D! T# [" V) v, s) y2 s0 [! h5 Y
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f;                //32位MASK,高16位* A( o# X  k) Q" j7 R
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5;               //低16位
    ! l: _! S- {5 l0 ]5 \( D5 o
  33.         1 m4 u! a3 j: B* z# g8 t$ J
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0) r+ X# h8 L3 _  F: j
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0) s* ^, t5 \5 t0 t/ A
  36. + G1 N- t7 |0 U# f9 ^* r6 g
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化* x2 ]% p) O7 U; B- o- B  K
  38. }
复制代码

: e: w" n$ t! _% O  o' k' C/ N. x/ E& U; X# {  a
4、16位标识符列表模式
' o5 H- ~( X  W. k& y, O$ H' v1 h. K) |) Y' t) `
1100486-20170308171618219-1716149981.png
; n% N+ f& S2 ?( ]
, ^% m' J) r% Y6 a9 h
假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。
  1. ID      : 0000 0010 0000 0000  //分别对应CAN_FxR1低16位  CAN_FilterIdLow  //0x0102 F- F) ?2 n; ?9 r/ z+ S' c
  2. ID      : 0000 0011 1110 0000  //分别对应CAN_FxR1高16位  CAN_FilterIdHigh //0x01f
    ' ^' E5 F; q1 S0 F& I! q6 {
  3. : A' n  P5 S, X9 d; Q3 f2 _, ~
  4. ID      : 0000 0000 0010 0000  //分别对应CAN_FxR2低16位  CAN_FilterMaskIdLow //0x001
    : v: V$ i' }  Q, z7 y+ Y
  5. ID      : 0000 0001 1110 0000  //分别对应CAN_FxR2高16位  CAN_FilterMaskIdHigh //0x00f& Z, i" I( o1 l, p
复制代码
: {6 T# q0 d. ?1 ~" X
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX16IDLIST);                                      //16位标识符列表模式
    " o8 h5 r2 Q: \4 N$ W' |( i
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
    9 T/ w  U% `# ~4 i3 t8 `* S
  3. {
    0 P% z% V9 C4 U' H1 c4 R0 x, J
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;1 Z0 h+ I4 N0 Y7 `: K
  5.    " v- K  K- K6 v) m- c3 }
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选
    & I1 t8 a: E" ^/ D0 M
  7.    if(FilterMode==CANRX32IDMASK). [4 d! U: G/ ^# i
  8.    {: D0 L/ X4 s3 b. H1 V) k1 [
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式2 ?3 ^: J4 P& I7 j  d
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    7 @$ y+ f/ X0 F, }) y1 z
  11.    }: r/ l/ m- D4 Z* Y, A3 M! y( x
  12.    else if(FilterMode==CANRX32IDLIST)0 J& l5 S! L* l% W1 }  ^# i. W9 @
  13.    {
    ! j6 ~0 R; N5 R/ `+ z( S; G
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式+ o  Q) N+ l( n3 [  `( M/ [" p
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 3 ?9 L, x. E9 P9 W) H! Y
  16.    }
    ! a6 s9 s7 Y/ R4 Z2 ~5 _- n
  17.    else if(FilterMode==CANRX16IDMASK)
    ( h7 \4 x3 r9 `" x* b# S7 Y6 T
  18.    {
    7 m+ c% E& d! l0 }- C* p
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式* K+ v9 A' ~7 Z5 q. U9 D# J# c
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽 , P& O% w4 l' f$ l0 [3 @
  21.    }$ j' [! u- s! s2 O
  22.    else if(FilterMode==CANRX16IDLIST)
    7 l( E$ k, Y$ _  [+ l* H
  23.    {' X3 h1 Q' C/ l9 h( D
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式, {/ t. _- R8 ~
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽/ ?! n4 H$ A( n8 P" @
  26.    }+ G. b. v) j$ \" ~" j6 n* O
  27.     //标识符寄存器FxR1
    ) G+ F- k  U8 P5 b
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5;                  //32位ID,高16位* D. D3 \9 |) k! a/ ~% b
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5;                   //低16位  w1 e5 h1 q' V" p, A! E  F, S1 \0 G. T
  30.    //屏蔽寄存器FxR2
    ! ^# P% Z/ X; L( F, P
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5;              //32位MASK,高16位# @8 `+ }% |0 I5 ]4 m7 N" v9 v
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5;               //低16位3 F, D. Y. c6 ?" z3 ?- l4 \1 x
  33.         2 f) g" H7 }+ o
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0/ V# v; P) t2 H
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0/ P% B3 t1 {% u4 @! n% b6 t; F
  36. 5 t# \1 U, M9 {* p' ^2 m
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化
    - U, o; @: v# u1 H; f" h
  38. }
    " K! r" z# \, ^
复制代码
, b5 {( k% {, s+ R6 {: _

  Q8 n, s- ]  I8 w5 R
1100486-20170303180750376-74083783.png
赞 收藏 评论0 发布时间:2022-1-20 20:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版