- void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本5 m, S# Q0 I! } _! z
- { ( k2 I* x# ] r4 ~7 z
- volatile unsigned char tmpreg;* z2 R5 w1 _7 B G/ Q
- unsigned short TxXferCount,RxXferCount;& G* i3 M' Q' K2 `; N' Q L0 n
- unsigned char *pRxBuffPtr = pRxData;
1 K' c# M& O$ y% u - unsigned char *pTxBuffPtr = pTxData;
3 l/ U( ^$ A5 n7 v! S4 [' S, z - unsigned char txallowed = 1U;5 _- q4 p' n0 i5 ~2 @2 a! \
- unsigned int timeout=SPI_COMM_TIMEOUT;1 y+ a) E: A4 a/ ?
- __IO unsigned int tmpreg_ovr = 0x00U;
2 J" D) f+ E" N f6 J9 p2 F0 P0 Y0 O - TxXferCount=RxXferCount=Size;
- F; ^4 P0 }' D - : m) \6 U6 K0 ?" S) N4 \
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
) { y7 x# ^/ i; Q8 R+ C - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);8 H! e) S. E$ |
- 5 e- J' b2 D% h Y! _
- while((TxXferCount > 0) || (RxXferCount > 0)); {2 T2 A7 Z$ J5 w
- {- w: H/ p- w( K R' `" g
- // check TXE flag # Z( q; v* x+ Y
- if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
! s4 b; E3 D5 R( b% g+ x/ V8 w5 _ - {
, D# b+ y/ `! V { - *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);' b0 X" `8 W& d+ h5 u
- TxXferCount--; a) b" ]( R7 {; A5 m$ u0 T) m
- 4 c2 d6 B0 D0 N: [2 o
- // Next Data is a reception (Rx). Tx not allowed , D) V$ Z! x6 q: x# N
- if(TxXferCount==0), h$ V9 b% M) s' ~! |
- txallowed = 0U;
, Y8 g0 @% e% q& ]9 ^ - }
+ o7 a" _5 S$ r3 S& e1 l' y
3 V( s1 j, g: `# h1 A6 h- Q- /* Wait until RXNE flag is reset */5 l. R) F$ _" ], _
- if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))6 S: S# Y/ V+ ^1 o8 Q9 e
- {2 G0 r# X; S$ ?# W9 G# x
- //改为1个字节接收,两个字节接收有的芯片会出问题
; @" n1 m, L2 K' H - (*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;
E1 [9 s: u; M9 z U! j& C - RxXferCount--; S1 S$ a6 j4 _6 t& O( D( v) x1 g
-
, [5 O8 R8 S( F0 r. x* v. g - if(RxXferCount <= 1)" [5 L$ t5 R- i6 |
- {6 l8 R+ \8 v! ^ `, v' I: p8 [. E$ ?0 [
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件0 Q' ]7 t$ p8 I0 F* ]- Q) I5 ~; I
- SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
0 [; ]1 ?# z) Y+ b - }
' j- L( c( r. o' ^6 m - //Next Data is a Transmission (Tx). Tx is allowed , s3 \) E! Y7 l0 P% p0 t
- if(RxXferCount==0) R5 V4 |6 e, ^3 @' H8 U! u, _
- txallowed = 1U;6 K5 P* l( T6 F O
- }
) v2 E, k* c% O. o9 N) X$ w: V* @
0 \& p% g/ {* x' Y! _- if((timeout--)==0): A& _6 _1 F9 H
- {4 |0 ]- B+ y! s3 X
- if(spi==SPI1)
/ N0 |+ ]; l j3 q/ i - { 9 N s' d9 k" U. _0 X* \
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
$ e, S: C: S9 Y5 Y, ~( p& @7 n% F# Q - break;
1 `* S( t$ K/ E- F9 D& z2 c' i - }, M6 b* I. S) {$ d
- else if(spi==SPI2)3 S/ Y6 q1 e8 T
- { 8 J1 h O% x- U' A
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 0 U7 `+ ?2 v% j% z( U! H
- break;8 ~% L6 O, p. E4 P/ W; s
- }* A* {$ v& u6 F: D- P
- else9 y+ A3 k0 E8 W& D- S( a; [
- break;4 S* ]1 Q2 j, W# k% d$ g4 ^
- }% n3 m8 E: X4 |( d' E3 Y
- }
5 n! m/ R0 H! t4 C2 m3 T8 z( Q - # M# T, b" A3 j6 q- Q6 F
- 6 L" i4 a* } `! G: K2 a
- //带有32位收发缓冲区的MCU需添加,否则屏蔽///
' @& `/ g8 r7 v8 d" B" K - timeout=SPI_COMM_TIMEOUT;
$ N1 s2 b0 G) q( O/ h$ q u& z9 ] - // Check the end of the transaction - D1 B3 c7 K5 ~ B% a, O8 {
- while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)6 B3 o$ ^- @5 w; e4 ?( O2 o* N3 d; l
- {//发送FIFO非空时
8 r) E) t9 ]; F6 c/ p9 R. s( q - if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))- E* `; [ F% E8 y4 z& ]( ~
- {1 z8 x) B! R, [! D
- tmpreg = *((__IO unsigned char*)&spi->DR);
1 g! ]) h# }* O$ C4 e - }* y6 U: k3 \8 l* q+ e
- 9 T; D7 n7 }% }& X$ Q+ J" i
- if((timeout--)==0), V% K" }$ [4 b1 V2 ?' \1 ~& a: w
- {8 z, X$ S/ a, ?$ q2 ^
- if(spi==SPI1), [- P+ g, R A' V1 d6 O
- { 1 Y: d3 y1 g3 L$ ~% B
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 . S2 Z7 W8 n$ Q$ ~5 q
- break;
/ K& `- h' K+ M" ^. k' j - }3 @# H7 M6 ] z% x
- else if(spi==SPI2)
Y; |) @2 p1 p8 X6 O$ n6 A/ A# v5 s - { 7 q; f( k: P4 W4 N: G
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 4 Q" v- }8 L! f* V3 H1 [1 b( t1 g
- break;
4 U* I$ Z5 M" Z: R( u - }0 t5 F9 `+ X$ ?% k
- else/ `& E. @/ W5 u" \& K
- break;
1 k& f2 Y# e( U - } ' \1 c8 H7 g2 t4 N m, u" u
- }
) j- ?3 b( n! H" |6 ~ j - 6 }4 I" f1 [1 q# {9 s) }: L
- timeout=SPI_COMM_TIMEOUT;
# U# C) G. I& |+ D; c7 F - while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)
9 q( x3 V x- S- K - {: e) k" u, B: i% e
- if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
A% V( H$ S: D9 N% [# V, L0 I - {
( N7 M# N: @7 o6 K( o) U - tmpreg = *((__IO unsigned char*)&spi->DR);$ K3 d6 A8 C' ]5 p1 M& [
- }
6 J: ~1 Z7 x7 L) N j0 D I7 c - if((timeout--)==0)9 H. F5 ] T! c& p* P; [$ ]8 V
- {! g7 K/ X0 b( x* s
- if(spi==SPI1)4 u$ I! t" o5 ?
- {
/ d2 v1 h' k- V0 C2 h) r6 x1 v& ~3 y$ g - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
8 y) @+ v7 o9 H" R - break;! u- f6 @- C/ B& @- P* Y7 x, F6 t
- }
1 O# e+ n. ?( z7 r6 R - else if(spi==SPI2)
( w8 Q6 L4 K9 s" ]: t) O1 X - {
9 J" V, s2 ?' n' W1 L8 n - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 0 l2 D N4 ^; u, D( O K% a" K
- break;
G) c/ q8 b- Z5 ]! \ - }2 a5 b$ X. |. l& ]/ m
- else
) |' Y% H Z0 K7 N - break; * y1 }. h( B. j* M! S
- } 3 E1 |- S. D# Z
- }
5 ^! \7 A: _2 @# U7 m2 L; Y0 { - //带有32位收发缓冲区的MCU需添加,否则屏蔽///
) `& i+ u" I- V4 T1 v& A7 [% ^8 c4 @
2 T- ~4 U. S8 A' i- R
+ N% g3 I- j. [1 V- timeout=SPI_COMM_TIMEOUT;
) a7 Z1 T: x, M! \0 x - /* Control the BSY flag */: t, z+ [8 L3 ^/ P( u
- while((spi->SR & SPI_FLAG_BSY) != RESET)
# ^" I3 |0 Y* u* L* E - {
4 j, k( Y; }# { - if((timeout--)==0)
' M' E7 z* c. i x* c. t* ` - {' t7 w, M g( g4 e' p7 z9 a- d6 C
- if(spi==SPI1)# Y( H% s: T9 h& L' m" G. Q4 Z* ]
- { ' V F5 ~5 ?, p" B
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 0 Y% V. |( N9 e. Z* A
- break;
4 Q8 e$ ^" W. K5 r4 k- [, d - }3 w i, d! o i0 ~" q# \, Q3 \
- else if(spi==SPI2)
! \/ S# e: O: l6 Y9 t+ i: b6 ? - {
y8 J" E; m4 @ - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 + Z* E8 q6 H) x; m, v5 y) W
- break;) e4 m' v2 B# g: D' P7 Q
- }
6 D* D" @) ~4 `$ O+ v - else
" ^. N6 E/ u) [# k& c, _ - break;
/ `4 R: |. A# P0 S - }2 `- L1 }" }/ n+ C6 ]
- }
( |* ^9 G9 J" C
+ H1 H2 T N3 P7 F% \1 f6 J& ?- //Clear overrun flag in 2 Lines communication mode because received is not read # g r+ i8 A7 m: ]) D$ f# V2 R
- tmpreg_ovr=spi->DR;1 }, L6 |8 k' g% s9 P* V8 c" e T( }
- tmpreg_ovr=spi->SR;0 Q4 w1 V; V& Z1 R/ Q" ^) S( }
- }& T( A. J/ _0 c
8 [- {) g& t: U2 K
复制代码
5 P2 |; m2 S; C2 q0 ^% ]3 |( v4 e" { |
MARK一下 看能否看到自己的标记 方便以后查找 学习