一、注意点7 O' ~3 t6 w0 d1 F) G; w9 j
两个CAN接口同时工作主要是初始化的时候必须一起使能时钟
7 Z D$ f7 F. T3 _( N" ? I5 a5 S+ A& g- ]- j+ p- T: _+ e. b+ p
二、代码分享/ O8 l8 h: r2 H( r; _) ~! d* }
% P1 ?* b2 Z& X4 i. m1 Y2 R
- u8 can_init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
4 i3 c) e# c; V8 o% U } - {3 B6 X% E' Y6 \7 N' k5 i; u, {0 X
- u16 std_id_1 =0x123;
* `7 ~8 {& a! ?- p% ? ?6 L
. C' I4 m1 ]' E$ ~/ N0 c- u16 std_id_2 =0x123; 9 z# F- n3 f8 B: [! [1 L
- " W0 D5 k4 w* x3 O4 [; D9 J
- GPIO_InitTypeDef GPIO_InitStructure;
& X9 B2 Z. _* H2 `1 |; E - CAN_InitTypeDef CAN_InitStructure;
. M" x6 X! j5 L# m5 _3 \. ~ - CAN_FilterInitTypeDef CAN_FilterInitStructure;8 n2 y) ^* v; S2 c, E4 b5 {4 i
- #if CAN1_RX0_INT_ENABLE 3 ]3 C) {( F0 y9 G! k: V+ d
- NVIC_InitTypeDef NVIC_InitStructure;
+ S- w; H0 b$ F+ t# g% w' g - #endif
0 u: R8 I% Q+ P% g7 \ - //使能相关时钟
5 ?% W# _/ [% ^$ E. X% n; X/ z' \! R - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟 6 E" ?6 h' T+ \' U) Q
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能PORTA时钟
; e6 E# K) y) W/ c! M. N - 3 K; V( V# N+ b6 [4 C4 S
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟
0 ^' b7 C+ |- @, Q2 C' v - RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//使能CAN1时钟 9 F/ l, Z8 k2 ~; p y
- ( k/ ?( ~# E: |0 l' _$ n8 a
- //初始化GPIO0 o9 r9 V2 L b: J/ E) ]" G4 i
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;. ]) o2 v% t- p! f) w
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能: Y& O6 r/ P. d% k( V j' a/ S
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出4 t* y( S9 ~' [! \6 g/ j7 g; w* D
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz5 }! D2 h6 j6 I0 _7 K. I
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
% g! a4 K0 f" |# f - GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
3 \7 _8 h3 P. i) W ~1 K1 x, c
4 h0 I9 c) d4 a; Q5 h, B' E3 s- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;
+ y# ^4 [+ b8 I - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能/ }% C& S: }3 [5 G* C$ D7 P/ d) P
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
' `0 o4 |4 m0 [; S% W3 B - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
. |2 V. H7 [% f! Y% S! e - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉! F& b; `$ C9 e( I
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PA12,PA137 ]; V, L# i+ w( S
p' A7 e5 x$ f1 m$ L- //引脚复用映射配置" Z6 d3 t& V7 r) U4 `1 u
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1); //GPIOA11复用为CAN10 u) i2 Q [- m. M/ k6 ~0 k/ O
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN16 R: L+ I9 H: z# a4 ?' H
- / W% _+ \& l0 {0 z( o6 T
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_CAN2); //GPIOA11复用为CAN25 h K- N/ ^3 l( A6 f5 U- p
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_CAN2); //GPIOA12复用为CAN2
3 T, W) G3 c4 e( J. ], E - //CAN单元设置
* `, Q. t1 ^* V# ]; ^ - CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式 6 [- K7 [# W4 B* I0 }1 e
- CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理
# Y4 U8 _1 r w5 q - CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) u5 M, {" W; I6 j
- CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送
7 ~( W( ^: y& k$ ^$ r, l# w: N - CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的
! I* }( t/ W" Y - CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定
, y/ P" s" d& k4 f: K - CAN_InitStructure.CAN_Mode= mode; //模式设置 2 u$ u1 z M6 S h6 f) p
- CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
: _$ @( }9 L( P0 _7 g/ M - CAN_InitStructure.CAN_BS1=tbs1; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
* O1 I6 U1 Z" c8 @9 B - CAN_InitStructure.CAN_BS2=tbs2;//Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
% I+ D6 v' j& v5 c8 Z5 d- `6 ^ - CAN_InitStructure.CAN_Prescaler=brp; //分频系数(Fdiv)为brp+1
" R4 X: w# p8 t* A9 L5 e' R - CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1
- y/ s; b) p4 E2 A - CAN_Init(CAN2, &CAN_InitStructure); // 初始化CAN2
& J" ?& W! a6 [" n - //配置过滤器
' b- _( ^! I/ X) r2 b( L& ?) ^ - CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0
- p0 {& f* H6 h - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽模式
B3 p- a6 W" ?7 K3 q" Q2 f! w - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
/ b% h7 Z1 i, l- E - CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID
, A% Z4 F% ^, D4 c" a! k( B - CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; ^, e2 L3 ?8 `8 X6 S0 V# v
5 R2 y3 o0 q: V- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
" q7 y$ b( T1 z. p& l - CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;: _. F2 _$ L/ x/ K
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
# k9 n- U, q0 P1 N - CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
/ J1 t- l. G) A& b, q. H - CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化, q5 b' L7 S! @8 U# D4 ]4 g/ ?
- /*---------------------------------------------------------------------------------------------------------------------------------*/
8 F% f- w3 G. M- Q
_2 ]4 d$ w. k6 g: U" K7 k! u- CAN_FilterInitStructure.CAN_FilterNumber=14; //过滤器14
3 M5 p6 o. k8 O8 R' {1 \) T* } - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽模式* W9 ^/ V. B& X
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
7 n2 v0 l% O; e$ Q - CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID( N% y( B7 g1 M7 ]1 @4 N1 k
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; * n6 T& M! _+ ?4 g0 O' c
- ; @" ]6 F, u% ]0 e( o! e
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK& u; Y7 m) ^! x: h( V0 f: e
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;" |. `; N+ u! ]% h( I4 N5 p" `
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
; P' _ \. ^: G: N5 Y; u% a4 t - CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器08 n6 r# j; y/ l# R! p
- CAN_FilterInit(&CAN_FilterInitStructure); //CAN2
& S, F4 h7 F* }: R: v0 P
% M7 F$ ~6 x& o+ O( ?, u- #if CAN1_RX0_INT_ENABLE
! @: m+ z! p \/ z" b - . E d# u: |9 o" q
- CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许. ! P4 M: ]" o Z9 P! ]$ D
- . E. l! l# g. B" s% l' C5 J+ r
- NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
j# Q8 O, J% \' G& M4 f+ { - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1
9 t# y* q- {3 F+ F D9 w - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0
% c* V& G Z- T) D - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
% v( B4 ]6 A8 g - NVIC_Init(&NVIC_InitStructure);
6 R) {, l8 ^- y4 B( ` - #endif' \6 ^8 Z4 A8 C, k: a8 T' O
- ; x1 W# ~! _8 ~: P. _, v* B
- #if CAN2_RX0_INT_ENABLE0 u9 h( V9 n! }
- ) F$ d1 n& k( J, t0 Q. ^+ r# g
- CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许. 6 `( y" M1 @- P- c5 n7 _" I, [' _, W
- 7 A+ f0 m. B! E' i$ L
- NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;' d w6 z3 I- ~0 l( e( G! c
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1% \. ?: W0 l: h% a T' f5 P- L
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 次优先级为0$ s; m2 V5 Z- r" Z5 R! k
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
# W* \, V4 n4 f* }( y% X! z - NVIC_Init(&NVIC_InitStructure);( ^; J E) i* U- g7 u. [, U8 U2 H& v4 ?; @) r
- #endif
* G$ x7 t) a; b - return 0;
1 S# k3 M/ w( J - }
复制代码
* e D: e. B$ D3 M7 Q+ I' f
5 p3 P4 u# z8 Q$ s4 B+ ~9 k' x" j
. Q7 O; r; p( \# X) n6 p6 v5 |" s) I
|