|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
/ G# J7 o0 N, { x</p>2 m, ~2 A, S1 W% ?% A
< p>
7 c% O. ?1 G8 z6 k1 W& g3 H( b static void Initial_SPI(SPI_TypeDef* SPIx) //??????IOB????<br />$ X' q0 n, x7 S% ?% `' O8 g
{<br />& E$ { x3 m: y/ G8 S9 }! l: y& ^
GPIO_InitTypeDef GPIO_InitStruct;<br />
- O3 t3 q# }$ @+ t SPI_InitTypeDef SPI_InitStruct;<br />$ E; `- Q6 b* t* P! I7 m" `8 V
IF(SPIx==SPI1)<br />8 I6 p5 e# d: f- i. N% `
{<br />
5 M! l2 Z. E) M- P0 p* } RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />/ O B. T: K. d5 B
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
. e4 [. h/ }7 I" P3 {& G+ X1 J< /p>: M: w7 r5 }% q% V; P. T' m
< p>
/ E! p1 c$ U% s" z( e2 O$ Q GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />' q0 F$ H) i5 W% f4 g" v9 ~1 i9 b
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
1 A* T' r- ` G GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
, b' U3 N5 g- d' c/ ?% e% y <br />
* X q6 R( a8 z* i8 x+ _3 `3 z GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
, S, M, R2 m- w* H: |( q# U }<br />6 ^0 P* n$ M% Y& l0 j1 s- a
else if(SPIx==SPI2)<br /> A7 K" O% L- H8 I5 Q' Z) y& g, H
{<br />
: o# w# [5 M* Z& |: d% Z RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
6 ]" f& W6 d" ^: r RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
+ I% p& Z( }) ]2 _" @5 i< /p>
5 ]% Y( t. v9 s( T0 e R1 e1 A& p) S< p>" h" O+ U* g4 Y! j5 F! z
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />0 x7 i2 L2 }0 M! F6 `" u8 h7 o
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />/ W+ l, I5 s) z/ h T5 Y( x" s+ V
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
( n+ U3 E; B& K! s& M <br />- W" i) p+ W' P! i
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />7 p* ]* _0 [, T/ s( `+ B. W- j0 ]4 B
}
- W6 H3 _( i- x2 F< /p>/ R1 w9 \. a& Y; O4 h
< p>" @; j6 C" _. C& p- ]8 d3 l- T( \
else if(SPIx==SPI3)<br />
' z4 ^9 @, ]- o {<br /> @4 c* B' V% D# K# s: W
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
% H5 \# [( `# w8 a7 v RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
$ H* Y5 B2 t" @- X7 k. c; _6 U; n< /p>9 B6 m9 s9 B- H: y) F; F
< p>4 X# k) o' I) J* Y/ ] w
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />2 x, d0 v% `3 w
//GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
4 D) F2 R' ?/ |/ o RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
; O m7 k0 E r& a# T2 v< /p>
! G( G" p: g2 [< p>/ u3 d8 b% n* S' N2 s( s" O
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
# ]" ]* P4 ?/ m/ F0 x; R GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
3 y/ B) U/ T& y5 ^2 u GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
% D# \- X1 H) H3 q3 } ]8 a$ M <br />7 B/ w( F- K! b, M
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
' ]: a7 q( \5 o7 C$ f3 ]1 }, B }. C# q5 Y; S- B) ?/ d" y- h3 t
< /p>
1 ]9 I: R1 P! I, W0 k< p>% A0 H3 D' l* t
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />
( S& n! {* b+ u/ r1 D SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />2 F _9 O" M+ ~1 g' q2 `6 z
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
! z: W4 Z d' ~4 q SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />
1 p1 A, w: B' Z4 a9 d SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />+ ~6 x6 l; m3 y' T4 L
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />
2 Y* J% x- e! N7 P5 k& G9 m$ i SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />/ ?7 }0 D+ ]' j
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />
; n& {* t/ P' M% u& c SPI_InitStruct.SPI_CRCPolynomial = 7;<br />2 F7 x$ v: g2 k
SPI_Init(SPIx, &SPI_InitStruct);/ X& q4 O: u, \& A7 [: F/ }0 t
< /p>& \( L7 p- E7 f/ s4 i) b6 i
< p>
# H* P1 Z4 s+ @9 V L! P+ | SPI_Cmd(SPIx, ENABLE);<br />
]! G! t% y' \ }( b g6 L% K; P# H
< /p>
3 _" t$ w5 F5 Y! Q1 k5 w< p> B8 o6 Q5 x( a+ e% |" i
<br />
/ M" x3 H7 A% n# }5 H< /p>
" z7 |- S2 p' y( b: |. q0 p1 h< p>- k0 q6 W6 r0 c' X* ?# ~$ V5 |% P
static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
9 \0 Z9 A9 J9 b/ B! q- q% y: o {<br />5 |' r/ I; e t( J
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />* l: f C- D. v8 @
SPI_I2S_SendData(SPIx,data);
5 v, Q( K2 p9 B$ d. L- d' X, P7 {< /p> o) g6 T/ n2 r5 R
< p>+ ^" I0 C7 Y. R" H& F# x+ U4 ^8 \
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />; A7 v% S& T' J% o# q' E3 P7 e: R
SPI_I2S_ReceiveData(SPIx);<br />) g, O+ f: x2 I. ?/ X
}0 |3 v1 b3 z3 n+ g
< /p>& s1 X" `; P# g! B2 L% m
< p>; w4 k$ d) k9 B9 t" H
static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />1 `- _5 A3 d/ X& e4 U
{<br />6 z O( v& G4 ]" I$ A
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
J; `3 W/ N+ m* h8 g SPI_I2S_SendData(SPIx,data);
+ Y7 q7 G. f! B$ s( U6 G, c< /p>% g0 f. Z8 |! B1 L. u6 T) K2 {8 l, s
< p>* z8 Z6 z: q3 f. T
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />4 H3 L* u: H9 E! M
return SPI_I2S_ReceiveData(SPIx);<br />
& R/ |& `, W: u, Y5 V }
& {; U9 A) x1 _$ y$ {# e< /p>
$ l3 ]' S, L; I- d" Y R9 V9 N< p>
0 x, U4 U% L6 P* K; R( { static void delay1us(u8 t)<br />
( k0 X! Z2 [9 k6 b {<br />
; i6 m+ I% t- a" H+ ~6 P while(--t);<br />
) l9 O+ t% L( S8 q }
4 l5 [2 A& E, w" |; W) _9 _) B( k< /p>
y4 g' B* M8 E$ i1 w5 `< p>
( Z$ E2 z! m. o+ O5 y) v9 ]% _, c8 { <br />
( u; j+ C& D" _+ _' K< /p>
, [( \/ N# U' { C" R$ F< p>4 v( `9 r1 z* a3 m
/****************????bytes×?????????*******************/<br />
X' \2 j) x7 [* K u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />
0 r/ ]% Y% c( b, f& E {<br />
6 U" R& f0 y7 L( C7 W u8 status,byte_ctr;<br />
k, W) F- t4 A" N' s CSN(0);<br />
" n2 s- a8 I" |' f' i status=SPI_Receive_byte(SPI3,reg); <br />
& T2 P% b, e3 H- ^; r: ]2 ? delay1us(1);<br />
4 [1 |* h# o- I; V for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />- h0 e: v% D; R# _5 s/ A
{<br />
. d) o' G V; n7 [1 M SPI_Send_byte(SPI3,*pBuf++);<br />/ @4 }/ j- A4 f8 x
}<br />( {" d& E9 y& V; [0 V1 |9 `
CSN(1);<br />& u" P0 P4 W9 _; C& q
return(status);<br />! m$ Y3 A0 `6 i$ \# \
} f2 S- H; o4 ]" k, U+ A
< /p>
n: s/ U$ R; x! \< p>$ j5 m) X, j. n) d' D2 J% e
<br />
5 s! W+ L' G; {3 B0 [( }2 c" h* d< /p>
0 _4 N% l" |9 H( _< p>
9 O3 z/ Y3 j, A! e0 U- U1 [! M" C void RX_Mode_2(void)<br />; ^* {1 v7 j5 T. \
{<br />3 A! ?8 Q5 x( R9 O) r7 `/ I
CE(0);<br />' U/ ~2 _4 S P- x- y, c1 E$ J
SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />& d2 N( D3 H7 T
//SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />
; s+ ^" _8 ?; d$ N, H SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH); <br />3 u: W. I* [$ e' O" b
// SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
. | y# g& |- ~ SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00); // ?????????¨??0×???????<br />
# U( o' D. Z( e m$ T SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // ?????????¨??0<br />8 N( p% D# e+ m9 [/ x/ D
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40); // ?????????¨??0x40
$ c% S+ _! h& \+ v) s< /p>" d- E9 c, _2 x
< p>% S- f* k7 G) P+ S/ |% S
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f); <br />: Z5 U4 S% S4 a, M. Z9 \
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f); // CRC??????16??CRC???é????????????????<br />
* R2 Q' H" d9 r* W4 V CE(1);<br />2 c {9 u% s# T' w0 M# m2 O
}( D& F9 Z, U" s% k
< /p>
q" e( v! H) l3 ]2 X% t |
|