|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在做利用STM32f103rct6的SPI3接收NRF24l01的问题,SPI的大体配置是遵照SPI1和SP2的,但是SPI1和SP2在写NRf24L01的地址时都是正常的,但是SPI3写地址就不行了,配置地址为5位失效。单个读写寄存器时有效的,通道设置都是可以的。但是唯独地址的修改不行。以下是配置代码。请搞过SPI3通信的帮忙看一下,找找问题。
8 W: w4 c. }0 C; s" |- T</p>( T, w, c8 _$ K5 H& B3 \2 ]( r. V
< p>
3 S1 m# I- \6 H6 U- | static void Initial_SPI(SPI_TypeDef* SPIx) //??????IOB????<br />
0 D8 ]/ V- T! N" l+ G5 L6 `( b9 a {<br />
! @2 G- u# j+ J5 a; F) | GPIO_InitTypeDef GPIO_InitStruct;<br />% L$ f2 |( ]* u* R4 m' _* [+ n
SPI_InitTypeDef SPI_InitStruct;<br />/ x! U+ Z6 ?: ]6 N5 d
IF(SPIx==SPI1)<br />! w$ a, e# D# D& {; `) o6 \8 X
{<br />( C7 g0 k6 C; `) v6 F9 w: P. J
RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);<br />
3 c' p( b$ R( n- M RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
* T7 B( m$ {9 G/ O. [0 i- Y< /p>
* I) x! H t8 b9 }4 I% a% v7 j< p>: n; V' W- ~& ^" o: b
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;<br />
% @2 b% q+ @" L7 V GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />) Q( j6 c! M, i( F6 R& ?
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
% k" w9 ?. k4 `' q/ g0 r <br />
' H: E# n) v& s! o GPIO_Init(GPIOA, &GPIO_InitStruct);<br />6 b/ w9 p7 F% a2 S
}<br />, o# C4 p4 }3 J/ a. R
else if(SPIx==SPI2)<br />
, ? q: A; I. Z% V7 P {<br />
& g" I/ O3 M2 Q% E7 ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />9 i/ a [2 M; v5 A9 O
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);1 I) Q3 g# J' A; Q, R
< /p>
3 L) a% l T! x q- m# e< p>
' h( K' b7 }7 B9 a; R$ ?# }0 K4 j& O GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;<br />
' i) F2 B: Q+ J" i! L6 A GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />9 `! @* V- r( e6 J' g. ^
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />
+ K) G" d3 ]8 i" v <br />
3 k" b8 z. @- r8 u( w GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
% W3 k: A j, M v& x) I }
; ~ E3 m, Y4 z4 b- B' t+ `0 ^< /p>, V( Z7 {2 F' z( Q$ J& `: F( U1 B
< p>
, k4 r8 [. R6 c$ E# |7 t else if(SPIx==SPI3)<br />
. o3 P) k/ T: l6 F& @ {<br />
' } C, K' f& ?& A% ?( O2 _ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);<br />
3 V% C5 a6 P) n+ A; j RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
: N% {' _* \: K. i7 G* `9 I( @< /p>) d d% Q- p5 J) `
< p>
1 y, b: D3 r% \7 c0 D6 J8 F GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);<br />
( ^0 p* I% n) e* s$ Z @3 N) K //GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);<br />
% g# H* V4 Q- O* p( ]! {; \( \ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);% b7 A( K$ H" Y4 X% ~# J1 j/ u$ S0 b
< /p>
$ q6 [* |# \/ k; y* m< p>/ q1 K5 U: p/ K$ }1 C: R+ }
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;<br />3 M3 n9 L5 D; B9 a
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;<br />
3 o6 F2 q' r! ~" Y; ? GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br />1 T9 E7 B" |5 l- u; W. q
<br />, N! C5 m; X# J g- w
GPIO_Init(GPIOB, &GPIO_InitStruct);<br />
/ ` a8 x* F( ]: H3 P3 X( \ }8 b" p! c. M+ |; X b# H
< /p>
% S% @) O) u* n: p4 Q, J< p>+ c0 f; P- v& B! Z
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;<br />/ P" k$ J! C# l
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;<br />, q' ]3 `; P( t2 A2 U
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;<br />, R1 u$ c, Q$ y7 W
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;<br />
- C. I; k% I! @3 ^& Q SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;<br />4 Q! F/ x- g% K7 t4 G$ w
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;<br />
6 ~* P2 k6 u( _3 s SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;<br />
6 x3 A6 }; L; P' g. D; t2 y) y' S SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;<br />" P* D8 L* ^+ Q! U7 L6 J
SPI_InitStruct.SPI_CRCPolynomial = 7;<br />
& f& T' X/ k5 S, w ^: x* B SPI_Init(SPIx, &SPI_InitStruct);
* t) K5 }! D4 |% G< /p>
% [, r' s, `# ~3 _5 \< p>3 y; M1 _, y' V' H- o
SPI_Cmd(SPIx, ENABLE);<br />
8 G3 R: m; U8 S: @ }) @4 C. P0 }, f. m M
< /p>
4 J6 y' ~3 O& u0 e& d< p>
3 J7 q6 D; ?1 g; U8 V <br /> M& w$ J% S& f- x7 @6 D9 u5 A5 B. g
< /p>
+ X1 ~2 u( ]3 e( `. H7 `8 y< p>
0 Y; B p( Z+ X" I; x static void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)<br />5 q" T% R8 }5 l
{<br />
$ i# R/ w/ p3 f2 |: y- X while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br /># U6 p+ \: b. L# ~7 z4 v
SPI_I2S_SendData(SPIx,data);1 H+ K3 W. l! g" b+ v
< /p>
1 s, h4 @1 H0 T' x6 y" I< p>- u3 n6 L: s3 U# S# }
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />
+ c( P+ w9 l; A7 K- P# X& o SPI_I2S_ReceiveData(SPIx);<br />
: i# P7 s- P0 n3 m" t/ C' N }/ u0 h% Y; O& F) j3 V
< /p>- K& c8 R0 V$ K
< p>0 p- ~, r* S( n! Q. h1 A
static u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)<br />
[7 }& u+ S, O5 o2 R: E* K' ^7 R {<br />, R* U8 v7 J) C+ o8 o0 T
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);<br />
2 I0 H. }5 u% t ^2 K- W. Z$ t SPI_I2S_SendData(SPIx,data);
2 h+ Y7 q# T: P< /p>
; \/ T* ^( S8 r) P< p>
& z' U; ]+ Z! }$ G while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);<br />+ A5 C* I0 J9 E1 C0 A; l+ Q5 ?
return SPI_I2S_ReceiveData(SPIx);<br />
3 D) ]# P1 f% y0 o1 L A- _. i }/ f& p: E3 Y3 A
< /p>$ I: g; D4 e" z% i1 s Q
< p>2 s7 R% F! u* Z6 s8 t) F
static void delay1us(u8 t)<br />- G, e! h+ ]$ L4 D3 e4 ^
{<br />
5 c. y" Z* j" Y, k while(--t);<br />; B9 Q7 M2 O$ s) g: N$ [' l0 ~2 W( G
}
3 R, l, L8 [. M6 e8 L5 e( Y0 M Z< /p>$ A( S! U+ ^) O9 ~' S4 i3 P' q
< p>" u# r" L/ {; p. d0 T( b# H1 y
<br />% A) }3 n, a6 h
< /p>
( H/ h% B/ G4 p, }5 B# a6 b< p>
0 k9 [/ K7 i3 _8 J- e /****************????bytes×?????????*******************/<br />! ]5 S0 p5 Y. F* p& l& L }
u8 SPI_Write_Buf_2(u8 reg,u8 *pBuf,u8 bytes)<br />* [* ]7 i) q; r4 h
{<br />" t2 [7 B6 O q* W% f" C5 S5 ^
u8 status,byte_ctr;<br />7 `. o( i5 p; x& n4 D/ {
CSN(0);<br />* F+ O2 E: \) j F" l& p5 B
status=SPI_Receive_byte(SPI3,reg); <br />
/ \4 f1 j: e2 `. k7 |8 { delay1us(1);<br />3 D0 `# o# S& w1 r5 ^( S
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br /> p. x( _5 P+ r5 u: V5 D' ~6 x/ ~
{<br />
: f0 B0 Z5 |. ?; x# v! h/ o" [ SPI_Send_byte(SPI3,*pBuf++);<br />
{+ B1 j' Q: M4 E }<br />3 i; A+ t& X# E
CSN(1);<br />, A& P2 s) P9 ~6 A0 l
return(status);<br />
9 l( U1 h( a4 I) [ }9 H! C9 Q. k$ h* d3 J
< /p>
2 N1 D$ q- i) g5 f# q< p>) I) v1 C- a' c6 ?* T7 V/ u R) W9 u
<br />& T: i; C2 ~4 f4 \2 A* X7 U9 n
< /p>" W, D+ e- q$ `
< p>$ Y7 P! j" ~. r) {
void RX_Mode_2(void)<br />/ ]7 g, g1 q. ^- W' m4 G3 I+ L
{<br />
$ P0 D5 p1 f1 u- Z+ a, E8 B CE(0);<br />
$ m! S5 ?5 y- `* m( X$ U7 X SPI_Write_Buf_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,TX_PLOAD_WIDTH); <br />
0 K) y e+ h6 i1 v; [) i //SPI_Write_Buf_2_1(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS,1) ;<br />; Z$ c4 B" S& i( h
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH); <br />
& r0 M# O, ]) @( c // SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RX_ADDR_P0, 0x20); <br />6 Z6 T) `7 q' O) v: {
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_AA, 0x00); // ?????????¨??0×???????<br /># x% ?3 U8 `+ u: ^8 o; E9 |
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // ?????????¨??0<br />2 V- s2 C4 [- y6 m' R
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_CH, 40); // ?????????¨??0x40
- u- ~, }* A+ P/ O$ p! t& C; l< /p>- m# L' w. o: {% p4 b0 M
< p>: g, a0 Z+ U4 S4 d* D
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + RF_SETUP, 0x0f); <br />6 ~+ U/ \( L T7 H* S
SPI_RW_Reg_2(WRITE_REG_NRF24L01 + CONFIG, 0x0f); // CRC??????16??CRC???é????????????????<br />0 h. I9 l* _4 m2 y" R
CE(1);<br />, e6 z7 b7 l3 v% h
}
9 [; [ ], y4 N+ M9 r5 l< /p>
% y( `4 E; h; ] |
|