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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
/ o7 c; Y  y- p5 n# e( Y3 M3 g</p>+ s7 k& B0 [% u) H5 L1 J0 c
< p>
4 _& _) D" D4 u  a, x$ ]6 L         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />
3 [3 ~; }: K* g4 ^# x& _& V {<br />0 X/ k/ }0 R' e, R( T4 P' f  ?
GPIO_InitTypeDef GPIO_InitStruct;<br />( _9 I8 e2 X) a
SPI_InitTypeDef SPI_InitStruct;<br />
5 q5 m, z" L- [( _* Q8 j8 j7 jIF(SPIx==SPI1)<br />+ @$ k3 W: h# s5 m: E. |
{<br />$ p* F, G( T% b; C3 X- t
   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />7 y7 _1 z5 V$ }1 ~1 b. `9 H8 W
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
2 K; n; |0 Q" v7 q< /p>/ s7 a: R% K7 E7 `4 e  q
< p>
) N: S% b" F- F$ r- e           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />2 a6 S# m8 Z& u5 \+ H: M
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
4 ^4 u# t( S. Y9 \; j) b/ P1 `   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />  |% u8 N, K, _
          <br />2 t1 A7 c! R% g' E; I$ u  m, L8 t
   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />" h# {$ S3 N7 L& x4 Q' J
}<br />
$ v, s% }& ~' r else if(SPIx==SPI2)<br />
+ y# G% K9 g; a% |2 N7 Z {<br />3 g4 {9 V9 y$ [4 }% n9 D+ c/ ^
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
+ X. B( ?5 e3 A0 l   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);3 y, Y0 o0 {3 X0 G$ N
< /p>
8 m4 |( j3 q" y5 f6 L< p>
! X: ^% \" O) q           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
0 W3 c2 d9 [! V$ f# g# g5 Z+ C% U- Q' t   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />" \  B" h3 m2 a
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
% _; I" e# q' h/ b   <br />
6 }! `. C& J8 `) y: ]- Q8 O* C   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />% w- C% K1 d2 v' j
}5 `6 e' x0 d" r& Z6 ~: R2 P
< /p>2 x$ @$ R0 q7 w' I; C7 A
< p>
* G$ R8 e; @5 r. }% q4 ^1 w8 T           else if(SPIx==SPI3)<br />1 h3 Y  W% v( x- |. f; @! u% H
{<br />
; \* @. H1 o7 R   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
$ O$ w5 a$ P& {( X% u5 Y1 k0 P   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
( T! G7 U0 b, l  \" }< /p>+ }0 q  I, Y7 P% y$ k$ B/ W9 y
< p>
$ o: h& C  A2 @9 h5 m            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />% C' ~- r& F; W' F3 C9 J# K0 m% T
   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
% m2 q9 e1 D; Z" E5 Y   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);/ o* |" x: J7 ]- v& i8 r1 z% l
< /p>
  }: z8 [. \2 o) {< p>, l9 Y7 u- R) g. n2 h3 W6 O
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
# J- N) c+ r% w: R. N. L! R8 z" G   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
+ K5 ]7 P; a1 \  @) h- S   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />8 u6 g3 A8 T* M  f
   <br />
. |0 d8 I# `  F  ^  J6 T8 D: B   GPIO_Init(GPIOB, &GPIO_InitStruct);<br /># i8 R3 j1 _/ u  e* c5 k6 m
}# v( Y: b8 t" G
< /p>$ N" k) |# y' g# J$ ^
< p>
* H* j) {9 y( S          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />2 w* R& @5 ~6 [& _# p% A
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />' k+ M; j/ G5 R0 j& w+ l
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
/ ^; {, J# I; d& V2 j SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />! p; h5 f: }6 s( v- P
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />8 I: I, s1 V  B: h0 y8 G" `
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />/ x" k" A8 E% Z. u- d, i  X2 V+ v9 V
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
# r+ k1 X8 f$ N; {3 z3 p  q4 V SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />2 p9 d5 s, j6 {3 c
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />7 t1 J* L6 U# w. \& {
SPI_Init(SPIx, &SPI_InitStruct);8 k4 D+ r8 s( \! H" ^
< /p>( S9 _* D* z  x6 n2 R5 u
< p>. [/ i% m5 x9 ^3 h$ K) h# u& }
          SPI_Cmd(SPIx, ENABLE);<br />1 U! P8 m& T& m( H7 |
}
$ I* u; |- V  G5 p" D1 ^3 H< /p>
9 m: [, r, k0 O& K, O) {, r2 Q- w  o< p>
$ a, b- K) _0 G8 G         <br />  b  l; [! H$ z6 s( U
< /p>! y3 m1 s: K9 d: [/ {% W9 O3 Z. W
< p>
! m# V" R+ ^1 D5 z7 H         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
# A" T3 I! e; C( g0 u {<br />7 E, g  T5 i# V( T, t$ w7 W
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
( ?$ E2 I1 r9 u  K SPI_I2S_SendData(SPIx,data);% P4 e. ~4 t" N( }
< /p>
$ O: z2 }# `) Y< p># Q: N* c1 D2 v% o9 ?5 X
          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />7 G  G4 F- f* q( K- M( W. [' O
SPI_I2S_ReceiveData(SPIx);<br />" g7 B! o" x. [- S$ s
}
4 o4 W& u2 }! n< /p>7 A7 C; ^' R, a# H
< p>3 K- H" j- T5 S+ U: L% `
         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />7 s" {, Y3 ~/ B7 k3 T% F
{<br />
# E! F9 ^" D3 _9 X# S1 w while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />( z9 W9 D/ k: @  G* |  D" T
SPI_I2S_SendData(SPIx,data);
& d  v+ A: x2 H1 B7 E< /p>1 A5 Z/ k9 Y( V( o
< p>& }3 u4 j0 G. E/ U2 O# p) f' B: Z1 j
          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />4 O& J$ `7 z% d0 Z0 f' q. \
return SPI_I2S_ReceiveData(SPIx);<br />1 l  g* S4 ^9 a7 B8 r/ B
}) x6 P& U. ~" c2 R) R
< /p>. }: M# X6 A9 W0 F/ Y3 \: f+ o3 @: ]
< p>* b2 l& t" i7 M5 ~4 A$ S: y  }& F
         static void delay1us(u8 t)<br />
1 B5 `) p6 b6 F1 n0 y1 j {<br />
7 d- s: |7 ^% U0 T/ n: j while(--t);<br />
# p3 r1 a2 h9 ], Z6 { }
( Y9 F/ V  W7 t# t/ j< /p>
4 w' }4 j, t' M+ k* R/ ]< p>  p( z. [* A7 H, i' g) @* D
         <br />1 K) M$ ~! A$ k  H; a
< /p>
6 D# h& `2 X& T( _5 k- I* }< p>
4 y3 c+ L1 G  I- Q3 @; x: y         /****************????bytes×?????????*******************/<br />
; Q( t+ b+ a8 I" S: _8 _ u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />
) t, Q1 T% q. ]- s+ _. N1 N/ L {<br />
: y* x/ M: g; Y) h& f: n u8 status,byte_ctr;<br />' n- H; Z; m3 n. r3 e' E
CSN(0);<br />" j; z. v( G8 R- n9 k* V6 t- ]
status=SPI_Receive_byte(SPI3,reg); <br />' o4 f6 \* I, X6 L
delay1us(1);<br />2 P- i1 J' w% ~3 O( ]$ Q( w
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />
& A( I8 j0 n5 I4 j, `% a! c   {<br />
( h1 m0 S4 |/ r6 w; ~1 o   SPI_Send_byte(SPI3,*pBuf++);<br />- U0 V3 M) s. t# F) i9 A  S1 Q
    }<br />- T0 U: b2 ^% u% S. L3 k2 t  O, b
CSN(1);<br />6 ~, b% L8 D: E7 `1 Y
return(status);<br />* j- p) p$ W) i+ z3 v6 [, K
}
- @. I' O, U/ Y/ F< /p>
4 z5 m; }% Y* K, S$ I8 |3 C- n& m4 w: P) _< p>: V% e& x* w9 i7 Y; w
         <br /># j% k  z* E, i! L( ]- I$ f
< /p>
) K1 Y9 {4 B: W8 z2 ?. z< p>
. V7 {) i: _3 O* V! ~2 J. J' _         void RX_Mode_2(void)<br />
1 }/ ]# N8 E8 p/ g5 B4 Q7 ]7 z {<br />- F  O$ b5 g6 q5 i1 T- @
   CE(0);<br />
4 S) F1 _7 r' q. U5 o: ~    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />) u) S' ~- W" v! {& G! p6 Q
     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />& |8 Y1 V& a0 r: F3 ?6 l
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />  F3 q" O  N2 q  {$ H! d
    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
- m" E0 d/ s$ U5 J7 y: U    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />$ B) V, I8 c) S+ D& A) y
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />
- b7 R" i% w. M: @& R  q4 B$ R. @    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x40
4 m$ K6 y4 i- A8 N' {- n< /p>
8 R" G# w* a6 j) ~% n< p>* `& u5 [% \, O) X
            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />" A4 L1 U2 V& n' @# @' s! d* B! m
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />; w- W9 w  ], R7 p; o/ G  R# g5 M
    CE(1);<br />
/ c8 }! ~" t: u$ E4 k5 L }
5 I2 c7 `0 o: n2 T  h' w8 g4 @< /p>
% K( {% f8 X& B/ W

该用户从未签到

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-10-9 00:10 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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