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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
9 _1 P( V/ i; E, n% Y1 m</p>/ d' a/ q  y4 g3 K3 U6 V5 g) w
< p>4 z4 _, [) ~$ N7 _
         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />
) O9 t1 o/ H7 a {<br />2 J# F* {5 k( U
GPIO_InitTypeDef GPIO_InitStruct;<br />; A: }1 G- y, o' n# L8 B; b/ D
SPI_InitTypeDef SPI_InitStruct;<br />
0 {$ X9 \  ~$ p( Z, i, WIF(SPIx==SPI1)<br />
: y8 ~. ?( b9 ~$ I+ @* E {<br />
9 w8 P0 j6 p$ h. c  @, S& c   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br /># g  i& ^1 r0 G# q
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
1 F7 E! Y# B$ s( n3 t< /p>9 P7 K# i( i' p+ R& N5 E9 \7 ?$ ^9 `
< p>: r1 v# D( r- L$ X/ |, H
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br /># m) X/ y9 j* n7 O+ S: m2 D
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />+ N/ x$ ~5 W- D8 p7 G- u% c* \7 E! }. ?
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />" X) z4 c: `8 G
          <br />
5 ~) `4 r4 B% ^5 M0 y- q; e   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />2 n) ~6 b1 R# u1 H& U
}<br />7 v( d: @+ P4 u  F% e' v/ O
else if(SPIx==SPI2)<br />, J& f& p. N. {& N
{<br />8 r; _- m% r, S7 x( w! S" W" c) t
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />8 Q2 r. ^* f& ~/ u0 E
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);7 b, z! v$ \( m/ r8 j0 A) \
< /p>8 n) X) i" H1 k5 Z  y+ h9 ]
< p>1 n0 |. [8 N: G4 {" a9 X
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />+ r7 T+ o, N1 f
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
  s: |  t* _# m4 O   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
8 D! H) J, v  Z3 v5 b4 @; W% r   <br />
+ @1 S0 \- F/ G3 O7 U8 I   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
1 O: S5 H$ s9 O3 J4 L' k }
' Q/ e  S5 J  \4 [9 j  L$ j4 t4 c< /p>
+ K; E$ n/ C6 A* _* n2 \/ N$ }< p>6 i# K" j% g- g5 t- ]0 [) \
           else if(SPIx==SPI3)<br />$ K; L$ |9 P" z5 L  w- S) V
{<br />
( M7 R! n" H* Q   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />, H) f+ L, I( v/ v+ y  t# ^! m
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);5 L. X! V3 u6 i  o& M3 T; a3 A
< /p>
' u8 c+ @7 M4 P< p>2 D& U1 o) A! u# g' }
            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
8 R; I' I9 W( ~. O6 b- r   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
) Z0 A( g, b: {. A: z! l: o( g   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);# t6 G" x  `: }" P+ @
< /p>$ B7 k% ]( S  Y) i3 W2 Q
< p>9 N. l$ i; X! w
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
" x3 C9 l: R6 w3 B; w   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
0 y# G; b6 v2 `! ?6 |. T3 y- \   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />% Q4 k- k3 C1 r( P4 C
   <br />, E" }) d5 y- q/ Q
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
5 E; U' ^6 m( l0 v/ o& p" J }
- z& e  D% t) a/ c/ V; Y< /p>
6 ]: e# n9 N, q8 y< p>8 W# K6 u) A. t+ D3 y
          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />( k/ C- l8 |% z3 N/ q3 S
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
: q/ `5 V0 N' o1 F5 T SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
* s6 z4 d2 z6 x3 m6 r SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />6 n6 L- @: p1 L& ~1 C% I# u
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />
  t/ m2 L% L! c  l6 D5 Z2 R SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />. q. N9 V6 |& w2 O& m5 x% _8 c
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />4 w! V9 ]& _0 `9 H  K! Y- r
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />, x$ K: ~7 }, K1 E6 Y
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />
; G& q6 a4 h5 }" R SPI_Init(SPIx, &SPI_InitStruct);
, J$ t) j1 F7 n9 ]< /p>
! X( Y4 G/ Z& W8 Z< p>$ I7 ~6 q) P4 ]6 U9 Y
          SPI_Cmd(SPIx, ENABLE);<br />/ ~+ |  |3 Q# v; T! B
}3 P9 a" @; N! n3 k. r" j
< /p>6 ~- Y7 p7 }8 n; E7 R; ?$ m3 a
< p>
! h+ }) D1 v( x9 G& u5 a         <br />
6 q3 x3 ~1 N( z- m% _) X< /p>, R# S( i' b0 @$ a4 U, t2 {1 ^
< p>9 U/ Z5 X3 T. q5 b7 g3 k
         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />( z4 i9 h) |1 ]0 D* K
{<br />& v0 k* @( p6 ~* c' W4 V
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />  @- |1 x' w0 K( B9 j
SPI_I2S_SendData(SPIx,data);" U; P* n6 |* @9 c! X" b
< /p>6 z3 a- u* k' P' @
< p>
8 E3 {7 ~- q5 e4 m6 L          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
! D0 N$ p  }$ R5 g' i- k/ J SPI_I2S_ReceiveData(SPIx);<br /># M% `9 F9 l# y: @$ x/ e) t% e
}, r4 l' j3 Z  j
< /p>/ l* `; p7 k' ^0 [" q, m
< p>+ c% [, i" |" p
         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />/ H' d- B' g6 H9 d5 b5 M( Q! p
{<br />* V% P( Y3 R2 }
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
! Y7 H: I/ a/ ^- ~+ h SPI_I2S_SendData(SPIx,data);
! i0 ^: M! v* h% U< /p>
1 H5 N  h+ [3 z' i) B< p>
3 P4 A! ^3 ?5 w+ A          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
4 s. r2 K# T  }0 k. R. l, r return SPI_I2S_ReceiveData(SPIx);<br />
8 G1 N8 ^* Q2 Q5 x }4 L% W! ?% C7 z3 B4 Y! }
< /p>
* b2 V# h/ ^' [/ M6 ~- ?+ H0 P< p>( W- G. ?8 _5 P. b% X
         static void delay1us(u8 t)<br />
+ h& o4 ?2 A. n, h! r6 f* ? {<br />
# ]! ]" J* i- _' B5 b while(--t);<br />1 Z2 y* p7 t: {- d2 l& B
}* Y' l% h: n1 d% f# x$ n+ o. `
< /p>
4 E3 M- M9 @8 h- Q< p>! T& L8 `& a$ L1 q8 k
         <br />9 F+ u. W/ K& I# ?9 y. Z
< /p>: @- N7 d- H7 F0 L$ k! R* }* [! J
< p>
, N, N: h' p& t1 U         /****************????bytes×?????????*******************/<br />$ U/ S$ q, [! h$ A! p6 g
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />' Y/ k/ p/ M6 B& g9 A" z
{<br />
7 v5 A! `4 t0 q+ [& G9 U# t u8 status,byte_ctr;<br />% C6 o3 `& J& x- [
CSN(0);<br />! L* A+ I3 n7 V: G4 Q. L" o$ K* I
status=SPI_Receive_byte(SPI3,reg); <br />0 X5 o0 V* u; d) V4 C
delay1us(1);<br />
8 J! D% p& l' Y" k; h for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />
& ^4 _* B+ c& S/ @% k   {<br />* E  _/ t8 D' w0 f! s
   SPI_Send_byte(SPI3,*pBuf++);<br />
) \' O4 J2 K" A: o& f0 z    }<br />+ N+ Z9 s7 L2 f# p  s! C4 n
CSN(1);<br />
$ Z7 @- Y* r4 | return(status);<br />
3 ^( j  d/ P2 G/ [& k8 C6 h }0 }) [4 o9 d( G3 Q
< /p>
/ d. w; S8 C9 c7 O  b4 i; N0 f* Z< p>
0 Y+ W- H( @9 u. v         <br />) m7 [/ G# b, x2 }! L7 N
< /p># L: s! [9 y0 l
< p>
; f- X4 l1 s/ V1 {6 u         void RX_Mode_2(void)<br />
' P7 n8 a1 J/ {3 y6 R5 E0 L {<br />
' ?# E6 c2 f8 q8 _7 b; @6 \   CE(0);<br />
* z2 Q5 e: |% X4 A    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />
9 x; K# f+ j1 Z5 H7 ]     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />
/ u- ^/ ~2 J# f# l1 W( [    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />
1 p9 Y3 S8 O% Z' ^+ }9 t    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
+ }% G4 g/ h* N# A$ v, t) V    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />0 }* g) {- v0 b4 C" {9 ]& _
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />
" ]+ Z' H' \/ [+ h6 K! m6 O7 g    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x408 V1 t* h+ ~. W# D$ r' Q
< /p>
$ _+ q! y* c* l7 r( r< p>' l" {" U3 \6 R: m+ _+ J# U1 P: K
            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />" D4 A, O" P, D4 Q" \" P/ }$ C3 s/ L
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />) M2 N% K( ?/ B: \7 f. ]5 p+ l
    CE(1);<br />
7 x0 C2 W4 H$ t/ W }# H* [: q% Y7 {) t: s
< /p> 6 g( Q: x/ Y* ~8 b) \4 l) n7 h

该用户从未签到

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-11-24 14:51 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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