找回密码
 注册
关于网站域名变更的通知
查看: 199|回复: 2
打印 上一主题 下一主题

SPI3多次写入NRF24L01失效的原因是什么?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-1-20 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。' L0 x( ^% w) k1 ~2 T1 s* n# D
</p>7 G: f. x7 b- ^! u% j
< p>0 B8 b0 l. B, M9 ?- ]
         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />
( y% N. S7 U- B8 D: \ {<br />
0 o6 ^* @6 ], b5 T& T7 | GPIO_InitTypeDef GPIO_InitStruct;<br />8 B6 y, f& H% N2 y5 v/ U
SPI_InitTypeDef SPI_InitStruct;<br />8 Y& k9 a2 i9 \8 V# J, N
IF(SPIx==SPI1)<br />
& Q3 b8 e& R8 w9 Q {<br />7 E9 N9 X* x: \
   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />
) \* b! `' E- B/ A" H   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);$ R) l9 j8 ]  j
< /p>
9 y: I, z; P& b& r# t< p>
5 D! A" a, m9 K2 i* w7 W8 `; \           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
6 P8 l, T& a4 I& ~( }   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
9 ]8 T( V2 i( u5 I  o6 |& L% p* ^5 o   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
$ V% \3 n# F1 f8 c          <br />- _" _* q5 K6 x  o" y
   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />9 Q. _# X. e* o  U* {7 Y
}<br />
2 B' h6 n" i+ L2 \7 T else if(SPIx==SPI2)<br />) J  t; w# y  j% N, v+ e
{<br />
/ K" K( f- V- ?' Q5 v   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />) R+ b/ |" j  s( Q7 q) h9 @) y- e
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
) z- \2 n* C$ O0 ^" y7 }( [< /p>& X1 w( t) R$ y1 E. X
< p>
$ m7 |6 w" E" w+ ^' N           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
. i& y: b5 V- g   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />+ N6 n" m' x- ]% h* D! N
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
5 k4 v! Z& `! w. q   <br />
; V" |0 o/ q( _9 r   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />2 d: F$ Y0 ?# {' y/ R5 y) a# y7 A4 Z
}
4 W9 ?- @0 ~! s) q1 o1 b< /p>& @5 ~% s9 l: B0 e9 o
< p>7 Y+ G; ~) B) Z) \* _
           else if(SPIx==SPI3)<br />- g  L, h! a" w
{<br />$ q6 A5 w3 ^( Z' F# Y
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />* c: [1 ^( K7 q% F: O
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
: H4 F* W/ j% c' r6 E; D< /p>
" W7 W1 O; \1 q" ?9 Y" ^< p>( e5 p9 L: ^+ C8 }
            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
5 }7 K; l) O7 f( P; }  M2 P   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />$ O- L# o1 J3 V% i
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);2 n* d8 q9 ?3 \
< /p>7 d/ V" G' w4 [" m/ v: U# z
< p>
6 \2 a  H  J& [  o$ o6 x; ~( |           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
( v8 |8 ~& C. r5 |% }' }   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
0 n( \" _5 x/ u: {+ w) B0 R   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
9 \5 Y4 H# o  X  }   <br />
' r) n& q/ h, r/ R# T: L, k2 T   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
% \; T3 n$ F8 U- v( { }1 U. i9 l2 j8 \8 y
< /p>, C( w7 P) u# T
< p>
4 ~8 o9 P( U# Q! T" s9 `5 i7 X3 Q          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />9 P/ c9 W( n- z4 {& b5 B/ N" G7 Q
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />3 @6 H1 N% B1 k7 ?* j5 |
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />% ~5 N- W% |4 |, j4 w
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />
, O! w% q# ^5 @2 s& W6 t SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />$ s6 B# q* s+ p. m# T" ?- k0 c: W
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />
; a3 E2 G' c3 N0 j) V7 J SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
/ ]' C4 B  }- b SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />) {; D" I' o% W7 T' j& y2 q
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />5 l9 G5 B3 g' u9 O# p; k
SPI_Init(SPIx, &SPI_InitStruct);
- p8 N9 T0 C5 Y6 a0 t) Y! m$ L" y< /p>
  [3 I; Q$ J1 P3 z( m4 B# e# |< p>
  V% i, D) _/ o          SPI_Cmd(SPIx, ENABLE);<br />
( \: y8 s2 b" Y# [( t; x }% S+ I- e+ ]9 B1 B: e' L* `
< /p>
3 |* Z9 c4 A/ D) B< p>
. T+ @/ w8 S# _         <br />
' a& _* P0 d0 e< /p>% y6 X; f1 H, X% U0 ^& \5 `6 [. c
< p>
; N0 K& w" {" G2 b# u         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />( t7 {) g8 k# i% [. j! o
{<br />
# Y5 F  }6 [5 E) T while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />& n9 ~  H' N2 r8 }  p9 y9 t
SPI_I2S_SendData(SPIx,data);7 P& n. k8 j* r8 \4 D& C8 X
< /p>
  ]( w5 U" v2 h/ n1 f3 y< p>
; m' f$ v8 |& B1 l* Y          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />, o& o! ]) ~, g3 @7 T) ?
SPI_I2S_ReceiveData(SPIx);<br />) k; k: A$ Z( P4 G4 {( m! W
}* U( P4 P& s3 w2 l/ ~! F
< /p>: f, k( o6 {" T. D
< p>0 k6 |8 A) L4 g! j/ U; q8 k- X
         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />2 E% c8 J% q( E" p
{<br />
" _; S1 O8 l( j" r! D/ o) d while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
2 ~- X. H+ O4 Z. O SPI_I2S_SendData(SPIx,data);; l+ Y0 I8 ~* J/ X0 E
< /p>
, G/ K5 @% M) D! U5 l: D) O< p>
9 L( F6 }( P# ^" M% v& C          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
- V" i8 U1 U1 ~ return SPI_I2S_ReceiveData(SPIx);<br />
/ H4 Z. h7 Q' y! r' \ }! B' I& o8 Z2 Y: K
< /p>
1 c7 t7 t' v! [4 O  z< p>
: P) L. S: M  T9 b. I         static void delay1us(u8 t)<br />
! m9 B2 y/ J2 g0 H) q2 ~3 N9 `+ } {<br />
- @& C1 z+ G8 P3 E# C$ J* e while(--t);<br />
/ y* c0 X- c1 b: F7 `# U }
- h! {' I# {: u- ?/ }7 l< /p>
, w- i: b3 O( Y4 D< p>$ H6 Y! j$ i' s' g! r; G( R: E  s
         <br />. u; n! X1 \% d; p2 s5 q
< /p>
" T3 H& \2 N; Q  O3 K< p>- l+ q; b* n9 @( O2 U
         /****************????bytes×?????????*******************/<br />9 I$ J: u3 C! Z
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />6 o/ J' a: p; m  k2 X7 p
{<br />7 L! E+ N5 r- y
u8 status,byte_ctr;<br />6 R' b" a( s/ A: O2 w
CSN(0);<br />
! i9 p; P, d6 J5 l! ^ status=SPI_Receive_byte(SPI3,reg); <br />& J# V4 L, C1 r! U
delay1us(1);<br />
  I7 n1 J. R& U. V  m& u for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />
; }- D% \6 I/ J  Q5 K   {<br />3 k2 l9 A. C  K) b5 w: Y
   SPI_Send_byte(SPI3,*pBuf++);<br />
" `7 w! Q$ \& U: a* g    }<br />$ Y* D3 X, d  U  n! r# x
CSN(1);<br />7 s) V3 l) L, a, n6 \' b% A
return(status);<br />
; y; h0 c) x' o7 W, N }
5 j4 B& ~. H/ y0 S. ]3 b< /p>, {6 x, a; H' C9 X+ ^9 c3 _
< p>
  z: `# x6 w* C. P4 [         <br />
$ ~( K' u5 m4 J! a+ D) m3 g< /p>* G( r1 `5 \! x. r/ j1 U' v7 k
< p>
, @6 a" J4 D5 O  ]         void RX_Mode_2(void)<br />
8 w4 G2 }% V3 b/ Y' P {<br />$ y5 ?- ~3 Q3 s5 L4 n
   CE(0);<br />
! `) b0 a9 B; K  z6 \    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />9 b) Z# o) c& m  T) D
     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />
% U2 X; N$ v8 S1 {  f6 g    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />
4 ~( E* ^! L6 F  x5 \' k+ ^5 L    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
8 P" `& x5 ^! T3 W9 J  @    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />
+ I6 F* N' A/ Y* A# i0 U5 L    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />- i5 c) T, M9 s- v( d. o. S! C
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x40. |; b* D8 J6 |# S( P: d% V7 m1 l0 O
< /p>
) @! m% O1 k. g( D" d< p>
6 C* |- X* N5 `) q! D% y            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />7 k  H4 d# X: @
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />, F* w6 v) C4 m  I
    CE(1);<br />; X3 U0 W* ^# |! \, k5 X
}
, I; j! S1 v. l/ g' ^2 H< /p>
" a3 L' \. h- l& W2 Y* O. I, `

该用户从未签到

2#
发表于 2022-1-20 15:48 | 只看该作者
SPI_RW_Reg_2();为单次写寄存器是没问题,写完之后,再读出来通过串口打印是没有问题,但唯独地址无法写入。

该用户从未签到

3#
发表于 2022-1-20 16:17 | 只看该作者
换了一块ZE的开发板,出来的效果是一样的,看样子不是硬件的原因,配置出问题了。然后又看了一下仿真情况下,SPI3和SPI2的配置也是一样的。时序配置是一样的。问题还是没有找到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-17 06:43 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表