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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
    最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
2 A. ]- ]+ V1 c</p>
3 E( Y. y5 t0 ]: J& z. x% o< p>
9 t$ {( R" B  x( R5 e         static void Initial_SPI(SPI_TypeDef* SPIx)  //??????IOB????<br />
) [2 N0 F" Z+ U% ?3 Q- K {<br />
2 _3 q$ s3 \; E+ x1 K GPIO_InitTypeDef GPIO_InitStruct;<br />
+ M9 K. x. j6 j! o: P0 F* [/ g SPI_InitTypeDef SPI_InitStruct;<br />! U; k7 t8 Y* V" g, ~. C# Z
IF(SPIx==SPI1)<br />. N7 ?/ r+ o+ X, z% ~  i7 ~" B
{<br />; C6 Q6 X' P+ w) `
   RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />, u; k2 T( c1 ]
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);8 s# g1 u$ \! P6 d4 x% {- M3 b
< /p>
$ k4 T5 C6 h1 h( |< p>
% t" K  |- ?! c" o! Z( c' q           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
2 S# r. U. O, z* Z   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
1 ?! L. r/ A: m3 I. @( c* A   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
% c0 T& i4 H" D/ J# X1 }6 C* U          <br />4 r/ p; E, X" G" O
   GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
  a8 B7 u/ F1 F }<br />. n  o$ `. d; O3 l8 Y. |# i
else if(SPIx==SPI2)<br />, L7 N3 D0 Z' I3 C9 N
{<br />
, K4 ]6 A1 Q! A: Z4 M   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />/ U; x3 R2 T! V* _
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
" U1 _0 l+ h, O% j& O! N3 n; B< /p>4 k8 Q; S9 A& s) @
< p>
% {, ~$ Y* z: f, U9 j           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
4 d: U+ K4 p7 `7 w# u6 J$ h  ^   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
1 q6 g2 J, w0 J! K! k4 w   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
# N% C  v( }% d; q& {/ M& W# W! M   <br />
* h2 l/ ~* y# s2 d) H; i   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />+ k9 j  g8 G  j4 {% g
}
3 n: y& I5 U# F/ ?' r* V5 W1 N< /p>
  z- y3 ^! A+ H4 G: m< p>; _$ @8 D5 D$ `. T8 s" t3 U2 a5 T8 b
           else if(SPIx==SPI3)<br />
& R" L$ W* ?3 t: P; E2 b8 n# s' _ {<br />& g! n8 N0 \) o3 S/ Y5 F9 d
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
8 x6 q( u8 V8 S1 S" I   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
- |# _# N/ [- K) g< /p>
2 a# H# J3 A3 L6 k5 G+ f- h< p>
- O% {) V2 I. G            GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
$ z, E2 |- N" Q: ?   //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
0 W& ]3 K1 Q3 d5 B   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);; b& }# H0 h. H) Z! v) r
< /p>  S  `; B9 t, O/ a  c0 D# z: k
< p>
  D2 i+ p" K7 P           GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />0 Q' c& ~  z% ^& d0 V6 ~2 e" y+ G5 k
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
& L* [. `0 b) t   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
# G% Y  C6 r: C4 J, l! o   <br />7 U6 m4 c. q9 m0 |+ r/ \
   GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
/ }1 ]- R) g7 [+ c }
3 [( e  I' a& p3 v9 F9 e% |# P< /p>
0 P8 c! g3 C3 u( {+ l6 J< p>6 F: i! ?& J' U% S, d
          SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />
6 C* b3 f5 Q7 J; i SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
, w1 R0 x& D# r SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
- W; s4 F" a2 T SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />3 d4 f2 P4 n; P8 C, n2 M
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />8 q* P8 Y' u9 x0 s' E7 g
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />5 Y8 N! j$ H9 [! y! ?' Y
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br /># \6 X, a( v/ g4 F
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />, V, Y. P( R5 ]  p6 n# D$ t/ u( h
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />$ g7 S' j' }, I5 w
SPI_Init(SPIx, &SPI_InitStruct);
$ z! m. z- ?9 ~7 l7 w9 r8 V$ s0 i< /p>
1 h, O( w& y5 |) _- V& v2 E  G) L< p>
. f) @/ l2 b5 G, ^" K% a' }# ]$ S, K          SPI_Cmd(SPIx, ENABLE);<br />
* H) k5 @7 [* Y; @ }
# Y6 ]% O$ h+ W7 d< /p>
. v: e+ F2 l! l# ~6 c% H9 {( \< p>
8 g  ~( ^: q" M$ X/ H+ x* V; O         <br />) x( X& N' `1 R% v& I3 X
< /p>- I  K& x9 I; W; d- W
< p>8 Z% r$ `: j6 q* U
         static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
/ _) x! L2 m' u  ~) {9 U" |0 m* s {<br />
5 H- N5 n6 q5 C5 a while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
& p4 E& Z1 y% K SPI_I2S_SendData(SPIx,data);
* H% _! x4 p/ K$ E6 ~& D0 s' x& t< /p>7 t' l# {. s( N) {
< p>3 H' p( s. L1 S" y3 @, L
          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
& C1 t$ Y6 E% f4 B# ~4 g% E SPI_I2S_ReceiveData(SPIx);<br />
( X7 W* _3 l( |# y/ G) x0 | }) S# t0 R, Z! c' o
< /p>( j4 U% r- i; `
< p>8 F2 b$ P: p; a3 X. I$ [
         static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />6 G4 R* n$ f3 }$ F+ D
{<br />: W" h8 e! z: q
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />, \0 M+ t/ d% Q* d$ b
SPI_I2S_SendData(SPIx,data);
3 D, r: t0 M  I2 `< /p>
/ w$ G& Y, G' k( v. q< p>9 Q+ Y. P* c' X
          while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
* a% ^$ k5 Z+ Q7 s return SPI_I2S_ReceiveData(SPIx);<br /># R! T( U0 v. J+ ?2 y0 J7 V  g
}
/ ~, E( U3 {, d. v1 j< /p>/ i  R& o: R" R
< p>
# K  L0 H. a# ?         static void delay1us(u8 t)<br />, r9 V0 P3 A" M% ^
{<br />) l2 U! W( w; L  q, Y4 ?' l- _
while(--t);<br />
8 j9 V' {) |# r% D+ i2 C5 ]) C }
# F. Q/ F8 k! u! ~' `1 Y9 z< /p>9 M+ {+ g+ f" r1 U" L" \
< p>
! U% j$ O" q) p, A6 q         <br />
2 _8 n: q: h' a% x8 |! ^0 }  V< /p>
0 E3 w& P- f) i1 Y0 t4 }1 B2 }: J< p>
9 ^! ?) O+ l8 K, d( B$ e* z9 O% i         /****************????bytes×?????????*******************/<br /># P$ ]3 F) P) _- u  v
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />6 O0 B. v2 D6 v  \' ^& L
{<br />( ]$ r4 V( o. ^
u8 status,byte_ctr;<br />6 c) R  ?% w: A/ Y2 M0 _/ b
CSN(0);<br />2 V  v5 U1 G' }4 J
status=SPI_Receive_byte(SPI3,reg); <br />$ P7 ^; o. A2 o2 a9 b  R- s
delay1us(1);<br />
9 F# i8 q8 e$ a) h4 T for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />% p9 ]+ N8 m8 r1 w
   {<br />
+ |& `, }' y& x" Y' [( F   SPI_Send_byte(SPI3,*pBuf++);<br />& T, I# x- |% x( U: H- ~
    }<br />
# _$ c/ L9 S- }5 X CSN(1);<br />
, F3 C$ e( \* M2 m8 p& Y return(status);<br />
0 E0 C" [* \7 p" g4 S }6 x1 U* c: T! L
< /p>
7 \# F  i' \/ I! N6 M8 Q< p>3 n- Z7 g& T# _: D: S) G
         <br />
7 B  D0 C; b7 q' p4 H* ^< /p>
4 [9 a8 d6 x' F9 A0 u< p># ~% G! p2 z9 {" ~8 Z6 p9 M0 q6 j
         void RX_Mode_2(void)<br />
$ w% e; h5 R, w {<br />1 h0 k1 `! k  w. e( E* {
   CE(0);<br />
2 U  L# S# |- Z    SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />
) f2 V/ d( f; [  I. F# ?     //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />, \* g5 s' r( y5 u( B: q& U% z7 B
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  <br />+ W  {8 o/ z7 H
    // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
" E' t) N! f# P  S    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // ?????????¨??0×???????<br />9 }1 J4 R/ z) w0 L9 c
    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);           // ?????????¨??0<br />
2 n/ g; S& v1 J    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40);                 // ?????????¨??0x40
/ o, Y  U- V* Z& v< /p>
. C% H* U/ Y; W6 v7 V< p>
2 J1 g/ }1 k) U" F( _            SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f);          <br />
1 Z) a& l: C( s3 Q& e7 _    SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC??????16??CRC???é????????????????<br />
+ |+ e8 x1 {& Y4 R6 V! v* C    CE(1);<br />, A+ T6 J& y7 W9 d, A- J" v
}8 n' h  b: v; d4 q+ f
< /p>
7 v6 n. X! E$ p4 T4 Q* d  M9 `

该用户从未签到

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 16:37 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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