|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
2 A. ]- ]+ V1 c</p>
3 E( Y. y5 t0 ]: J& z. x% o< p>
9 t$ {( R" B x( R5 e static void Initial_SPI(SPI_TypeDef* SPIx) //??????IOB????<br />
) [2 N0 F" Z+ U% ?3 Q- K {<br />
2 _3 q$ s3 \; E+ x1 K GPIO_InitTypeDef GPIO_InitStruct;<br />
+ M9 K. x. j6 j! o: P0 F* [/ g SPI_InitTypeDef SPI_InitStruct;<br />! U; k7 t8 Y* V" g, ~. C# Z
IF(SPIx==SPI1)<br />. N7 ?/ r+ o+ X, z% ~ i7 ~" B
{<br />; C6 Q6 X' P+ w) `
RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />, u; k2 T( c1 ]
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);8 s# g1 u$ \! P6 d4 x% {- M3 b
< /p>
$ k4 T5 C6 h1 h( |< p>
% t" K |- ?! c" o! Z( c' q GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
2 S# r. U. O, z* Z GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
1 ?! L. r/ A: m3 I. @( c* A GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
% c0 T& i4 H" D/ J# X1 }6 C* U <br />4 r/ p; E, X" G" O
GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
a8 B7 u/ F1 F }<br />. n o$ `. d; O3 l8 Y. |# i
else if(SPIx==SPI2)<br />, L7 N3 D0 Z' I3 C9 N
{<br />
, K4 ]6 A1 Q! A: Z4 M RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />/ U; x3 R2 T! V* _
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
" U1 _0 l+ h, O% j& O! N3 n; B< /p>4 k8 Q; S9 A& s) @
< p>
% {, ~$ Y* z: f, U9 j GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
4 d: U+ K4 p7 `7 w# u6 J$ h ^ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
1 q6 g2 J, w0 J! K! k4 w GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
# N% C v( }% d; q& {/ M& W# W! M <br />
* h2 l/ ~* y# s2 d) H; i GPIO_Init(GPIOB, &GPIO_InitStruct);<br />+ k9 j g8 G j4 {% g
}
3 n: y& I5 U# F/ ?' r* V5 W1 N< /p>
z- y3 ^! A+ H4 G: m< p>; _$ @8 D5 D$ `. T8 s" t3 U2 a5 T8 b
else if(SPIx==SPI3)<br />
& R" L$ W* ?3 t: P; E2 b8 n# s' _ {<br />& g! n8 N0 \) o3 S/ Y5 F9 d
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
8 x6 q( u8 V8 S1 S" I RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
- |# _# N/ [- K) g< /p>
2 a# H# J3 A3 L6 k5 G+ f- h< p>
- O% {) V2 I. G GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
$ z, E2 |- N" Q: ? //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
0 W& ]3 K1 Q3 d5 B RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);; b& }# H0 h. H) Z! v) r
< /p> S `; B9 t, O/ a c0 D# z: k
< p>
D2 i+ p" K7 P GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />0 Q' c& ~ z% ^& d0 V6 ~2 e" y+ G5 k
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
& L* [. `0 b) t GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
# G% Y C6 r: C4 J, l! o <br />7 U6 m4 c. q9 m0 |+ r/ \
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
/ }1 ]- R) g7 [+ c }
3 [( e I' a& p3 v9 F9 e% |# P< /p>
0 P8 c! g3 C3 u( {+ l6 J< p>6 F: i! ?& J' U% S, d
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />
6 C* b3 f5 Q7 J; i SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
, w1 R0 x& D# r SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
- W; s4 F" a2 T SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />3 d4 f2 P4 n; P8 C, n2 M
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />8 q* P8 Y' u9 x0 s' E7 g
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />5 Y8 N! j$ H9 [! y! ?' Y
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br /># \6 X, a( v/ g4 F
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />, V, Y. P( R5 ] p6 n# D$ t/ u( h
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />$ g7 S' j' }, I5 w
SPI_Init(SPIx, &SPI_InitStruct);
$ z! m. z- ?9 ~7 l7 w9 r8 V$ s0 i< /p>
1 h, O( w& y5 |) _- V& v2 E G) L< p>
. f) @/ l2 b5 G, ^" K% a' }# ]$ S, K SPI_Cmd(SPIx, ENABLE);<br />
* H) k5 @7 [* Y; @ }
# Y6 ]% O$ h+ W7 d< /p>
. v: e+ F2 l! l# ~6 c% H9 {( \< p>
8 g ~( ^: q" M$ X/ H+ x* V; O <br />) x( X& N' `1 R% v& I3 X
< /p>- I K& x9 I; W; d- W
< p>8 Z% r$ `: j6 q* U
static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
/ _) x! L2 m' u ~) {9 U" |0 m* s {<br />
5 H- N5 n6 q5 C5 a while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
& p4 E& Z1 y% K SPI_I2S_SendData(SPIx,data);
* H% _! x4 p/ K$ E6 ~& D0 s' x& t< /p>7 t' l# {. s( N) {
< p>3 H' p( s. L1 S" y3 @, L
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
& C1 t$ Y6 E% f4 B# ~4 g% E SPI_I2S_ReceiveData(SPIx);<br />
( X7 W* _3 l( |# y/ G) x0 | }) S# t0 R, Z! c' o
< /p>( j4 U% r- i; `
< p>8 F2 b$ P: p; a3 X. I$ [
static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />6 G4 R* n$ f3 }$ F+ D
{<br />: W" h8 e! z: q
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />, \0 M+ t/ d% Q* d$ b
SPI_I2S_SendData(SPIx,data);
3 D, r: t0 M I2 `< /p>
/ w$ G& Y, G' k( v. q< p>9 Q+ Y. P* c' X
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
* a% ^$ k5 Z+ Q7 s return SPI_I2S_ReceiveData(SPIx);<br /># R! T( U0 v. J+ ?2 y0 J7 V g
}
/ ~, E( U3 {, d. v1 j< /p>/ i R& o: R" R
< p>
# K L0 H. a# ? static void delay1us(u8 t)<br />, r9 V0 P3 A" M% ^
{<br />) l2 U! W( w; L q, Y4 ?' l- _
while(--t);<br />
8 j9 V' {) |# r% D+ i2 C5 ]) C }
# F. Q/ F8 k! u! ~' `1 Y9 z< /p>9 M+ {+ g+ f" r1 U" L" \
< p>
! U% j$ O" q) p, A6 q <br />
2 _8 n: q: h' a% x8 |! ^0 } V< /p>
0 E3 w& P- f) i1 Y0 t4 }1 B2 }: J< p>
9 ^! ?) O+ l8 K, d( B$ e* z9 O% i /****************????bytes×?????????*******************/<br /># P$ ]3 F) P) _- u v
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />6 O0 B. v2 D6 v \' ^& L
{<br />( ]$ r4 V( o. ^
u8 status,byte_ctr;<br />6 c) R ?% w: A/ Y2 M0 _/ b
CSN(0);<br />2 V v5 U1 G' }4 J
status=SPI_Receive_byte(SPI3,reg); <br />$ P7 ^; o. A2 o2 a9 b R- s
delay1us(1);<br />
9 F# i8 q8 e$ a) h4 T for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />% p9 ]+ N8 m8 r1 w
{<br />
+ |& `, }' y& x" Y' [( F SPI_Send_byte(SPI3,*pBuf++);<br />& T, I# x- |% x( U: H- ~
}<br />
# _$ c/ L9 S- }5 X CSN(1);<br />
, F3 C$ e( \* M2 m8 p& Y return(status);<br />
0 E0 C" [* \7 p" g4 S }6 x1 U* c: T! L
< /p>
7 \# F i' \/ I! N6 M8 Q< p>3 n- Z7 g& T# _: D: S) G
<br />
7 B D0 C; b7 q' p4 H* ^< /p>
4 [9 a8 d6 x' F9 A0 u< p># ~% G! p2 z9 {" ~8 Z6 p9 M0 q6 j
void RX_Mode_2(void)<br />
$ w% e; h5 R, w {<br />1 h0 k1 `! k w. e( E* {
CE(0);<br />
2 U L# S# |- Z SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />
) f2 V/ d( f; [ I. F# ? //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />, \* g5 s' r( y5 u( B: q& U% z7 B
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH); <br />+ W {8 o/ z7 H
// SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
" E' t) N! f# P S SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00); // ?????????¨??0×???????<br />9 }1 J4 R/ z) w0 L9 c
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // ?????????¨??0<br />
2 n/ g; S& v1 J SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40); // ?????????¨??0x40
/ o, Y U- V* Z& v< /p>
. C% H* U/ Y; W6 v7 V< p>
2 J1 g/ }1 k) U" F( _ SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f); <br />
1 Z) a& l: C( s3 Q& e7 _ SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f); // CRC??????16??CRC???é????????????????<br />
+ |+ e8 x1 {& Y4 R6 V! v* C CE(1);<br />, A+ T6 J& y7 W9 d, A- J" v
}8 n' h b: v; d4 q+ f
< /p>
7 v6 n. X! E$ p4 T4 Q* d M9 ` |
|