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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。, `9 h) W% d; G8 K- u
</p>
) b% J& _! ^9 l5 w6 B< p>
' s& }/ y( [" G7 m  s3 r         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />
- ~9 c5 Z! M6 i' w {<br />
6 x! t" q! k# p, ^5 W; b3 `. Z' X GPIO_InitTypeDef GPIO_InitStruct;<br />
4 K$ E7 a9 o7 U& l3 w SPI_InitTypeDef SPI_InitStruct;<br />+ E) v* N0 {$ v% \5 @( F
IF(SPIx==SPI1)<br />
9 j& n* k* s( _; E {<br />
# h( o; m! M) B% C! X- f( b   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />, V4 @3 F: N  L7 S
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
5 |6 }+ v3 c. J* \< /p>
; H% e; r. e( }) x< p>8 z- |& P7 E3 D0 R' l3 Y
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
7 B5 t, I" M  f0 s- `/ i! j1 S   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />; W; H# a7 |* G, v# [  Y& K, [
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
3 h6 A3 c; X6 r( f4 G" c6 F          <br />. c( A% \( m' `/ h
   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />" n+ R8 ?$ t* `9 ?2 Z4 a& v
}<br />* H$ }. r6 r) `, Z. J- N8 e0 |* L; X1 }
else if(SPIx==SPI2)<br />
* M! }) z4 B5 W' p% j5 t$ ?2 U5 v- I {<br />; Q- z6 b$ x% ?: R- {
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />1 F+ }# a5 f  w! G$ z& o0 {
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);5 y0 z% V* w9 I
< /p>0 ]8 K* t1 _- s8 }5 z- }
< p>7 Q7 t: O7 P# f& A% z
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />& K8 c/ A) j, H- X0 a2 Q! d! f, l
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />4 @- g+ _5 R8 I2 ?/ N) E
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />% ?- Z% t  H  ?# _
   <br />; i7 T: ?7 u; X/ K, P
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />- k+ g- v2 u2 H/ V( y9 V
}
* {4 u" ~( `$ |& D, ]5 D+ v< /p>
  M. i+ {% Q9 g* t7 L. u< p>4 g( f. b$ q3 e6 _
           else if(SPIx==SPI3)<br />* L+ P' X' \6 S4 a  z4 n4 Q
{<br />
  ?( h3 j8 t& z! d4 j& G0 J, e   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
/ w2 F' N) i' R) v   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
  l! J! Q) x3 u' ^# z' ?< /p>( U7 B2 d6 t4 m
< p>
& R, Z- t; w0 u            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
7 `$ x, l. L5 v. l% F   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />: z6 v5 F) a1 M2 \# x" f
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);1 n' @6 ~' j( h: q6 a4 t3 A
< /p>. H7 x- o/ n# a4 t  {, J: k: d8 b( F
< p>
5 P: m1 P7 J0 J/ `) c6 I1 S           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
0 d5 I( q. D: \5 q   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
) ?2 v; f" c6 ^0 ~   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
7 O8 h# m" W+ ^5 |   <br />% p: ^0 I) e+ N# `! P
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />6 c' ], }/ T6 H8 W' W) Y* L
}
% x2 ~7 A. C8 ^: M< /p>
# ^9 q# y7 I! G, i7 O5 ?< p>0 l* g% B2 o! s$ n
          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />5 h9 d1 L$ U/ K' V6 X5 b: \
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />" [6 f: ^+ x: S
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
( R3 G* [8 _. M5 n2 R  V SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />
8 O4 W0 u6 `% j% F! @/ ? SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />7 B# j2 J$ p! _+ W
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />9 f1 ], X: N' I8 J0 K+ G- H+ Y
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
2 g" Q* a4 d6 ?) g" G: Q$ ^' c/ t SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />  t! m* i+ B/ P* V# j3 T- `8 Q4 {
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />
* o5 T  y2 r1 P! i8 ?  k# B SPI_Init(SPIx, &SPI_InitStruct);1 @, H) n+ \0 ~) s3 C
< /p>3 y7 c5 V% S8 l- @) w
< p>: \8 G# a1 h0 \' Z* Q
          SPI_Cmd(SPIx, ENABLE);<br />
1 a" Y1 V. u5 ]* L }9 w, F. \$ d( E! Y8 P8 @1 p
< /p>
0 l2 w! N4 n" y, N< p>( Y- g' z8 w; ~/ l+ T% [- u* {
         <br />, [1 P/ d% C% i/ I5 Y' M
< /p>
; J, w" y* I7 E$ X0 ^< p>
1 Q, f2 n8 [! H: |/ d, I         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />* Q3 J% @' V' f+ U4 v4 r8 r
{<br />
/ M- w2 D& ^, z* i' a while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
& A( H5 ^$ x0 C3 u& p  Y, {8 t SPI_I2S_SendData(SPIx,data);
( a% i5 x/ z5 }6 u2 S& u2 n  N< /p>& @" K/ C5 `3 X7 ^
< p>
; F! `& y  B0 k7 |          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />) j* c, |8 o: L: }# d4 P# j
SPI_I2S_ReceiveData(SPIx);<br />1 ]' [* o. z( m$ `/ h* t; H9 j
}5 L  z! M4 g5 Q, M
< /p>/ z$ b) X+ w" T- X9 w. N
< p>& }! y% B2 Q. |; E5 [$ j9 W
         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />% Z3 \1 z7 G/ z
{<br />+ Y2 B: y2 c+ k# U, c9 ]
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
. {3 x+ {! L9 [ SPI_I2S_SendData(SPIx,data);0 d( D; l' `% d" o8 z6 r. \- n' J
< /p>  T. S3 H$ d. Y4 R
< p># h% [( }" O# Y% U
          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />$ Y% Z4 Z; D6 S; ~/ J$ ^- U# w
return SPI_I2S_ReceiveData(SPIx);<br />
7 X; O2 A- g2 T3 o. [! V) s9 g8 J" q }
) k/ m' n) B# y4 ~7 m( s< /p>
5 I- a8 ~; N  R7 @9 E) k9 w< p>/ G7 t  l* F# f9 k8 [4 @8 }+ E
         static void delay1us(u8 t)<br />
2 W' c5 w& |  R' H% T {<br />
) ?# v2 M* k0 l0 }5 R7 V while(--t);<br />2 U8 T/ u- D( g  t+ V
}2 T! N5 }5 v0 ?4 V1 m% s
< /p># b6 Z1 e$ P, `9 P! |% R
< p>' @, F- e: x- Z4 H
         <br />
+ R& G" b) B) M< /p>; h. x# d6 X, |, K; f
< p>5 {+ R; A7 G/ t) W
         /****************????bytes×?????????*******************/<br />" D7 H1 g" @" [
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br /># u; D' K) O/ v& P5 m8 h$ V8 @
{<br />6 l, w5 M9 H9 z" x! K
u8 status,byte_ctr;<br />
3 u" X  n& [4 k8 l+ I! l CSN(0);<br />. V6 v; h4 a7 i( U3 k7 k. d2 k: \
status=SPI_Receive_byte(SPI3,reg); <br />6 q0 B, V2 X& m' A/ q' d
delay1us(1);<br />
( b3 b/ u1 R) \0 d, R3 l for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />' Y" l  l3 I% F- s! N8 G* ^* @- M
   {<br />
. K: s1 s. }! o$ F3 R4 x6 t   SPI_Send_byte(SPI3,*pBuf++);<br />2 g. Q' C% K" n$ w$ R
    }<br />
0 x) X/ a# Z+ D% c) Y, T8 Q CSN(1);<br />
' v5 ~7 e3 D; r2 T: A, ^  N9 Q return(status);<br />
. Z( f; {9 i. J( J4 G0 _* ?; V; A }
; l0 G1 K" ~7 R< /p>
' ~% g  h6 `! u9 K' W& ^< p>  g; x0 ]/ S2 o& H& U# c  G5 Q# p
         <br />, s! V' F; T  p" h4 \# \8 p
< /p>
+ e8 ]1 K5 v$ R< p>4 e( A1 `0 b8 A
         void RX_Mode_2(void)<br />
+ u! a" K; m) v/ R3 }) n3 J& v3 r {<br />" {% ~7 T+ a/ z. w6 Y" D& m
   CE(0);<br />  u1 k# k* R+ Y
    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />  H, p* \& C# {8 C( X3 k% `
     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />
; s9 }2 M9 |+ I    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />& m& x- R7 U5 W
    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
2 p3 z* B0 X0 V/ V  C    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />0 Y2 [/ S7 S% O2 w
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />
9 c, f/ a5 x& ]" _1 B) s4 _' j    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x404 i( S4 A7 ?( e3 H2 t! l
< /p>
+ I: Q  |% m. Q/ e9 T< p>/ n: o$ B' b. o6 i
            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />
& `2 |0 F) v/ N8 s9 n1 [    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />
+ m5 X9 r1 B, |2 V; \, l    CE(1);<br />
+ z) x6 D$ n5 C# y' A }
4 w  R! m4 |4 E4 A2 v< /p> & }/ K3 ]5 J1 \

该用户从未签到

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-6-13 16:09 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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