|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
/ o7 c; Y y- p5 n# e( Y3 M3 g</p>+ s7 k& B0 [% u) H5 L1 J0 c
< p>
4 _& _) D" D4 u a, x$ ]6 L static void Initial_SPI(SPI_TypeDef* SPIx) //??????IOB????<br />
3 [3 ~; }: K* g4 ^# x& _& V {<br />0 X/ k/ }0 R' e, R( T4 P' f ?
GPIO_InitTypeDef GPIO_InitStruct;<br />( _9 I8 e2 X) a
SPI_InitTypeDef SPI_InitStruct;<br />
5 q5 m, z" L- [( _* Q8 j8 j7 jIF(SPIx==SPI1)<br />+ @$ k3 W: h# s5 m: E. |
{<br />$ p* F, G( T% b; C3 X- t
RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />7 y7 _1 z5 V$ }1 ~1 b. `9 H8 W
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
2 K; n; |0 Q" v7 q< /p>/ s7 a: R% K7 E7 `4 e q
< p>
) N: S% b" F- F$ r- e GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />2 a6 S# m8 Z& u5 \+ H: M
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
4 ^4 u# t( S. Y9 \; j) b/ P1 ` GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br /> |% u8 N, K, _
<br />2 t1 A7 c! R% g' E; I$ u m, L8 t
GPIO_Init(GPIOA, &GPIO_InitStruct);<br />" h# {$ S3 N7 L& x4 Q' J
}<br />
$ v, s% }& ~' r else if(SPIx==SPI2)<br />
+ y# G% K9 g; a% |2 N7 Z {<br />3 g4 {9 V9 y$ [4 }% n9 D+ c/ ^
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
+ X. B( ?5 e3 A0 l RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);3 y, Y0 o0 {3 X0 G$ N
< /p>
8 m4 |( j3 q" y5 f6 L< p>
! X: ^% \" O) q GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
0 W3 c2 d9 [! V$ f# g# g5 Z+ C% U- Q' t GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />" \ B" h3 m2 a
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
% _; I" e# q' h/ b <br />
6 }! `. C& J8 `) y: ]- Q8 O* C GPIO_Init(GPIOB, &GPIO_InitStruct);<br />% w- C% K1 d2 v' j
}5 `6 e' x0 d" r& Z6 ~: R2 P
< /p>2 x$ @$ R0 q7 w' I; C7 A
< p>
* G$ R8 e; @5 r. }% q4 ^1 w8 T else if(SPIx==SPI3)<br />1 h3 Y W% v( x- |. f; @! u% H
{<br />
; \* @. H1 o7 R RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
$ O$ w5 a$ P& {( X% u5 Y1 k0 P RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
( T! G7 U0 b, l \" }< /p>+ }0 q I, Y7 P% y$ k$ B/ W9 y
< p>
$ o: h& C A2 @9 h5 m GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />% C' ~- r& F; W' F3 C9 J# K0 m% T
//GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
% m2 q9 e1 D; Z" E5 Y RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);/ o* |" x: J7 ]- v& i8 r1 z% l
< /p>
}: z8 [. \2 o) {< p>, l9 Y7 u- R) g. n2 h3 W6 O
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
# J- N) c+ r% w: R. N. L! R8 z" G GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
+ K5 ]7 P; a1 \ @) h- S GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />8 u6 g3 A8 T* M f
<br />
. |0 d8 I# ` F ^ J6 T8 D: B GPIO_Init(GPIOB, &GPIO_InitStruct);<br /># i8 R3 j1 _/ u e* c5 k6 m
}# v( Y: b8 t" G
< /p>$ N" k) |# y' g# J$ ^
< p>
* H* j) {9 y( S SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />2 w* R& @5 ~6 [& _# p% A
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />' k+ M; j/ G5 R0 j& w+ l
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
/ ^; {, J# I; d& V2 j SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />! p; h5 f: }6 s( v- P
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />8 I: I, s1 V B: h0 y8 G" `
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />/ x" k" A8 E% Z. u- d, i X2 V+ v9 V
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
# r+ k1 X8 f$ N; {3 z3 p q4 V SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />2 p9 d5 s, j6 {3 c
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />7 t1 J* L6 U# w. \& {
SPI_Init(SPIx, &SPI_InitStruct);8 k4 D+ r8 s( \! H" ^
< /p>( S9 _* D* z x6 n2 R5 u
< p>. [/ i% m5 x9 ^3 h$ K) h# u& }
SPI_Cmd(SPIx, ENABLE);<br />1 U! P8 m& T& m( H7 |
}
$ I* u; |- V G5 p" D1 ^3 H< /p>
9 m: [, r, k0 O& K, O) {, r2 Q- w o< p>
$ a, b- K) _0 G8 G <br /> b l; [! H$ z6 s( U
< /p>! y3 m1 s: K9 d: [/ {% W9 O3 Z. W
< p>
! m# V" R+ ^1 D5 z7 H static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
# A" T3 I! e; C( g0 u {<br />7 E, g T5 i# V( T, t$ w7 W
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
( ?$ E2 I1 r9 u K SPI_I2S_SendData(SPIx,data);% P4 e. ~4 t" N( }
< /p>
$ O: z2 }# `) Y< p># Q: N* c1 D2 v% o9 ?5 X
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />7 G G4 F- f* q( K- M( W. [' O
SPI_I2S_ReceiveData(SPIx);<br />" g7 B! o" x. [- S$ s
}
4 o4 W& u2 }! n< /p>7 A7 C; ^' R, a# H
< p>3 K- H" j- T5 S+ U: L% `
static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />7 s" {, Y3 ~/ B7 k3 T% F
{<br />
# E! F9 ^" D3 _9 X# S1 w while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />( z9 W9 D/ k: @ G* | D" T
SPI_I2S_SendData(SPIx,data);
& d v+ A: x2 H1 B7 E< /p>1 A5 Z/ k9 Y( V( o
< p>& }3 u4 j0 G. E/ U2 O# p) f' B: Z1 j
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />4 O& J$ `7 z% d0 Z0 f' q. \
return SPI_I2S_ReceiveData(SPIx);<br />1 l g* S4 ^9 a7 B8 r/ B
}) x6 P& U. ~" c2 R) R
< /p>. }: M# X6 A9 W0 F/ Y3 \: f+ o3 @: ]
< p>* b2 l& t" i7 M5 ~4 A$ S: y }& F
static void delay1us(u8 t)<br />
1 B5 `) p6 b6 F1 n0 y1 j {<br />
7 d- s: |7 ^% U0 T/ n: j while(--t);<br />
# p3 r1 a2 h9 ], Z6 { }
( Y9 F/ V W7 t# t/ j< /p>
4 w' }4 j, t' M+ k* R/ ]< p> p( z. [* A7 H, i' g) @* D
<br />1 K) M$ ~! A$ k H; a
< /p>
6 D# h& `2 X& T( _5 k- I* }< p>
4 y3 c+ L1 G I- Q3 @; x: y /****************????bytes×?????????*******************/<br />
; Q( t+ b+ a8 I" S: _8 _ u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />
) t, Q1 T% q. ]- s+ _. N1 N/ L {<br />
: y* x/ M: g; Y) h& f: n u8 status,byte_ctr;<br />' n- H; Z; m3 n. r3 e' E
CSN(0);<br />" j; z. v( G8 R- n9 k* V6 t- ]
status=SPI_Receive_byte(SPI3,reg); <br />' o4 f6 \* I, X6 L
delay1us(1);<br />2 P- i1 J' w% ~3 O( ]$ Q( w
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />
& A( I8 j0 n5 I4 j, `% a! c {<br />
( h1 m0 S4 |/ r6 w; ~1 o SPI_Send_byte(SPI3,*pBuf++);<br />- U0 V3 M) s. t# F) i9 A S1 Q
}<br />- T0 U: b2 ^% u% S. L3 k2 t O, b
CSN(1);<br />6 ~, b% L8 D: E7 `1 Y
return(status);<br />* j- p) p$ W) i+ z3 v6 [, K
}
- @. I' O, U/ Y/ F< /p>
4 z5 m; }% Y* K, S$ I8 |3 C- n& m4 w: P) _< p>: V% e& x* w9 i7 Y; w
<br /># j% k z* E, i! L( ]- I$ f
< /p>
) K1 Y9 {4 B: W8 z2 ?. z< p>
. V7 {) i: _3 O* V! ~2 J. J' _ void RX_Mode_2(void)<br />
1 }/ ]# N8 E8 p/ g5 B4 Q7 ]7 z {<br />- F O$ b5 g6 q5 i1 T- @
CE(0);<br />
4 S) F1 _7 r' q. U5 o: ~ SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />) u) S' ~- W" v! {& G! p6 Q
//SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />& |8 Y1 V& a0 r: F3 ?6 l
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH); <br /> F3 q" O N2 q {$ H! d
// SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
- m" E0 d/ s$ U5 J7 y: U SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00); // ?????????¨??0×???????<br />$ B) V, I8 c) S+ D& A) y
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // ?????????¨??0<br />
- b7 R" i% w. M: @& R q4 B$ R. @ SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40); // ?????????¨??0x40
4 m$ K6 y4 i- A8 N' {- n< /p>
8 R" G# w* a6 j) ~% n< p>* `& u5 [% \, O) X
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f); <br />" A4 L1 U2 V& n' @# @' s! d* B! m
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f); // CRC??????16??CRC???é????????????????<br />; w- W9 w ], R7 p; o/ G R# g5 M
CE(1);<br />
/ c8 }! ~" t: u$ E4 k5 L }
5 I2 c7 `0 o: n2 T h' w8 g4 @< /p>
% K( {% f8 X& B/ W |
|