EDA365电子论坛网
标题:
SPI3多次写入NRF24L01失效的原因是什么?
[打印本页]
作者:
DuBois_1wwe
时间:
2022-1-20 14:51
标题:
SPI3多次写入NRF24L01失效的原因是什么?
最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
7 e$ a' a6 I4 O8 D+ D+ u
</p>
5 y) Z8 y9 o- W2 j: e* o
< p>
! _1 `! b& z& e9 L# B3 ^. d
static void Initial_SPI(SPI_TypeDef* SPIx) //??????IOB????<br />
6 A: j5 N, ^& J
{<br />
7 e: Q$ Q1 M7 |6 L5 B/ }
GPIO_InitTypeDef GPIO_InitStruct;<br />
( @/ m# ?9 \9 }1 q1 N- z+ V
SPI_InitTypeDef SPI_InitStruct;<br />
$ R! u" [, }* G0 q: Y4 T5 M6 L
IF(SPIx==SPI1)<br />
3 C- ^2 K- D% W( W. F/ B, G4 a" \
{<br />
+ L9 E; w9 v- y% l
RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />
- L0 z( Q; _1 v5 s, i
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
}& z; T/ B8 }0 W% ?' m
< /p>
( j: w s: w h' Z3 o, ?6 ^1 a
< p>
# `6 Y) C: }/ Z* t4 A
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
4 e# ^3 C. Z$ o/ `6 d
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
2 x! Z4 l1 n8 |. A% w
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
; C v$ J6 L0 T
<br />
# H& p' j( G v5 Z( k7 z
GPIO_Init(GPIOA, &GPIO_InitStruct);<br />
" L% Y6 k( A3 {
}<br />
* L& h9 G/ m7 Y& F9 o# Z W2 I
else if(SPIx==SPI2)<br />
) j1 x. L6 K7 O' L H
{<br />
4 G1 s* J2 J# p9 i
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
( V8 @ |8 V6 ?1 Y5 `5 B' m
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
6 L6 B& I* P! [3 o5 Q3 Q, x& c' g
< /p>
$ j4 Y6 I, o3 ?' J$ I8 V
< p>
7 c& }- w. G/ h
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
) ~- ~9 W* k4 b
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
5 u2 _& L$ Q+ b# |: H" W
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
4 u$ d9 ]: A2 I( N" U
<br />
" K, @% P( W b& u' S
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
$ ^' v6 _- j% X8 N8 R
}
2 T& S6 A3 \2 l% _8 `/ D
< /p>
0 K7 R9 U# H1 _( b8 S- E# r2 s
< p>
7 I- ?! n4 Z. t0 L
else if(SPIx==SPI3)<br />
# @+ A# e6 W* \& i0 {( M
{<br />
1 C& N9 h: X) \* x }0 r' M0 ^+ s
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
( y9 `* @3 ^, U: I# b7 Y4 M
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
$ I2 _. ?% ^' w, [. x! q
< /p>
" f" X) b F, g, p5 b }
< p>
`& @* q2 }6 G
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
/ S9 s. ?# w7 J' W0 m4 n
//GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
' {& `$ Z w6 K' I
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
% n) Y4 @9 e: u0 i( [& I: @/ r
< /p>
: P4 j6 _, m2 S" r
< p>
& J! l# n4 _8 y3 e
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />
* h# Y3 c+ }- o5 l% Z
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
* M0 k/ z0 c3 m h, b+ I
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
5 q% I+ B4 I5 z& @0 g
<br />
' c2 g2 h! O8 k: x3 r+ j) i
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
Q8 x' ]; ^4 y. a7 @3 s+ ]( Y3 l
}
: V0 q8 V3 }$ z1 u
< /p>
: {: y* F, a, C
< p>
: e8 ^8 }$ f. E: Z( V8 P# r
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />
( M/ L) r1 `" m' r. U/ I
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />
) R+ i' ]# |/ Q, b
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />
/ s; U+ {: H- v7 ]- ^
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />
) X4 H5 y% D' j/ B. Z% S1 q8 e* C4 x
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />
3 D# I7 X- X( \% ?! A& N+ ]+ `5 I' j% x
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />
7 R" Z$ a' |5 ?+ ^6 q- `3 c
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
( Y$ U+ w/ u9 k( v. P% \9 v# ?, k1 L. l
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />
1 C+ i7 E' M7 K
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />
0 \* ?1 f4 k8 R$ `
SPI_Init(SPIx, &SPI_InitStruct);
^% |) ]6 y5 [* G7 l
< /p>
q Q6 W6 ^; ?$ n" Z$ }
< p>
* L2 Y5 Z# b. |- f% E7 H+ \% c
SPI_Cmd(SPIx, ENABLE);<br />
4 \( t4 _* b9 p3 m/ O" n4 Q
}
' i' J; B8 F( @# M( H
< /p>
3 c$ F% q) |- s% v* n+ W
< p>
# D. z5 Q" c* g: B% p( t1 Q" y
<br />
% v! s) U9 l) i8 c2 s% C
< /p>
, j% U# r" d3 z' u, _
< p>
' C8 k+ c& w8 d& B! B) L: _$ u# h! m
static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />
. k3 Q* r- e4 J# D9 n
{<br />
Q8 U# m% q0 U x, R. @
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
4 ~0 S* B% V" F: B: v! r; Z
SPI_I2S_SendData(SPIx,data);
6 N5 d1 y7 B0 p) L9 M* f3 d
< /p>
- \5 K* G2 z# c) }
< p>
2 H' L5 d! w1 q% p
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
+ S9 |( ^( d# ?. E# i
SPI_I2S_ReceiveData(SPIx);<br />
5 P1 s# E+ E( @+ j
}
, R J2 M$ I( M& l# E5 [
< /p>
/ i& E6 i/ y2 F+ [: @1 P/ Y
< p>
% c, u( M) w% @/ n# _' I0 `% `
static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />
, l# x$ }! P1 t9 X9 w0 l
{<br />
% W- x& H* \. M1 e) |
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
- P5 u+ c7 d3 f& t
SPI_I2S_SendData(SPIx,data);
5 c( j, ^; L, d ? s/ E
< /p>
1 t8 e4 w2 H2 \; D/ G6 g
< p>
* Q2 R) K3 c5 A; b9 r- |
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
9 {' v, X- ~( _/ K3 x
return SPI_I2S_ReceiveData(SPIx);<br />
0 K9 e, D( i8 [ [
}
+ \" c6 Y% p# L
< /p>
2 L/ u. [" ]% K7 w( J7 Y
< p>
, b2 g, y! w b8 n4 J& x: L, k: p( l
static void delay1us(u8 t)<br />
' {! D# j- h, Y- r9 U2 t( S* p
{<br />
: ?, B v& G$ s! K$ W/ Z
while(--t);<br />
8 ~, k/ W& r0 d7 X2 g
}
2 r* \- j4 l# r6 q8 T
< /p>
" {/ Q" F! t1 V* O6 s4 W7 O/ y1 f. @9 n
< p>
. L: g- x* l( ?, b
<br />
( i- w" B! }8 V4 h# z' g6 k7 f
< /p>
2 c( A/ z6 O, N) Z z5 l" ^6 |3 x; T
< p>
/ ?! N+ |- Q" j' v# ]0 v- d; U
/****************????bytes×?????????*******************/<br />
6 u2 j. e% g: U Q
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />
% Y4 X8 I4 H1 q+ [3 e; l$ F
{<br />
6 r$ `# u3 a. ~2 B. P0 A0 O
u8 status,byte_ctr;<br />
! p3 G1 D" r8 P$ s3 J
CSN(0);<br />
i4 E2 S, H, g9 l; m( ]
status=SPI_Receive_byte(SPI3,reg); <br />
8 a. h, m2 y" `
delay1us(1);<br />
x# c* }7 l& L
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br />
% W. D. @8 E, g4 ^& p$ x# T: F! ]8 k- }8 V
{<br />
* w b( J& m5 ^, h/ J) X
SPI_Send_byte(SPI3,*pBuf++);<br />
- @! {* x H; {4 r" r
}<br />
/ Y; F' M |( S; K
CSN(1);<br />
+ t, O$ j& `8 n2 n6 o
return(status);<br />
1 b) g% p9 Z) E/ `7 L
}
$ s5 x& d4 s. @- l! Z+ Q2 h
< /p>
6 J; w; R7 u" D* _; G
< p>
- M. C$ q- S: z! U
<br />
8 L- o! i) ? b( Y7 V" n8 Y. X
< /p>
6 N: H* u/ i) d B) H( k, L
< p>
' g0 O8 }; x' l5 t; M( Z
void RX_Mode_2(void)<br />
+ d+ R; M5 V% U: U
{<br />
, u) {9 C/ a$ [* _4 ^. C& c
CE(0);<br />
+ T' \8 \: h6 E+ l; f
SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />
, A5 s, g% N0 V; A
//SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />
( Q M7 C5 x% Z* F+ P! y
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH); <br />
* i- u$ V9 ] U
// SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />
! {2 T( s8 e4 j5 \2 [7 G
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00); // ?????????¨??0×???????<br />
, h# ]- g/ K1 q6 I9 R; v Z
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // ?????????¨??0<br />
- T7 _0 `. M' u" \
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40); // ?????????¨??0x40
; e7 W3 I0 {1 a
< /p>
6 x: P' w, L: }* u6 `
< p>
C8 l2 ~$ x, T2 A4 F- o r
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f); <br />
7 i1 Q- }/ J: l
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f); // CRC??????16??CRC???é????????????????<br />
8 J! y3 _3 Q1 t2 _
CE(1);<br />
* ?. T7 |- c) n4 M) F% j9 ^1 p$ \
}
2 Y6 j* M; V. x- `$ T
< /p>
/ d. ]" ]% [5 R
作者:
ononsiiii532
时间:
2022-1-20 15:48
SPI_RW_Reg_2();为单次写寄存器是没问题,写完之后,再读出来通过串口打印是没有问题,但唯独地址无法写入。
作者:
House647
时间:
2022-1-20 16:17
换了一块ZE的开发板,出来的效果是一样的,看样子不是硬件的原因,配置出问题了。然后又看了一下仿真情况下,SPI3和SPI2的配置也是一样的。时序配置是一样的。问题还是没有找到
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2