EDA365电子论坛网

标题: SPI3多次写入NRF24L01失效的原因是什么? [打印本页]

作者: DuBois_1wwe    时间: 2022-1-20 14:51
标题: SPI3多次写入NRF24L01失效的原因是什么?
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
7 e$ a' a6 I4 O8 D+ D+ u</p>
5 y) Z8 y9 o- W2 j: e* o< p>
! _1 `! b& z& e9 L# B3 ^. d         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />6 A: j5 N, ^& J
{<br />7 e: Q$ Q1 M7 |6 L5 B/ }
GPIO_InitTypeDef GPIO_InitStruct;<br />
( @/ m# ?9 \9 }1 q1 N- z+ V SPI_InitTypeDef SPI_InitStruct;<br />
$ R! u" [, }* G0 q: Y4 T5 M6 LIF(SPIx==SPI1)<br />
3 C- ^2 K- D% W( W. F/ B, G4 a" \ {<br />+ L9 E; w9 v- y% l
   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />- L0 z( Q; _1 v5 s, i
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);  }& z; T/ B8 }0 W% ?' m
< /p>
( j: w  s: w  h' Z3 o, ?6 ^1 a< p># `6 Y) C: }/ Z* t4 A
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />4 e# ^3 C. Z$ o/ `6 d
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />2 x! Z4 l1 n8 |. A% w
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
; C  v$ J6 L0 T          <br /># H& p' j( G  v5 Z( k7 z
   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />" L% Y6 k( A3 {
}<br />* L& h9 G/ m7 Y& F9 o# Z  W2 I
else if(SPIx==SPI2)<br />) j1 x. L6 K7 O' L  H
{<br />
4 G1 s* J2 J# p9 i   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
( V8 @  |8 V6 ?1 Y5 `5 B' m   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);6 L6 B& I* P! [3 o5 Q3 Q, x& c' g
< /p>$ j4 Y6 I, o3 ?' J$ I8 V
< p>
7 c& }- w. G/ h           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />) ~- ~9 W* k4 b
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />5 u2 _& L$ Q+ b# |: H" W
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />4 u$ d9 ]: A2 I( N" U
   <br />" K, @% P( W  b& u' S
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />$ ^' v6 _- j% X8 N8 R
}2 T& S6 A3 \2 l% _8 `/ D
< /p>
0 K7 R9 U# H1 _( b8 S- E# r2 s< p>7 I- ?! n4 Z. t0 L
           else if(SPIx==SPI3)<br />
# @+ A# e6 W* \& i0 {( M {<br />1 C& N9 h: X) \* x  }0 r' M0 ^+ s
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
( y9 `* @3 ^, U: I# b7 Y4 M   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);$ I2 _. ?% ^' w, [. x! q
< /p>
" f" X) b  F, g, p5 b  }< p>
  `& @* q2 }6 G            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
/ S9 s. ?# w7 J' W0 m4 n   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
' {& `$ Z  w6 K' I   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);% n) Y4 @9 e: u0 i( [& I: @/ r
< /p>: P4 j6 _, m2 S" r
< p>
& J! l# n4 _8 y3 e           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
* h# Y3 c+ }- o5 l% Z   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />* M0 k/ z0 c3 m  h, b+ I
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />5 q% I+ B4 I5 z& @0 g
   <br />
' c2 g2 h! O8 k: x3 r+ j) i   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />  Q8 x' ]; ^4 y. a7 @3 s+ ]( Y3 l
}
: V0 q8 V3 }$ z1 u< /p>: {: y* F, a, C
< p>
: e8 ^8 }$ f. E: Z( V8 P# r          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />( M/ L) r1 `" m' r. U/ I
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
) R+ i' ]# |/ Q, b SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
/ s; U+ {: H- v7 ]- ^ SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />
) X4 H5 y% D' j/ B. Z% S1 q8 e* C4 x SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />
3 D# I7 X- X( \% ?! A& N+ ]+ `5 I' j% x SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />7 R" Z$ a' |5 ?+ ^6 q- `3 c
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />( Y$ U+ w/ u9 k( v. P% \9 v# ?, k1 L. l
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />
1 C+ i7 E' M7 K SPI_InitStruct.SPI_CRCPolynomial = 7;<br />0 \* ?1 f4 k8 R$ `
SPI_Init(SPIx, &SPI_InitStruct);
  ^% |) ]6 y5 [* G7 l< /p>  q  Q6 W6 ^; ?$ n" Z$ }
< p>
* L2 Y5 Z# b. |- f% E7 H+ \% c          SPI_Cmd(SPIx, ENABLE);<br />
4 \( t4 _* b9 p3 m/ O" n4 Q }
' i' J; B8 F( @# M( H< /p>
3 c$ F% q) |- s% v* n+ W< p>
# D. z5 Q" c* g: B% p( t1 Q" y         <br />
% v! s) U9 l) i8 c2 s% C< /p>
, j% U# r" d3 z' u, _< p>' C8 k+ c& w8 d& B! B) L: _$ u# h! m
         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
. k3 Q* r- e4 J# D9 n {<br />  Q8 U# m% q0 U  x, R. @
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
4 ~0 S* B% V" F: B: v! r; Z SPI_I2S_SendData(SPIx,data);6 N5 d1 y7 B0 p) L9 M* f3 d
< /p>- \5 K* G2 z# c) }
< p>
2 H' L5 d! w1 q% p          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />+ S9 |( ^( d# ?. E# i
SPI_I2S_ReceiveData(SPIx);<br />
5 P1 s# E+ E( @+ j }, R  J2 M$ I( M& l# E5 [
< /p>
/ i& E6 i/ y2 F+ [: @1 P/ Y< p>% c, u( M) w% @/ n# _' I0 `% `
         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />, l# x$ }! P1 t9 X9 w0 l
{<br />% W- x& H* \. M1 e) |
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
- P5 u+ c7 d3 f& t SPI_I2S_SendData(SPIx,data);
5 c( j, ^; L, d  ?  s/ E< /p>
1 t8 e4 w2 H2 \; D/ G6 g< p>
* Q2 R) K3 c5 A; b9 r- |          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
9 {' v, X- ~( _/ K3 x return SPI_I2S_ReceiveData(SPIx);<br />0 K9 e, D( i8 [  [
}
+ \" c6 Y% p# L< /p>
2 L/ u. [" ]% K7 w( J7 Y< p>
, b2 g, y! w  b8 n4 J& x: L, k: p( l         static void delay1us(u8 t)<br />
' {! D# j- h, Y- r9 U2 t( S* p {<br />
: ?, B  v& G$ s! K$ W/ Z while(--t);<br />8 ~, k/ W& r0 d7 X2 g
}
2 r* \- j4 l# r6 q8 T< /p>
" {/ Q" F! t1 V* O6 s4 W7 O/ y1 f. @9 n< p>
. L: g- x* l( ?, b         <br />( i- w" B! }8 V4 h# z' g6 k7 f
< /p>
2 c( A/ z6 O, N) Z  z5 l" ^6 |3 x; T< p>
/ ?! N+ |- Q" j' v# ]0 v- d; U         /****************????bytes×?????????*******************/<br />
6 u2 j. e% g: U  Q u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />% Y4 X8 I4 H1 q+ [3 e; l$ F
{<br />6 r$ `# u3 a. ~2 B. P0 A0 O
u8 status,byte_ctr;<br />
! p3 G1 D" r8 P$ s3 J CSN(0);<br />  i4 E2 S, H, g9 l; m( ]
status=SPI_Receive_byte(SPI3,reg); <br />
8 a. h, m2 y" ` delay1us(1);<br />  x# c* }7 l& L
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />
% W. D. @8 E, g4 ^& p$ x# T: F! ]8 k- }8 V   {<br />* w  b( J& m5 ^, h/ J) X
   SPI_Send_byte(SPI3,*pBuf++);<br />- @! {* x  H; {4 r" r
    }<br />
/ Y; F' M  |( S; K CSN(1);<br />+ t, O$ j& `8 n2 n6 o
return(status);<br />1 b) g% p9 Z) E/ `7 L
}
$ s5 x& d4 s. @- l! Z+ Q2 h< /p>
6 J; w; R7 u" D* _; G< p>
- M. C$ q- S: z! U         <br />
8 L- o! i) ?  b( Y7 V" n8 Y. X< /p>
6 N: H* u/ i) d  B) H( k, L< p>' g0 O8 }; x' l5 t; M( Z
         void RX_Mode_2(void)<br />+ d+ R; M5 V% U: U
{<br />, u) {9 C/ a$ [* _4 ^. C& c
   CE(0);<br />+ T' \8 \: h6 E+ l; f
    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />, A5 s, g% N0 V; A
     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />( Q  M7 C5 x% Z* F+ P! y
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />* i- u$ V9 ]  U
    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />! {2 T( s8 e4 j5 \2 [7 G
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />
, h# ]- g/ K1 q6 I9 R; v  Z    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />- T7 _0 `. M' u" \
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x40; e7 W3 I0 {1 a
< /p>
6 x: P' w, L: }* u6 `< p>
  C8 l2 ~$ x, T2 A4 F- o  r            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />
7 i1 Q- }/ J: l    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />
8 J! y3 _3 Q1 t2 _    CE(1);<br />* ?. T7 |- c) n4 M) F% j9 ^1 p$ \
}
2 Y6 j* M; V. x- `$ T< /p> / d. ]" ]% [5 R

作者: ononsiiii532    时间: 2022-1-20 15:48
SPI_RW_Reg_2();为单次写寄存器是没问题,写完之后,再读出来通过串口打印是没有问题,但唯独地址无法写入。
作者: House647    时间: 2022-1-20 16:17
换了一块ZE的开发板,出来的效果是一样的,看样子不是硬件的原因,配置出问题了。然后又看了一下仿真情况下,SPI3和SPI2的配置也是一样的。时序配置是一样的。问题还是没有找到




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2