|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
6 t. r! d' t9 L2 g( O; W2 b* q+ o</p>
7 X$ B" _+ S3 J8 \ T< p>
1 [' a" N: _3 ]) Z0 q) I static void Initial_SPI(SPI_TypeDef* SPIx) //??????IOB????<br />2 d3 J' }2 n7 d0 O' ?8 n
{<br />2 H( B) N( E8 m8 @
GPIO_InitTypeDef GPIO_InitStruct;<br />
* ^. Z* f( k" q1 C# @. U* X SPI_InitTypeDef SPI_InitStruct;<br />
, n, G/ I& G6 A- O- ]0 c: |IF(SPIx==SPI1)<br /># x2 `) o1 V& G) W
{<br />
. P, D5 r2 u4 V RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />
! R$ ]4 @" H. |7 _( h RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);$ J; w4 |( y' q/ n
< /p>) o: }1 X5 z* A& o: o4 c
< p>
$ ~* N- W' r5 c9 c GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
d |: z9 E8 G) Z# p! e. o GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br /> v4 \2 y# Z3 N5 ~8 d& S
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
1 ?' k u8 C( J. R/ H1 d) g <br />' u: V+ u6 H& T
GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
5 j2 \% L' h! h4 ` o% g- P }<br />
: J0 `; ^0 t" `/ f# ?! } else if(SPIx==SPI2)<br />
( B9 g5 e3 `# U0 m {<br />! ~4 K1 s9 r+ i; b9 m
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />1 p/ O) V# T- }# |/ C
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);3 Q. C6 t( W- t& X4 p' O
< /p>
& l- N4 X/ u/ U- R" X, Y7 `< p>
9 m' u( G2 L! G7 Z- r- T GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
. ]$ g- S, c$ y. ^- T# P6 o" A GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />6 g5 i" e) x# x
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
5 f% T8 ^. Q5 p <br />' L! ?% p. d7 N6 {' c$ D
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />9 \0 y2 }0 d4 P3 p1 C& b! j4 n
}
/ ~ C+ ?5 E- B2 T+ e1 Z$ R: I< /p>
- H; R8 D+ m5 T( j< p>
& O9 u6 j8 b$ S else if(SPIx==SPI3)<br />
7 V2 g6 P" S6 _" A+ o, o {<br />
1 G3 k$ \8 O6 r( @6 g6 T( {3 y RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
- i$ _: W5 T/ h; F0 i0 p9 H9 a" D RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
( q: y' |+ z+ `" y; _' o< /p>
" f+ S; q2 w4 j( _4 u A< p>3 X% o& Y3 J/ C C6 W4 n/ S
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />; [* Q2 F# s& X
//GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />8 W8 v( B% p! _) C5 A9 H
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
$ @* n! V4 Q% G& t< /p>% l* j( u) P' H8 q: X
< p>
$ z3 T) k: |3 n7 M- A GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />9 Z2 `: l- w9 `9 n. ~% }
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
c2 C# Y/ F" [% ~ GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
. y0 |. j7 r' ^, Y <br />
n8 J. Q' R8 u1 F1 F2 c$ o GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
) n6 n4 W$ n& G/ e2 J+ w }
9 J: }5 f( s2 y- j< /p>
: ^, l: s; o- c0 i2 @< p>2 V1 E( L# E4 j; E2 s |4 @
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />
1 A8 J# ^' _" L! a8 P5 M SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
/ g9 ~( z0 Z/ C. n7 ^* p5 c6 v SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
( ^! o f9 L4 E SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />0 Y# B4 u7 Z* I" ~3 x
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />: f$ U* [. W% ^! g
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />
& R3 r4 h( D7 s. B3 c V6 Q+ b SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
! _: V) a, R) M" G+ K7 m0 n5 x. b8 _ SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />
) E' L: G8 h! u/ k' d3 O SPI_InitStruct.SPI_CRCPolynomial = 7;<br />' P' Y F7 L% m1 W; y
SPI_Init(SPIx, &SPI_InitStruct);
' r |' j0 L0 {0 j; n4 L1 T' g< /p>
7 `, e9 ^! f# ] ?1 C0 F< p>
8 y# g6 M1 I! B SPI_Cmd(SPIx, ENABLE);<br /># \" @8 I9 ^- i- @( |
}
% K0 ?9 S; @! m4 z9 z8 a% f< /p>" H# J) ]" o6 c$ q
< p>$ Z, r. J& q9 x6 O5 M0 ]0 @# r
<br />
- X+ Y) u7 Q" ]! A< /p>/ q4 U: F. C' [- W/ S
< p>
/ R0 x+ w! B/ k static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
+ B& r+ m+ y7 y, q& u. A6 q7 k {<br />2 b( H% J; [* W' D! Z7 N/ R* I
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />) ]4 ^3 \; M9 a$ ]
SPI_I2S_SendData(SPIx,data);) z3 `. G- M% k: { F) I9 k
< /p>& o8 t% b% ]& P/ a" `# m8 M5 _8 X
< p>
: v' ~. `3 b2 R+ W3 l0 C2 w% k- E& V while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />9 E& ]! d3 U' H* u- T( o" ]
SPI_I2S_ReceiveData(SPIx);<br />
% E& e, n7 b6 h& g) _3 P3 B }, T# f( P# r; R* m2 J6 T
< /p>
5 o5 |9 J* j+ J' {$ z r% H< p>
0 x0 f2 g- Q3 q1 @ static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />9 F* T/ n6 O2 ^5 H( _/ m- @
{<br />8 g$ F# B7 a, p" o G9 x
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />. o+ L% J3 v! o+ ~; k! }" Y3 v" y# p
SPI_I2S_SendData(SPIx,data);* U% l4 f) q, b1 {' E
< /p>
" u+ C' W/ Z P2 i+ z! y& `< p>
+ Z4 v' i3 I# p1 x7 S+ J; I+ n) z$ k while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
$ p- H% p4 q6 ~" f" `! {% N return SPI_I2S_ReceiveData(SPIx);<br />
( n2 J; m- l4 c" g8 S( Z$ n }
- l& I) T' l: g' a* P1 i6 o) |: F< /p>
7 g0 C( @4 Y5 C9 n" W< p>. `( b4 E. x4 S, \
static void delay1us(u8 t)<br />2 C6 X1 f, N* B. s& b
{<br />
/ k0 ]- p- C! H! r& g& R- x while(--t);<br />
4 H7 T3 ?! a) l D6 g. h }% I- i' V. ]6 O* C% g
< /p>
5 u; o3 A8 Z- L u0 |- {< p>( B* ^5 a, Y' S1 B1 J
<br />8 e$ U; v4 [3 t' c7 W
< /p>% t/ [7 ]" P8 V" f" `
< p>. M+ u0 }8 i5 P* |
/****************????bytes×?????????*******************/<br />
" l" C7 E. D q u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />
$ R3 a$ u2 g3 Z1 ~2 j {<br />' P9 `4 A: ]* f2 O" v! j% I; [
u8 status,byte_ctr;<br />
/ J" ^' I4 k$ X8 H6 r0 R CSN(0);<br /># }$ E6 x" @1 a2 U, r" H
status=SPI_Receive_byte(SPI3,reg); <br />' j$ Z7 W, G2 ?9 Q) \" c
delay1us(1);<br />/ L- n+ q9 k# O# \# A
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />% T% s' ^5 _: {5 T
{<br />0 ~, Q& j! \9 f$ @7 b
SPI_Send_byte(SPI3,*pBuf++);<br />
3 `4 @+ u1 T3 h4 w( k8 a" R2 [; X }<br /> ?( z, q+ p9 H3 E# O- e( ]
CSN(1);<br />
k8 ~- ]2 e* ?3 s( T return(status);<br />
$ r' ~! s, [4 P }
4 z7 {+ x( T8 }. c4 c< /p>
! Y- s* d7 ]& ^8 e< p>
8 P' S( e' _. E0 Q0 S: n# N: y <br />
8 @( o8 t6 s1 o3 a0 y< /p>5 J# j1 q* r$ [' `
< p>
7 C |1 ~$ }* l6 D9 U void RX_Mode_2(void)<br />& V$ \: g: s5 w3 _ q4 S
{<br />
1 A6 h- e( i- j, k# z/ z( y CE(0);<br />/ F- v. N& t- r# o" Y, a, ]) r
SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />
8 G6 Y# q5 F+ b' P5 O# y) | //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />9 s# x, g" H4 K4 D0 e% W3 i
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH); <br />
1 b2 ~; v6 r! l8 r2 A // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
3 d! f/ g6 s- a SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00); // ?????????¨??0×???????<br />9 F: c f$ j3 w8 F# Q
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // ?????????¨??0<br />: I- Q0 Z5 } h1 K
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40); // ?????????¨??0x40+ U% t2 ]+ o4 M! N# ~3 X# y
< /p># B$ D f8 x1 N. n
< p>6 ^. u5 x, z+ O2 K, o0 K8 V
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f); <br />! t' A0 Y& c, |# o9 C
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f); // CRC??????16??CRC???é????????????????<br />
& R9 L* {" p% n- f' k8 ^8 y CE(1);<br />
6 D0 K2 ~$ F6 _ }1 P3 x+ ]* e6 W4 f6 ]& _
< /p>
) B; P, \' L2 a |
|