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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
# k( |  K" A( |" {5 W1 Z</p>3 B) x: H9 U& s! B. F0 D
< p>6 `- s( }- O1 r7 O" a+ Z# c: Z; i
         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />& e1 \9 q( q) y8 S- `
{<br />
, o! b3 `; M. U5 D( K+ r1 t GPIO_InitTypeDef GPIO_InitStruct;<br />5 d  l4 G! ?( p) o0 N- s
SPI_InitTypeDef SPI_InitStruct;<br />
6 X/ u1 A$ f2 [; ~7 Q  |IF(SPIx==SPI1)<br />6 o& h4 k& @! _0 g
{<br />
4 b" K3 e) ~8 J& L' C3 H" Z1 ]   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />
3 x  [8 l3 f# q4 i, Q+ d& Y1 [   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);/ T3 q* D7 B8 J# C
< /p>
9 z0 L2 r# T! ?, P6 L; H< p>/ q% c# o8 U$ d! n. R
           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
, D6 W, G0 ^0 h, c$ H   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
6 [/ p2 I# T  A# i   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
# N* K5 j" y5 K1 o' n          <br />9 Q  F4 w5 |% l/ C( s1 D
   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
9 U; u3 R4 V" i0 M" m( i }<br />, `) x  n0 V- c9 v
else if(SPIx==SPI2)<br />
- M; ^6 v3 e/ ^5 n {<br />
. l* f& r: @! ?# z7 S: x1 i# c/ f   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />! F7 h2 b" W; Q- s2 C
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
4 h. r# r, F3 P0 G8 P" r2 `$ R< /p>
3 \+ |" f  d9 i# C< p>
! o! d; I2 @: [, W7 e7 J- {           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />, S5 [$ Y' b7 X$ z1 m) ]( v) O
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
0 y6 }+ g& D- z( F& P   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
& k: M5 E# ~# h* k' I   <br />( {+ J3 K; ~! Q
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />& y; }3 w6 ?! ?9 v5 b* {) ?
}5 H! Z* R- L3 K" X+ s$ w
< /p>, X8 {$ t* b, H) i4 a5 o
< p>- S3 V# w1 W2 n' @
           else if(SPIx==SPI3)<br />) R7 p% {8 ]  F! y5 Q) |* q( d8 ?
{<br />: k* W- R7 @% e
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
2 e! L, p. U1 w7 q   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);# m% w0 u9 J. A7 a
< /p>3 f/ d2 `' }: f) T
< p>
. D+ [3 \+ U6 h            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
2 E6 T( M) b, j' O4 l4 F7 H   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />  F  u( {/ g% l: }
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);% z8 o. y' j) Z, N# \9 Q
< /p>0 k( c. T" o8 z7 Q; n: ^: E$ T
< p>
; }1 N7 c( f0 w  X8 |! n# Q9 F           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
/ S( E: z0 W8 E4 k% }   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />, o) _* e6 Y, y( C
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />* ]! e3 f" t6 ~/ |
   <br />+ c6 d4 e8 G1 s' S5 E
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />  T0 O0 t, v& b$ j' y
}+ \. {$ X. Q6 J9 H7 E
< /p>
/ E# d: E' ^+ \9 G/ a, Z7 s0 A< p>
  E( Z0 H7 ?  m' m          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />% F" p" A4 A$ L' ^% @6 \' h' G
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
4 a9 d2 _/ `+ Y! M& c6 N SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />: s4 m+ ?  a3 d0 o
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />2 a3 m. @- J5 {% l' \& o$ w
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />+ ?4 f2 [$ A1 a8 U7 X1 Z
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />
- s- d( g/ B( M7 F9 B; | SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />: x3 m7 ~2 S# N+ J2 [
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />
" ~+ C! @. v: }, l SPI_InitStruct.SPI_CRCPolynomial = 7;<br />
+ F4 N2 ?$ I5 y2 m, {3 K0 E* K5 k SPI_Init(SPIx, &SPI_InitStruct);0 I% B% M* o) t( k  g+ U9 [# t! T, q5 s
< /p>% f1 A4 E& i/ X; I
< p>7 |- Z* r- _6 J# ]# S: m
          SPI_Cmd(SPIx, ENABLE);<br />( ]1 F0 P/ j, x; Q2 [
}9 m" M$ q4 p! t" [: }/ K8 D
< /p>7 U$ ^' t4 {) X. \3 [* b8 e
< p>
- I9 L9 S$ E4 X; ^  N0 A         <br />
9 I+ K, P$ |) k+ f' h9 k< /p>
3 R! O7 r" V7 q( J4 j, O& {6 \< p>, M  F( S. V/ A% v
         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />- T) R( T3 T! p2 q
{<br />
: _% r9 b( ^  g6 Q3 ~& ] while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
1 p4 A1 b, K/ L: V  m SPI_I2S_SendData(SPIx,data);0 c6 e4 x' q' D  x$ E0 Z  F9 H
< /p>
1 E& a+ R5 u' ~. H1 N2 Y2 O7 b< p>
5 U0 y( A* [# _# \          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />% e' Q( ^+ @0 w/ r. _4 V& D
SPI_I2S_ReceiveData(SPIx);<br />
* F1 k9 D" v  r/ \ }
( W. t! s5 n/ h1 O$ o7 ], \  {5 y( n/ N< /p>
& U& A, Z0 R7 O5 p3 O- Q< p>
6 R7 r0 `( s# O/ f, x         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />
" @( q% L/ g! J& w# A5 m {<br />4 X3 N/ ^' V; H8 N% s
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />! {/ P4 Q5 R" u! `9 Y
SPI_I2S_SendData(SPIx,data);7 j4 E' w9 W( b
< /p>+ e1 T9 j+ f. Q1 g& f
< p>
" I" q1 x- @2 W; H/ c          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />4 x, A: L( c2 k1 o, ]  l3 U! x% k* `3 W
return SPI_I2S_ReceiveData(SPIx);<br />
6 M) r8 Z5 l9 v0 h5 P }
5 ~3 x& b/ I! x6 Y< /p>
: s3 w4 u& j2 [  c+ L+ b< p>
4 L! L6 C8 F/ S8 ~6 T1 ~: N" d         static void delay1us(u8 t)<br />
2 a. \0 P- P4 A9 r1 P9 W' d7 d {<br />
2 Z) F# O- I/ k' Z# g while(--t);<br />2 B( Y- V3 M( f: A/ g
}
1 D! V7 K, e2 z' v) |3 c9 P< /p>) e* L$ ]! q! A* {9 ^
< p>( m8 ~+ P6 C/ E2 Z8 P4 r( Y
         <br />, N. L2 ]8 u  \% k5 i3 m% }! x" q6 k
< /p>
; L0 C, i4 b% _- \2 R# m" S< p>% [  U9 U( X# \0 B4 {. M
         /****************????bytes×?????????*******************/<br /># c' e7 k5 z) S1 f
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />
0 V8 J5 L4 G- C0 a! [. d {<br />
0 z* |4 X" n5 K7 [ u8 status,byte_ctr;<br />
& k- ^9 ^5 P7 p7 v CSN(0);<br />% P& f# ?, }9 E7 |* w3 y
status=SPI_Receive_byte(SPI3,reg); <br />* _: N+ @/ ?( x* i
delay1us(1);<br />" x; ]$ \" ^, ^8 q6 v
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />* v+ l1 `# |7 B+ g% i
   {<br /># O) f& i0 p2 Q# @" d- q- N
   SPI_Send_byte(SPI3,*pBuf++);<br />
9 |+ {$ }, `/ v8 U, [    }<br />
7 E- h- p4 ~$ m0 I4 M CSN(1);<br />
  y/ ?. ~0 E6 z" r. k& D: f( G return(status);<br />
1 e' H* f! f" ] }- x; x* {1 N5 ^: D. \5 ~5 S5 N
< /p>: y' h3 s9 J' b/ D
< p>
; y0 H! ^& q, K2 e* K" U7 s! e         <br />9 s$ H. H( z. Z& ^
< /p>
( J( W* k$ _; C6 O5 c# l< p>- P9 t# ?: q! C
         void RX_Mode_2(void)<br />
4 o( M* ~" F& k& f+ A/ K {<br />
( a4 b! r- A1 w6 w) Z   CE(0);<br />
* L6 o* w1 c$ x5 e4 n. h5 |" c    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />3 ]+ S  \5 N) O! ~0 {2 B) x. F- S
     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />% [2 Q+ _! p! t$ y4 m( L" ]( a
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />
* |' m% C* q! @& _- k; y    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />9 p# E5 i$ A) N, q
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />3 s0 R" i" E6 x7 V& a# _
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />
, \3 o: J! S" h, D# I! d    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x40! [; K* U! F! e5 t
< /p>
- `# \0 N( _  O2 p& Y  `* j< p>
! k$ P7 ~( q/ ~0 q/ k, L6 y8 w/ c            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />
, q4 l, m/ K& q+ G    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />
' X5 A8 s9 h1 t: \# ]    CE(1);<br />5 h8 F3 T9 N8 s! p& H
}2 u; p0 J4 O8 ^& ?8 g# u
< /p>
/ W& V! [! M6 h1 J1 C; ~! V

该用户从未签到

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 22:12 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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