一、前言学习了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
- typedef struct
- g E7 F" w3 d7 I3 ?+ X! Y1 ]$ g1 F - {1 D4 W4 | r; ~; u( j
- uint32_t StdId; //11位 标准帧ID即Arbitration Field
7 S4 s+ s8 s2 ]- }/ e5 z - uint32_t ExtId; //29位 扩展帧ID
) W5 K) D/ O& p2 K( ^+ \! O - uint8_t IDE; //1位 O:标准帧,1:扩展帧
6 \" O h& L1 r7 ^# F9 G - uint8_t RTR; //1位 0:数据帧,1:远程帧7 Q% M! \9 N7 x7 t8 B' l+ Q( O6 [
- uint8_t DLC; //4位 发送的数据的长度; P h; g* a4 q p* C
- uint8_t Data[8]; //8位 发送的数据即Data Field/ w" D7 v+ V0 l6 l
- } 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
4 @5 @; h$ }: m1 x 1 o. Y1 x( p) `$ g# q2 t1 L. N
看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识IDCanTxMsg.StdId是0x000~0x00f,接收过滤先用标识符屏蔽模式来过滤标识的ID,如下所示:- <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, Bx代表0或者1都是可以通过,0000到1111的任意组合,这样就可以过滤出0x000~0x00f的数据的,所以屏蔽的意思就是让某个范围的标识符ID可以通过,目的是过滤出一组标志符。那么如果想过滤出一个数据0x003,用标识符屏蔽模式实现方式如下, - <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,如下所示, - <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
* n5 F, h+ v- [# p$ {

+ N; L# d3 J; v0 b1 o假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f- ID : 0000 001x xxx0 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位
; x8 x5 I0 X5 E. _) j, q+ u/ Z - 屏蔽 : 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程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDMASK); //32位标识符屏蔽模式3 ]& E. x! c$ k* D! V# B
- void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
& a5 c \) B4 N& L& ^5 Y: V - {- x+ T! ^3 |" J% c
- CAN_FilterInitTypeDef CAN_FilterInitStructure;6 ]% C. I& q3 K$ h$ E0 _0 c9 K
- , l m/ o" x6 v9 h
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
7 @2 x, [1 C0 @) d4 r$ _( S! { - if(FilterMode==CANRX32IDMASK)0 r! ?/ P3 H) H" |" |9 q
- {
0 L0 M& r0 J7 B - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式% ^) i' H1 p$ o: ?: G2 S
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 ) f& }) s. \3 U+ [- f+ T
- }3 @5 ^; _% ]5 C9 W' r# E Y
- else if(FilterMode==CANRX32IDLIST)$ |" @0 c5 M5 W' r0 h- t
- {4 I n4 L- J6 @
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
% O- e9 q' G( T% c - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
! }+ j9 P6 o3 _6 O) ^ - }
7 N3 u% `% m; X f - else if(FilterMode==CANRX16IDMASK)8 Q* R4 [4 a# h1 e
- {
/ n$ C4 v. L1 ]: x - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
4 k7 ]8 d* ~/ L% }6 ~+ l - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 $ t- R G: C/ @/ e, y& H
- }: q a5 Y8 K7 t3 a! d
- else if(FilterMode==CANRX16IDLIST)
( n! p6 @! e6 ~' H - {
% O+ ]9 F: A& y7 H6 n# a7 C - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
; c1 Q9 [9 Q& } l - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
. P( @. A. A9 o' I8 B3 ^ - }$ X1 {! @! e9 p& w3 T5 E3 _2 x
- //标识符寄存器FxR1# o" R0 @" \: b9 L5 h- M# l1 ]
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5; //32位ID,高16位
% B* g' H& x' s5 W - CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位9 B' q6 N" z- F5 E$ j* @0 o' o
- //屏蔽寄存器FxR2
1 w- m2 Z( h: W# s1 p& V9 b( ^$ v! d - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位1 N9 Q' W: A) _- l9 ^
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位7 Q) }$ ^0 p7 V% G& L
- 8 G. @, A9 y! L; C$ @
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO04 z# ]4 l0 Q6 `; D* o
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0" ^* m! J0 x% r' D6 w! V
q# z( F S9 A- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化' Q8 `# ^. g6 w% P O
- }
( [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 [
, } M+ l9 U* s( l ( m. {4 p: K% ]2 g
假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。- ID : 0000 0010 0010 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位 //0x011
7 g+ _: y" Y8 S9 W9 r2 N - 屏蔽 : 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程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDLIST); //32位标识符列表模式
' K) e5 N; _* ]( B6 o" T3 ~ - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)- b; @8 F( O9 C+ N( g
- {
6 l6 K, H4 k8 m - CAN_FilterInitTypeDef CAN_FilterInitStructure;. o$ Y9 I3 p* h4 s# l- K
- 4 C5 U( n% S: t, P' k m
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选$ A5 U5 m/ C" A( P
- if(FilterMode==CANRX32IDMASK)+ P' D9 ^: F6 e; K( f4 U5 X
- {' x) @0 c% D3 B/ |- i- ?
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式3 o# X0 Z- l0 I1 K" Z
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 0 s5 x y4 q3 x( V5 n2 @4 ~' W
- }* i& j) g+ c7 l. j8 S* j
- else if(FilterMode==CANRX32IDLIST)4 {! t' F- x' L ?+ a$ I# S
- {5 }( H3 G) ^" V" i
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式( _ K& c/ F5 F, u3 ~
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
* [' {0 |, L' u5 y/ ? - }) X* Z) j* Q: o$ `& W
- else if(FilterMode==CANRX16IDMASK)3 o$ y; u6 L( J1 p7 Z
- {
. B( [ k7 x+ i( f- D7 ]5 F* ` - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
, k2 }- j8 t+ ] - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
9 }- j9 [( t8 Y5 n$ Z3 y# R7 o2 m - }( \' R; A) o' p( G% {
- else if(FilterMode==CANRX16IDLIST)) g% S" B8 e( Q
- {
& p/ ?4 Y0 Z# t+ w6 @! M - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式, J7 v( C Y( N' q
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
" i8 N! |& |5 D7 _' ^1 V - }0 ]6 | S+ J" _7 Z) L
- //标识符寄存器FxR19 E: s( ~7 L( |$ q0 `! Q
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5; //32位ID,高16位* P; }- u. R4 {1 _* V% q* A4 y
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位
) f U# ~1 N& Y% [* s6 U( f - //屏蔽寄存器FxR2
# m% t( G; A5 C9 C1 x: |6 o- r* K - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5; //32位MASK,高16位
" f p/ K& V+ f0 v - CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位" U" A; B( e3 I; `
-
0 e- X- e) \) W% `. c9 R - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0
. U; [1 g' P, i& X% } P - CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0* N( n2 i& s5 z8 c
- 1 g* `8 T: L* M
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化" g' E4 d$ D' f+ y7 \ F. V
- }
" ~, ?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
+ t8 E4 G: Q X

* n8 x0 f9 a% n& u6 U! m假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。- ID : 0000 001x xxx0 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow
" M% n+ o) H% s4 E* ?" M - 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh" V S, s* H5 Z
- * s c6 P9 x( l: m
- ID : 0000 000x xxx0 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow
3 D$ n" l( ]$ @9 z+ F" ~ - 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh# J' c3 q1 K2 _8 {( X
复制代码
- @: N& H/ A" l/ V" }- |程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDMASK); //16位标识符屏蔽模式
! n- s! b c0 L8 r& n - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)4 ~7 | y* T5 }) ?
- {( G5 M' u. V. V) }: I
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
! n+ x2 _+ z" u" O7 v. y+ j6 _ -
, `4 p8 C# z9 F1 o8 s6 S: _$ e( p5 C - CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
2 ~( [2 y W7 s& t - if(FilterMode==CANRX32IDMASK)
9 V9 S1 F' Q1 e$ Q9 T: x - {
6 q$ L; L/ ~* Z ^+ _ - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
9 u/ g6 A( E; l) H% t1 I4 Q2 F5 a - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 ! D4 `# `1 ?6 Q/ ~1 }& Y! u
- }
1 ^9 N' i5 v" X3 J( S% z& D - else if(FilterMode==CANRX32IDLIST)
: \, ^: P% N" }! x2 x. l- p0 i - {
; v" X2 ]! ]7 V/ | - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式- n# o; N7 a; I7 K/ k# f
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
; n, }4 G5 k7 r - }; e% I$ P9 f4 r
- else if(FilterMode==CANRX16IDMASK)) M7 b- E9 I% r+ h9 ` k2 E
- {) C, `0 W2 Y1 `( y
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式8 f: {0 l. u5 y
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 - p ?* J" z& i$ _4 L
- }. }0 y( s \; w& v4 w2 V1 d0 x! a
- else if(FilterMode==CANRX16IDLIST)" {1 Y. i' ]1 i- t& Q4 N
- {
( s1 Z/ o" b% h/ q- t - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式0 d; F& R' z5 e6 x3 M Q( O/ s5 K
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽$ n9 G" z$ A0 U) s9 t7 F7 h
- }6 C2 }& _2 M8 @" R. u$ }2 ^
- //标识符寄存器FxR1
* q, h1 G6 P8 A8 { - CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f; //32位ID,高16位, g5 b. D8 w* \) L8 |( w. M
- CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位
" C4 Z" s& u/ ~6 v8 v - //屏蔽寄存器FxR2
' d9 D! T# [" V) v, s) y2 s0 [! h5 Y - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位* A( o# X k) Q" j7 R
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5; //低16位
! l: _! S- {5 l0 ]5 \( D5 o - 1 m4 u! a3 j: B* z# g8 t$ J
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0) r+ X# h8 L3 _ F: j
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0) s* ^, t5 \5 t0 t/ A
- + G1 N- t7 |0 U# f9 ^* r6 g
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化* x2 ]% p) O7 U; B- o- B K
- }
复制代码
: 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) `
; n% N+ f& S2 ?( ] , ^% m' J) r% Y6 a9 h
假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。- ID : 0000 0010 0000 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow //0x0102 F- F) ?2 n; ?9 r/ z+ S' c
- ID : 0000 0011 1110 0000 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh //0x01f
' ^' E5 F; q1 S0 F& I! q6 { - : A' n P5 S, X9 d; Q3 f2 _, ~
- ID : 0000 0000 0010 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow //0x001
: v: V$ i' } Q, z7 y+ Y - ID : 0000 0001 1110 0000 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh //0x00f& Z, i" I( o1 l, p
复制代码 : {6 T# q0 d. ?1 ~" X
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDLIST); //16位标识符列表模式
" o8 h5 r2 Q: \4 N$ W' |( i - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
9 T/ w U% `# ~4 i3 t8 `* S - {
0 P% z% V9 C4 U' H1 c4 R0 x, J - CAN_FilterInitTypeDef CAN_FilterInitStructure;1 Z0 h+ I4 N0 Y7 `: K
- " v- K K- K6 v) m- c3 }
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
& I1 t8 a: E" ^/ D0 M - if(FilterMode==CANRX32IDMASK). [4 d! U: G/ ^# i
- {: D0 L/ X4 s3 b. H1 V) k1 [
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式2 ?3 ^: J4 P& I7 j d
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
7 @$ y+ f/ X0 F, }) y1 z - }: r/ l/ m- D4 Z* Y, A3 M! y( x
- else if(FilterMode==CANRX32IDLIST)0 J& l5 S! L* l% W1 } ^# i. W9 @
- {
! j6 ~0 R; N5 R/ `+ z( S; G - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式+ o Q) N+ l( n3 [ `( M/ [" p
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 3 ?9 L, x. E9 P9 W) H! Y
- }
! a6 s9 s7 Y/ R4 Z2 ~5 _- n - else if(FilterMode==CANRX16IDMASK)
( h7 \4 x3 r9 `" x* b# S7 Y6 T - {
7 m+ c% E& d! l0 }- C* p - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式* K+ v9 A' ~7 Z5 q. U9 D# J# c
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 , P& O% w4 l' f$ l0 [3 @
- }$ j' [! u- s! s2 O
- else if(FilterMode==CANRX16IDLIST)
7 l( E$ k, Y$ _ [+ l* H - {' X3 h1 Q' C/ l9 h( D
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式, {/ t. _- R8 ~
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽/ ?! n4 H$ A( n8 P" @
- }+ G. b. v) j$ \" ~" j6 n* O
- //标识符寄存器FxR1
) G+ F- k U8 P5 b - CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5; //32位ID,高16位* D. D3 \9 |) k! a/ ~% b
- CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位 w1 e5 h1 q' V" p, A! E F, S1 \0 G. T
- //屏蔽寄存器FxR2
! ^# P% Z/ X; L( F, P - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5; //32位MASK,高16位# @8 `+ }% |0 I5 ]4 m7 N" v9 v
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5; //低16位3 F, D. Y. c6 ?" z3 ?- l4 \1 x
- 2 f) g" H7 }+ o
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0/ V# v; P) t2 H
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0/ P% B3 t1 {% u4 @! n% b6 t; F
- 5 t# \1 U, M9 {* p' ^2 m
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
- U, o; @: v# u1 H; f" h - }
" K! r" z# \, ^
复制代码 , b5 {( k% {, s+ R6 {: _
Q8 n, s- ] I8 w5 R |