- void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本
" R$ Q6 G0 f2 H - {
" K, k. K" j/ {& w$ ~( l) o0 t4 R - volatile unsigned char tmpreg;
% B) z* e( C% E3 O- a1 N( [ - unsigned short TxXferCount,RxXferCount;
% y. a9 l: n6 `1 A. M - unsigned char *pRxBuffPtr = pRxData;1 d7 _+ W2 ^) t: ~1 G0 N
- unsigned char *pTxBuffPtr = pTxData;" g8 ], @6 e9 O9 U" f
- unsigned char txallowed = 1U;
/ A& G; u! U& C) I' h - unsigned int timeout=SPI_COMM_TIMEOUT;
9 Z4 M) M' l8 S3 V - __IO unsigned int tmpreg_ovr = 0x00U;
j" V: r$ H% l8 ~ - TxXferCount=RxXferCount=Size;
. E2 C2 s' d6 }" y - 5 m! l. X8 H% P; o1 d
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件4 J; s0 @5 W3 R4 W2 m) I3 g
- SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);1 ?# e& u+ Z- V3 J, T' f; G
- % f8 X; }& O- N$ I( y
- while((TxXferCount > 0) || (RxXferCount > 0))5 v. K8 u$ s; T! T* T: u
- {! y# Z( i9 J6 [: X) E# M
- // check TXE flag
) z& P/ p3 S- w" M! R n - if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
& p8 H; a# |7 M. v4 J - {
# _* |8 m8 l( Y! e - *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
9 Q% k3 d9 l. u* w- i* s4 N1 D, V. v; a- o - TxXferCount--;
0 E b- X& W6 D; ~- L# i$ L8 a4 [/ z
# d/ h I' l. l5 o$ Z5 v" x- // Next Data is a reception (Rx). Tx not allowed
% @- P8 z0 l# y1 I9 t/ y) b) m - if(TxXferCount==0). Q$ h; I8 F0 o9 g7 y3 M- ?" {2 o
- txallowed = 0U;
5 |4 A ?4 W: t6 H1 x/ b - }
3 @8 a8 P3 z& s" w - : O1 f/ B) _. |
- /* Wait until RXNE flag is reset */
3 k! e5 e4 {0 U0 m - if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
) _8 U, h9 {/ S1 E& z- H" S6 { - {
5 e3 r Y7 ^! n' R# h) k: } - //改为1个字节接收,两个字节接收有的芯片会出问题
; S$ d m6 f( o2 A1 b - (*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;
- e3 H/ u0 M6 Q3 R! I- ^ - RxXferCount--;
4 H+ l% M0 k4 J4 f3 a -
% o$ k: \+ |; D" G - if(RxXferCount <= 1)$ @7 Y% ~/ k( J5 q+ @1 H- k B
- {
, c5 H' F W K; h# n0 c4 ? - //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
+ |1 O, ?: Q+ s" {5 W( \2 } - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);# o& k! r8 d/ l+ Z
- } ; c* G! \( Q+ i5 X. j( n
- //Next Data is a Transmission (Tx). Tx is allowed & }1 r# o% p3 L4 n- \
- if(RxXferCount==0)
- I4 N% J- N9 r - txallowed = 1U;
! {; S+ D x& E7 m7 C P) P! m) P. [ - }
- l, d% g8 n- _* T/ K
0 G6 u! w* z' p% d3 j- if((timeout--)==0)
+ f/ P! B9 h; M% ^5 k9 |; S5 h - {4 o( @& Z7 r" @# z
- if(spi==SPI1)+ y; z8 {* B' V7 U9 q1 B- e
- {
9 ^$ X1 v; @& B6 g/ v1 ?: Q" ~" K% E - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
9 o5 @$ a6 @' C" z2 v! i - break;
- z @+ l6 ]( J - }
' w7 u* f! K; p: P0 m4 E - else if(spi==SPI2)$ I3 a \: A5 I' l% S) _& e) U
- {
4 }% V+ D6 l4 {1 P9 ^( O; ~ - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
& `2 ?7 {" k5 G* p& L6 y P" P' O - break;
4 @4 \- X N6 n - }
2 E8 `+ z+ V/ I4 J - else$ ]) P& U. t/ A# k; `
- break;
* K5 \+ T$ k- v0 \ - }
' _) g3 b2 J$ Q/ |1 t - }
5 n; C& v; x' t/ ]) a+ i& z - " G X; f# f/ Y7 G; b
) m% p% }" A @1 t r- //带有32位收发缓冲区的MCU需添加,否则屏蔽///* t) ?% T, m+ r1 Q% h" _' r
- timeout=SPI_COMM_TIMEOUT;+ v z D; Q" o4 N
- // Check the end of the transaction
4 j2 O/ V8 k3 r" V - while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)
: R9 D: R. g6 ^- Q P - {//发送FIFO非空时
% ]$ a/ v4 }% }* l2 W3 T - if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY)): S/ q0 ?9 b8 h% c% w, \
- { m# ]" K$ @; d* U; b3 V8 u S
- tmpreg = *((__IO unsigned char*)&spi->DR);; u1 S: g) R/ X* p! \
- }
* J4 u( q' Q7 S6 ?$ [5 B - F6 g. m3 P$ ^: o2 B) N
- if((timeout--)==0)
# k$ j1 w% m7 h0 @- o" L' X) V - {+ e. } r7 X( J6 K8 S! y; Y
- if(spi==SPI1)" }# `' L; O4 J( T/ u3 d" K
- { ( L L) p; v, w1 r4 k& v
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
) ], s$ @1 F$ ~4 Q" ]9 @) J. |5 [ - break;0 u3 A9 n0 o9 ]& {) S
- }* X4 T/ q5 `& X9 a7 {% I
- else if(spi==SPI2). v- \) y% s& k; C: `3 X
- { 7 b$ a" k6 R4 T) z
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 ( z) o2 Q2 g$ o% ^
- break;
) K/ r. Q- v. W5 ^4 X7 x - }7 E; g/ \* r" D; w7 ^( i
- else
) s N) a3 \5 a% O - break;
# |+ c- ?3 r- f9 A - }
* {( r% f7 C8 [0 t' C - }4 l+ o L. _) x& H% g
- 6 h& f! n: B% G
- timeout=SPI_COMM_TIMEOUT;
% t* @$ \! d3 o' `0 }7 M - while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)& f7 `7 \* ^. a( y4 [7 `* z
- {
6 m+ R z( u: T% y6 o' c - if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))7 w. d. l7 T* u- h% v9 |, s, y
- {
: g. \, y1 ]5 f! t: d. @8 I2 k) C/ t9 w - tmpreg = *((__IO unsigned char*)&spi->DR);
2 t- P7 Y! Q) j - }
" [9 G' R6 h/ L! y) s/ d - if((timeout--)==0); X5 f' e1 h4 z/ U+ A
- {
$ i( f ^0 C. K. v1 [ - if(spi==SPI1)
2 K7 |# e9 N4 U; S - {
& Q. x% y* m) Y2 |7 r: q - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 7 c7 C# B+ O0 h2 f
- break;9 G/ ~7 i& c* N" B7 f# P
- }
2 J. ^1 b4 p& J0 c' M - else if(spi==SPI2)
* D% M) [# N9 d3 i - {
4 K9 z8 R) e8 Y& ]0 z' n4 S - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 9 \4 h; U- t, D" a
- break;
( j' U: V. t" r5 y0 h( v" B - }
# c/ b/ F) R" M/ H$ f5 z - else# L& T2 _- x* s" z3 y
- break; . E* C$ y; O+ Y6 N; W5 I6 H1 e' j: S7 Q
- } ' I: }: h3 g3 F d" B/ K
- }! ^; l6 k, s+ ?) D/ d1 B: h- k' b
- //带有32位收发缓冲区的MCU需添加,否则屏蔽//// ~! R m1 u0 M8 ?5 P
" J7 a1 q/ X8 k4 ?+ V, p6 I- . `! ~, P& s' b. {
- timeout=SPI_COMM_TIMEOUT;
) w: \5 b" i5 ?6 Y; U R - /* Control the BSY flag */
; p H! F, g# g# T - while((spi->SR & SPI_FLAG_BSY) != RESET)
* d F, T6 g9 x - {4 h# j; `5 M1 c1 w+ E% i
- if((timeout--)==0); X8 K) z1 c/ \' m2 l" K: a
- {
& h, i1 L1 {3 ^( K( _ - if(spi==SPI1)4 W; N0 B& h9 z! p
- {
2 {6 o) R! }5 G7 M- A - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
' c/ j! H6 g( ?( B. P6 P9 \ - break;
0 E! w1 w' J; W - }6 U8 ]) _; o: E5 V& j
- else if(spi==SPI2)1 T2 ?8 h- w& m
- {
7 V0 V2 f8 H8 M9 w4 G# q0 I; ^ - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
/ H6 }' s1 h$ S1 ?! c f - break;
% S/ L3 w% I/ }2 x8 H; O - }
+ `. U, H7 a% `& V1 p - else1 Y- y4 o, e; x X: v# C' |
- break; % @8 f5 b& R& X1 r- e, C" X2 {9 S2 H
- }4 h. h) f7 B& B" H6 v$ y) u
- } ' b' r# ^) i: L3 t) F
* p0 J( h% o4 d3 Y6 ?- //Clear overrun flag in 2 Lines communication mode because received is not read
) B- f. k. R. z0 Z" F! f* G - tmpreg_ovr=spi->DR;
6 a+ x, Q e+ \+ e - tmpreg_ovr=spi->SR;
5 r7 W7 o7 l* L6 Y# k - }
" b" b* }7 `3 e* u# n( b - & l% t& K' t$ O* O
复制代码
1 a$ u/ ]6 l( Z6 f1 D. j |
MARK一下 看能否看到自己的标记 方便以后查找 学习