- void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本
4 \2 |& ?; t3 `* y" Y# U& { - {
! K3 R7 z, b6 T; L0 B - volatile unsigned char tmpreg;
: T }. Y8 h/ i - unsigned short TxXferCount,RxXferCount;
+ c+ L2 ~% ^, m0 u - unsigned char *pRxBuffPtr = pRxData;8 k7 x1 }% O6 o) P
- unsigned char *pTxBuffPtr = pTxData;
$ C9 _7 Y/ ?$ c2 q* t - unsigned char txallowed = 1U;
/ ~# q( u3 H9 t" x. a" r - unsigned int timeout=SPI_COMM_TIMEOUT;5 U2 L# Z1 E' k2 E+ a! J- N5 e
- __IO unsigned int tmpreg_ovr = 0x00U;7 M# u9 _6 \9 g/ C, c4 K) K3 h, G
- TxXferCount=RxXferCount=Size;
# X# S8 T' P4 h: G - 5 y. W8 e2 \* p* _
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件& o4 v1 K U4 c4 M+ R4 |& L
- SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
0 M7 f! i) p8 v2 K, q: V
, ] l0 Q6 \, _( \/ P- while((TxXferCount > 0) || (RxXferCount > 0))( W$ E' a$ S) e2 d$ G$ T
- {6 `2 Y1 l, c6 f
- // check TXE flag * D1 y+ C& e- }: T; v* I7 s
- if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
: a9 O" o4 O' ?; o; f) k6 j9 z - {* b3 y1 H0 V+ N% O/ T( @
- *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);) M9 f% z8 v8 f7 D
- TxXferCount--;
' @4 H f' m' ^3 _3 @% z
8 H: W+ b+ C$ ~8 M( l" ]- // Next Data is a reception (Rx). Tx not allowed - C7 _) ~2 j- Q" ^6 }( g
- if(TxXferCount==0)
! U9 E2 o5 E1 \; ^ - txallowed = 0U;" Y) z9 z# V3 Y. \$ v% ^
- }- R% k5 C9 @1 J9 c, y- @
- : S6 Q; S5 D2 p* s1 f
- /* Wait until RXNE flag is reset */6 r0 A) A$ ~1 ^( B. R* w+ F7 t) @3 j
- if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
/ B5 i7 G& d6 K- e: o X4 g& y - {! O) t2 a- g+ t' {* `) o
- //改为1个字节接收,两个字节接收有的芯片会出问题
2 }8 v+ u- G2 y/ y3 C" j - (*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;
. b/ h6 P% _6 [ - RxXferCount--;) s7 a( Y3 O( p
-
! o* O, z, Y- @! K - if(RxXferCount <= 1)
% v& w6 g3 q: B7 N* |1 y" W - {- [1 x/ E# L3 B' u
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
0 v' l* z& r* ? - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);3 E" S U2 Q; K# N p
- }
& N+ O" c3 A! i' x( t$ S' } K - //Next Data is a Transmission (Tx). Tx is allowed
, T' t: B: [( [4 S$ X% s - if(RxXferCount==0) 2 c3 f3 M5 C# c
- txallowed = 1U;% c' {; J6 P u/ x( E
- } / v! }4 h q; s7 h4 l& T
+ K% k. p0 i2 n7 M: }4 ?9 |- if((timeout--)==0)
' S9 e0 o" l+ F& v+ }4 ^, z - {8 V X8 u& [. `* [7 O' }
- if(spi==SPI1)0 K- B; v1 `/ X; r* T- x/ \7 j
- {
. k4 b9 ^/ a: i/ ]- i, @- o% | - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
) r0 p0 } T$ r S; l7 s - break;) J" e m- J4 U0 D& d$ Y/ m0 M, t- e
- }& q% I/ G9 J1 J. K$ Y
- else if(spi==SPI2)
; Q4 J8 E& r6 a1 Q: n0 a; b - { : U8 o4 t4 e. h8 A/ W3 j
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
5 e! q" Z, I$ h& d: j6 |' e - break;
+ v2 E( |4 k/ I - }
) ]) T& U9 ~3 A' G8 L0 T - else) s+ I1 t- O! t) T T1 }: L
- break;$ _0 y# l. |- ^% E ]
- }7 ~0 X6 d2 k* |6 P
- } " K% `( j3 B6 b- I7 k- s. G) p
- - O- D7 ?! ~( _1 B
& v5 `5 H x/ r e }! j* }- //带有32位收发缓冲区的MCU需添加,否则屏蔽///
. x. c# n- H" Y% ^; C. m - timeout=SPI_COMM_TIMEOUT;
6 h3 O; g3 P" O2 r$ n6 X: h+ X - // Check the end of the transaction
+ b" k+ y3 ? H6 w/ h4 b - while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY). q/ S/ ]( F8 m7 u8 J/ @
- {//发送FIFO非空时& R9 b0 B/ U, K8 j
- if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))
' T# ^ e+ W& b2 b. b3 T/ b - {* W9 d" c/ i# F5 s5 s$ C W
- tmpreg = *((__IO unsigned char*)&spi->DR);
: o/ R* k7 q1 Q: P( V$ ^ - }9 V& L; k5 y5 J8 F" k8 j. v. j8 T' g
- 8 O' s. b1 i0 ]( [4 _8 m* C! p
- if((timeout--)==0)) [& a3 r( G: Y* D
- {& S3 L# h; @5 d" o* A/ j$ m9 q
- if(spi==SPI1)" r4 j, f" z" \5 S- }
- {
$ p( S3 S- j' ~/ D' R - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 7 a7 y! z3 p- ]7 e1 `) c
- break;
8 n0 u& R/ T$ V* l x: Z5 P# L/ k p' Z - }
3 B, t2 l8 D, f$ c! {+ r: p - else if(spi==SPI2)
7 g5 Q, Z1 B( b: L3 `- Y7 z( d1 o - {
$ O) B! f' a { - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 , C! C* Y. Y9 a" v9 l
- break;' {( f$ P* u% [% L
- }
' D% [# ^, P/ m3 m - else1 a: s/ r5 W5 A! J
- break;
8 I# l S8 {2 J - } : q9 P3 V0 S0 E1 z3 k# @
- }
% l' S0 A; r; b& K: S
. t# T5 C5 [8 N1 N% @3 i- timeout=SPI_COMM_TIMEOUT;
& A. }; v! F: G; b5 L - while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)) ]& l7 W8 _7 G6 e( |* n3 F
- {
2 q" x, g/ J B1 n. c - if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
9 V$ e( R" |% H6 y! R - {; S1 u% Z4 b5 e4 d/ R0 k# k& x; N
- tmpreg = *((__IO unsigned char*)&spi->DR);5 y% R) g# _. r8 f
- }
?* b2 F4 s2 v7 y! k. \- t n4 g3 J - if((timeout--)==0)
- y2 M9 @3 V6 o2 _9 p* |+ j5 \* F - {5 O/ C$ f0 W3 d
- if(spi==SPI1)$ e) m9 `) F& @/ Y# l
- { 5 V0 R: q+ }9 d, o. V
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
1 K4 x, j8 D4 N3 @9 }- s5 X! V - break;8 S2 p& ~: x1 _7 D. z, Y, T
- }# V' [0 p4 E- H) U) V+ _
- else if(spi==SPI2)
5 N" x3 [8 N2 I" D4 }+ L - { # W/ @: T- K f4 E- @/ A
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
; D2 [5 e+ W6 p" e- e - break;
- e6 c1 m! U) r) ~; \$ O - }9 i8 m' q x1 w! A& x" l
- else
. z& x- E* w4 S, u" h4 N3 M; ^+ E - break; $ h- M: v6 o9 {' `
- } ! w' l8 E4 s( i9 {
- }$ l% G5 l; e2 e' ]( `5 u0 y% h! x
- //带有32位收发缓冲区的MCU需添加,否则屏蔽///4 m, j) d4 y: E% w5 ~6 y
- ! {+ b/ M% ]2 s, T% ]4 k% U2 t
- - E. v; o, h) Y. n8 P
- timeout=SPI_COMM_TIMEOUT;
; D/ Y) F9 W- X+ N# y - /* Control the BSY flag */
% V( i5 R. Z8 e8 Z0 Q* _ - while((spi->SR & SPI_FLAG_BSY) != RESET)
8 x1 Q7 ~( I) S2 R - {' g$ d! O+ N1 g( O; O, z& D
- if((timeout--)==0)
0 I3 I% \4 w8 j9 A - {& {- }2 x- }3 Q, a% P) `
- if(spi==SPI1)
6 B' U/ o9 h, p/ P! n - {
& K' N- O% x8 M O) t3 x+ y& D - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
" G5 S5 D7 c. l: L" e* a - break;
) g0 P+ Z1 J7 ]7 T/ m - }
; _1 |% x8 d9 M' d% R% u - else if(spi==SPI2)+ O8 Y- u8 r/ x, Y: P
- { 4 E: |. e; E* U& G
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
% B: w2 k" L! X5 C6 v5 |# q - break;' s. [1 V* m8 V: ]5 ?
- }, T$ T- h& o4 T+ V' q4 V, r
- else
0 u4 }! e! u7 w. f5 T - break;
) b1 B; s% U/ u @6 N - }4 C1 Y& B' i% p4 U& P
- }
6 A. T4 r% l' `4 } - & U. Z, B# N) m6 n' m" I: ^/ l
- //Clear overrun flag in 2 Lines communication mode because received is not read / W1 x3 R( z# o- N
- tmpreg_ovr=spi->DR;
, n$ K: G0 v) p* @ - tmpreg_ovr=spi->SR;2 _1 `& P. b" [
- }
5 M1 ~( o" G' t+ M6 Y/ a( U9 \/ [ - . o5 y5 f) j' P9 L' _% s: O
复制代码 : d t. E/ N0 N
|
MARK一下 看能否看到自己的标记 方便以后查找 学习