一、前言学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有标识符的协议。如下图所示的CAN通讯发送数据的数据帧,Arbitration Field即是具有优先级的标识ID,Data Field即是要发送的数据,Arbitration Field、Data Field就是我们关注的重点,因为CAN通讯协议里边这些发送出来的标识ID并不代表节点的地址,数据是以广播形式发送出来,每个节点都是可以接收,至于接收到的数据是不是想要的?就需要对这些标识的ID进行筛选和过滤,再去提取数据。: E0 {+ c" p" H$ p' K, @( g6 X& w1 o
 二、CAN 通讯接收过滤器的分析首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。 8 [9 W9 i1 t A- w( p& O
- typedef struct
- Z7 l% L, U5 H9 e- @/ V, ]0 h - {; E: r. U7 ~, D6 O. b. Z4 P3 \
- uint32_t StdId; //11位 标准帧ID即Arbitration Field
& x0 B9 u1 L3 T% c - uint32_t ExtId; //29位 扩展帧ID$ ]3 w9 S2 Q* f. Y- n# _# b2 Z$ j
- uint8_t IDE; //1位 O:标准帧,1:扩展帧3 D4 ?- b/ b& m: V& S9 p
- uint8_t RTR; //1位 0:数据帧,1:远程帧
" k6 \4 e' s3 |( P - uint8_t DLC; //4位 发送的数据的长度, ~ w) d) Z2 O6 G8 Q& ?
- uint8_t Data[8]; //8位 发送的数据即Data Field7 h2 d$ r. ~& [
- } CanTxMsg;# q' \: j2 c$ P/ W2 C t& `. J
复制代码 % S; o1 u/ Z* S3 x( K8 ?7 e1 U
因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMx,FSCx的设置,如下图所示:
1 |! q7 D( D! `6 z& G0 R3 R
. ~. ~( A% }% a. W
$ q3 h. C1 L. O. Q
看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识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>
复制代码
* S: A% L% o( r2 c% q+ y, Z9 ~1 I, C- Hx代表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>
复制代码 * u9 w$ L0 X/ j3 j; r3 y
+ @0 l% O1 h! B9 N8 P如果接收过滤使用标识符列表模式来过滤标识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>
复制代码 . _) v, E1 o4 i, @, z
' Y. C$ K% ^: g. K这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID后跟发送过来的CanTxMsg.StdId进行校对,如果是则去接收数据,不是则过滤掉数据,标识符列表模式目的是过滤出一个标志符ID。 三、CAN 接收过滤器的四种工作模式的程序配置
" d9 t* q* g5 c1、32位标识符屏蔽模式2 T5 S& n' K2 w% |9 j8 p( e; E
V% L, G: N" w2 Q% a6 @
1 G6 [' @2 F) x2 \* r+ A* {
' L3 }6 k& O9 s% V假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f- ID : 0000 001x xxx0 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位
5 ]. i5 q3 Q, T) X - 屏蔽 : 1111 1110 0001 1111 1111 1111 1111 1111 //分别对应CAN_FxR2高16位、CAN_FxR2低16位
复制代码
) n4 a) H! J$ C) e9 P9 }; s+ F. p% |) W. j
程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDMASK); //32位标识符屏蔽模式
( p3 b8 \1 l: N: I - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode) _9 A% \: m* C' x& I/ q8 }
- {
3 g6 s/ R" S! L8 O/ x - CAN_FilterInitTypeDef CAN_FilterInitStructure;2 w6 o8 f( G- P+ S; t7 u+ r
- 1 l8 h2 s+ i+ i" K9 `
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选; A+ w- {1 p* M. N% y, W
- if(FilterMode==CANRX32IDMASK)
1 S: b) f3 }7 k" |0 Q - {
) o& @# K5 W' _$ e - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
$ t& O9 f6 p( ~- Q/ } - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
- N# K& g* t6 H @. ?: O - }
; s; c& W1 m; f l - else if(FilterMode==CANRX32IDLIST)" v7 }9 m1 H: l0 ?, k
- {7 ~* A8 ^$ t1 l' [( V
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
& s) {; j ^; f# Z0 r - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 ! G) L+ g1 q& A& n( y3 f3 Y* t7 Z4 F
- }
/ @7 H2 V' |; k, h7 X' t% | - else if(FilterMode==CANRX16IDMASK)3 D, {/ j) P3 {* K
- {
9 l+ R7 D( n9 ], V* q& _: B - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
& [$ ?: Z: S7 f - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 5 d. [) }! f2 t# P6 p
- }) z6 ?0 B: u% }
- else if(FilterMode==CANRX16IDLIST): Y: U* `$ G' }1 I, G+ c1 N
- {
9 \' Z# f% U9 N1 O - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
5 | o4 Z) q) j$ t9 d: i - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
2 C+ j1 q0 H0 e4 G5 } - }
' \- i7 A5 t' a& I/ F) g - //标识符寄存器FxR1
2 a7 A- h( _2 Y - CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5; //32位ID,高16位
- c! u! @! B/ p, H6 `# z - CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位
8 M: \1 V P$ r, u - //屏蔽寄存器FxR26 I) ^3 w% j; Q+ l( p
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位
$ s! g/ q0 l0 p- k7 i+ A - CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位
- q9 [& G2 y9 c; }6 Z. ^) B8 i -
- [+ s3 [0 i' @" w/ s, H: L6 V. H - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0
' P: u( k8 @4 }2 a! D) ^7 o+ G6 H - CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
: [0 a8 _7 a8 a" e - . A& Z! P( Q% Y# l8 @8 @% N
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化) u$ v( `; O2 E0 {
- }
+ Z8 p- }2 V& a+ h' M$ W3 z8 H* T- L: G6 p
复制代码 ! {, d( y; J! [+ f, T
' h% A) g9 w o4 C8 M8 Y
) F& ~8 {7 G7 `' X' L/ F, U0 f" C2、32位标识符列表模式: F: V9 _ f. a
# t- C+ z9 M4 O, j* D" u
; P, U; n( |2 `' _

% a, Z; F# Y- a假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。- ID : 0000 0010 0010 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位 //0x011 O/ s: X5 \$ w6 D8 D
- 屏蔽 : 0000 0010 0100 1111 1111 1111 1111 1111 //分别对应CAN_FxR2高16位、CAN_FxR2低16位 //0x0127 i# Z4 x& z; v! j; ^. \+ S
复制代码
7 C1 G6 Q7 }8 G2 D程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDLIST); //32位标识符列表模式
+ K# \1 G' e& n/ d4 Q/ } - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)8 p9 f/ b0 L, |3 t: E
- {& `0 |6 m0 g, F% K
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
, ` I* ~+ [% T. B; L; ? - ( \1 |. t; W" O3 ?
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
2 h& {, a' N7 q) P# O9 I* @ - if(FilterMode==CANRX32IDMASK)
# b9 U$ n& z( H$ Z: ] - {
# S: Z2 T+ j- V3 A; s5 R2 {6 A - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式( ~6 \. i" X, u- |; z: i6 Y" N
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
6 Q @+ o5 e0 H, b- D5 W0 e( S - }
! ]% L- J+ I* D/ M' y - else if(FilterMode==CANRX32IDLIST)
6 e, D1 l$ q8 B( H4 h: H - {
4 Z& B" p+ x' v1 k: t - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
8 Z* g* M6 p1 E- y; R - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
+ g! V: q- _) t; Z/ H2 _/ H6 J - }
6 n4 j* D# S$ c; i - else if(FilterMode==CANRX16IDMASK)5 {4 W0 `5 _) d( Z2 e1 _( Y
- {
( k* \8 U& }) {. S9 e' O - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式* i7 V) J2 V; r' E; n/ M0 F
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
1 `' _# p4 c- }5 G! A - }8 l% Y! Q% f! f/ o+ U
- else if(FilterMode==CANRX16IDLIST)5 E8 | u. P2 I
- {! z8 Z3 p& Z, }7 ~- \5 n
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式% X5 {1 R* `8 C
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
* z7 U: @. A" P3 J5 _/ J: `' W - }
1 U0 g' N! T& g( r6 ~ - //标识符寄存器FxR1: f# F2 t" N4 S# ~
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5; //32位ID,高16位3 i# @+ w* v4 u7 R2 y4 R, F
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位
+ y1 c5 z9 _7 Z, p; N - //屏蔽寄存器FxR2
N* \* Z" O$ O2 z4 F - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5; //32位MASK,高16位5 c6 B4 N6 m2 o4 Z
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位
9 k! Z) c$ z$ U" x( z -
% a5 K% J5 t- ?+ ]8 J2 J6 x - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0/ T: y) m" ?# @
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
* \+ W1 q7 x+ O+ a. r' ^' X! ] - 7 T) L: P# N. l8 B5 E
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化/ o: q! }$ R/ C- G/ z0 a* F+ t+ u
- }
* X( f2 z0 f& w) O# a
复制代码 % p- h/ V% l- L* T* A: \, y
3 x* }! Q4 J2 L% I3、16位标识符屏蔽模式
* z8 U( p0 S, O0 \: M! O( |- G5 C0 e
* `7 Y/ c% y, m! v+ ~7 \
) J B7 g$ h) A& z( z3 l) F假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。- ID : 0000 001x xxx0 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow
1 G+ ]0 I, _& W' B' E1 [ - 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh* w& M( U. N) `
- ( v1 d- S6 U6 a5 L4 d% w
- ID : 0000 000x xxx0 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow* v" l! P7 p0 h$ [7 |8 O! ^! i8 S
- 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh4 G: `* X) s- q/ r& z
复制代码 . I! A( z) T& n/ @
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDMASK); //16位标识符屏蔽模式
$ m' s+ M* Y- R' O - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)# w2 F# U, w6 R" I J
- {5 J" J- K2 e6 P; M! f5 n' c
- CAN_FilterInitTypeDef CAN_FilterInitStructure;% ]: R! G0 q' G4 j& {) ?
-
: s, S; P( S" m/ l( O - CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选/ a# x0 S1 a$ j2 _
- if(FilterMode==CANRX32IDMASK)' B: U' m0 e q8 X
- {
; B @; K+ j) E. A - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式7 K) h* E5 Z) |; o9 Y
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 ( L/ [$ P5 D$ F) |! e* [
- }9 K) v- I, W. t3 ?, k4 J
- else if(FilterMode==CANRX32IDLIST)
( ?# ?6 Q. {" P" u( B2 E( C - {( c" r& Y7 \+ v) z
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
. n2 r V' Q5 a; b& l* O5 r: F$ N - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
# [, z- @8 F2 y% j - }
+ l( L+ G: r" F0 T& E$ L3 P# q - else if(FilterMode==CANRX16IDMASK)- Y) _: g) \& x
- {6 |. P- |4 R2 _6 x M1 @- k3 t6 L
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式' O; ] A t7 p# {' a
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 * c1 f2 H! e/ R7 W+ P" W+ T
- }3 a/ B' P5 Z* y9 E) A$ B, Z
- else if(FilterMode==CANRX16IDLIST)+ m3 E5 h9 u- p9 v9 J1 \
- {- Y& |$ X. G+ w: O
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
5 p T& ~0 P- E( h. F7 t - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽: g' S% x; M3 ? i( G
- }$ L" M+ B6 f, |) A; {
- //标识符寄存器FxR18 H' R; P8 H$ B+ G4 `, X5 \
- CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f; //32位ID,高16位3 Q! v+ c4 ]; G; M
- CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位
$ O0 t0 F; n! f2 P. Z3 W; F4 u - //屏蔽寄存器FxR2
' K, w* I* {% i- p" q* P1 Z - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位) `8 @ k- Q, u! M" D# v$ ~: z
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5; //低16位6 h2 ]- O5 w' T5 [
-
2 t9 G+ m5 a/ A0 n - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0
# N$ x1 m0 w) t* W8 y - CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
6 ]. ^; K# r* B3 h0 ?8 H - + I2 f; H" x; w8 r s) k
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
0 p; ^/ U, d( W! }$ j! v9 g - }
复制代码 ( O4 {9 s7 ~4 | j
3 w8 e$ m F+ }* y4、16位标识符列表模式
2 n; R- @$ \. w3 r! _( c+ ~. D! i! }) M- w
5 F: |1 U" D; D) V : @* e' [: O8 y; O& q
假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。- ID : 0000 0010 0000 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow //0x010% I/ x: }) O5 o2 ~
- ID : 0000 0011 1110 0000 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh //0x01f. t- G1 L0 ?/ f1 g
- * i- v# i# q: o1 J
- ID : 0000 0000 0010 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow //0x001
5 h9 S0 i/ s" Y4 t6 Q+ F - ID : 0000 0001 1110 0000 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh //0x00f4 }3 g* I4 B* ]6 T" i# |+ Z& N% U
复制代码 ; T+ g* O" _* ^0 T$ P/ p! ?
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDLIST); //16位标识符列表模式; z, [( n0 t O3 b0 I' @% ~+ E$ L' W
- void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)3 ?3 d6 g+ H( W0 l, b/ p: P# v# Z
- {
3 x |$ Y4 V7 g - CAN_FilterInitTypeDef CAN_FilterInitStructure;. K2 a6 |& n1 ]4 P4 \8 J+ _
- M% G! P0 {1 K; z
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选% w: z! l* t7 U1 _
- if(FilterMode==CANRX32IDMASK)
/ e" w' `& a& v - {
9 K( y# g0 H: x4 N% }8 r# y - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式3 {0 b. N8 g2 C9 u5 V
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 * A: I6 r8 G$ n& {
- }5 c( W5 d5 j$ t1 ^0 @6 s
- else if(FilterMode==CANRX32IDLIST)# V0 V; \. S5 u. i
- {) S% P0 T& U# `, P1 n2 _
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式; H( U9 E! `( n9 E$ [& ^* C
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
3 {: w- {/ A6 B) Y$ i7 h! j% j+ ~ - }
# J9 s8 N, o) s - else if(FilterMode==CANRX16IDMASK)# @, }% g5 b, p4 }
- {
8 y( t; B0 [# L) n! s! ?3 v2 T) o - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式/ e. e: h5 P" Z% @: q4 }$ [
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 % h, N4 L) ^1 A9 c/ q: ?
- }
3 x5 h! ]) o' }+ _9 a - else if(FilterMode==CANRX16IDLIST)
2 [! ~5 e& u n. E) M# T+ x - {& m; n" ^' W+ T# ]/ y. c
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式1 O7 M* E5 B- j$ `& g5 d
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
# |: ?5 ?, K5 C- W. T5 n - }1 j" `- m ?+ W9 I. y
- //标识符寄存器FxR1
1 }% u( F: q V1 m% k - CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5; //32位ID,高16位1 Q* {/ x' a% z0 c( Q6 e# i- G
- CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位& q2 U; [, F$ {
- //屏蔽寄存器FxR2: H; [5 _% a# w1 M5 z
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5; //32位MASK,高16位
5 D+ r- L; m2 |- N0 M" j6 Y' Y - CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5; //低16位
5 C% F" z% f2 R1 @) T( i1 z* c - * z4 [9 D& |! R( V. B: v& l- f
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0
4 d t$ z5 a! |+ X' C6 V! _ - CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器05 q; i: b4 `% Z: l/ ~9 N0 }& L9 \
: m" E$ T4 Q# b ~' X+ N* D- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
# _6 G. D! F+ z* x+ b - }
) ^, P. t7 O3 r- E4 {8 W+ M
复制代码
; [3 @- O8 f' F7 S6 [5 {- Y- ~* V% R; K$ ?4 e7 d/ z, o3 d7 {
|