- void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本; V, ?: f2 g# z# A2 ^* @; Z
- { ; V$ Y! _; t, O
- volatile unsigned char tmpreg;
# U {( p# s' Q" v4 a$ i: M( x7 d- A - unsigned short TxXferCount,RxXferCount;* N0 t7 y* i- W; F0 X1 z* w
- unsigned char *pRxBuffPtr = pRxData; u; ~8 x+ e8 C9 F
- unsigned char *pTxBuffPtr = pTxData;# h6 ~- \( c ^( A( B# J
- unsigned char txallowed = 1U;
, q$ l' B0 \$ \0 d - unsigned int timeout=SPI_COMM_TIMEOUT;
& v+ a! z- e1 _ M) n - __IO unsigned int tmpreg_ovr = 0x00U;
3 y. i0 [) M2 | j2 o* i - TxXferCount=RxXferCount=Size;, @. O7 e5 ]8 C$ g9 Y8 F
% s6 A9 @% y! @; D: }2 L- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件- b/ @" {, I+ {3 V& r
- SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
% X9 a9 C* m4 h+ l - 8 p' t8 R6 I$ \, g
- while((TxXferCount > 0) || (RxXferCount > 0)) T: ]% ]; e, e
- {
8 c$ |! k6 ]! A5 t" V1 n5 _ - // check TXE flag ! Y$ d& N) K2 W* F
- if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
$ g @3 l2 X, R+ j$ A, l+ @" G% p - {0 c2 q0 ^3 I3 P
- *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
1 H3 g9 J; o7 x) q# W0 K# g8 J - TxXferCount--;
6 o4 b7 d! N X' \! |& { - % t/ \; A" f1 V; c' Y; r# E5 E
- // Next Data is a reception (Rx). Tx not allowed
+ k2 l: F/ i+ {: Y! _ - if(TxXferCount==0)
o! t: |0 ^8 e. C. p% P& o! N - txallowed = 0U;7 U2 p% B' L5 v# X& w+ m! l! l
- }
% }# K; |+ ^7 \6 v3 e; r! H
! O6 V5 w$ k8 c! y F# }- /* Wait until RXNE flag is reset */3 v8 m& `. j( T5 ^' [3 H8 ~0 L/ t
- if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE)); {4 }& ?- f! q& |* f, ]
- {
6 ~4 @6 g( m R7 t0 y: b, q - //改为1个字节接收,两个字节接收有的芯片会出问题! _# S8 h j g+ H9 B
- (*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;
q2 n+ i* K& b1 P2 u$ ~ - RxXferCount--;
8 j; {' ^- [. R8 d - 4 l. s3 B G4 S
- if(RxXferCount <= 1)& A' }8 ^. {% J) t. Q, h
- {, |- m% b/ u' d* i3 x
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
) H0 l" f2 d. m - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);" F+ n; ]6 a. o( V% H6 t
- }
% p v2 Q- `" V9 v; X7 u: s - //Next Data is a Transmission (Tx). Tx is allowed , C+ F$ W& G/ A
- if(RxXferCount==0)
8 Q7 r- S8 n' q( ]- p% h - txallowed = 1U;. Q. J ~* E0 j7 v% ?2 d3 |, K
- } 8 S2 A- K; N7 u# j
1 D$ K1 `+ }0 b- if((timeout--)==0)
3 R# n f# W* Z. [ g, E' @, ^ - {
+ n/ N2 y: G' x2 ~2 e: T) Q- t) P - if(spi==SPI1)
2 [, m1 @1 E* V0 u, ?+ [ - { 1 I- i/ }1 @6 X) I v% q; d2 I
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 1 O" t. V0 v8 @! }
- break;" I7 Z; |7 p! ]1 M% u
- }
6 T, O0 i2 R+ y5 B$ | - else if(spi==SPI2)% } s8 d4 Q* r
- {
* F$ ]4 Q( g- ]0 ?3 r: U - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
& E: x% H9 }4 C4 G' ] - break;
# p' l. C2 P* u0 e9 m n$ G1 x6 \ - }7 b9 P$ s7 J# [+ a
- else
' e# X- U- p6 \/ t7 u4 t; a - break;
- o1 P! y: {9 w' `* P2 l) S8 }1 V# t - }% Y+ }# l6 p6 g6 n9 ]
- } + p4 C* q# ^: d
% E2 q! T6 w$ A I
5 E2 c) E9 }. ~/ `9 N) x3 i% A: }- //带有32位收发缓冲区的MCU需添加,否则屏蔽///0 x& X4 O) x5 i) e
- timeout=SPI_COMM_TIMEOUT;
" `) t3 }4 W+ ^! k$ X1 T - // Check the end of the transaction 6 ~" r0 e5 ~; p( R: |. K* z
- while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)
$ o5 v! V* y% ~2 D - {//发送FIFO非空时3 B3 j# Q% d" g, r; F
- if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))/ ^2 r. c1 }, A3 F# d% w. b
- {4 N1 c' f( |- M- f
- tmpreg = *((__IO unsigned char*)&spi->DR);
5 X! W# C/ H- \5 p F I( G2 C6 A - }
2 D4 ?9 Y/ H+ s' W -
& l& [8 F8 n$ H - if((timeout--)==0)
8 {; \* ]9 l2 E. [6 I - {; }" b3 O3 b$ A+ s
- if(spi==SPI1)
1 H3 A/ J$ |" I" E. O - { * B5 b2 b0 ~, Q8 Z
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 8 F5 F3 h. t6 e' Y6 K' F- t* T
- break;
4 G0 ?9 x! j. M! _7 s" z+ E& D" q1 G - }
- U& }" Q2 ^6 \- a" [6 _, i - else if(spi==SPI2)
6 O& @2 f$ R$ K; b1 }0 z) x8 [1 ~' M - {
$ _& `( I0 O: D: V* Q7 B - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 5 [0 s$ J( i, k$ O+ ~
- break;8 x2 U; d; w2 t) [7 B- ?1 k* y: R
- }
2 D$ p' ?- R6 E) r: g2 l: \: V: }9 U! Z - else
2 W" \6 D+ |% L ~" u - break;
6 D9 ?7 M9 x+ o# H, Z' c - }
$ f8 N, x8 x k/ a - }1 [% G! a) Q% ^+ F. S7 v; n
- - Q4 J' H9 \( |0 M5 }' f0 `
- timeout=SPI_COMM_TIMEOUT;; O. G* \6 R1 S: n9 ]4 }0 |7 v- p
- while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)2 m( |+ y+ }# ~; o+ j1 ?0 [7 Z3 f
- {
) N' ~6 f* \9 v# W8 l4 ^! O0 I - if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
( k$ A% s5 L) c" b+ |1 R+ o4 h - {" P4 j, ^# s+ w; Y% p: s
- tmpreg = *((__IO unsigned char*)&spi->DR);; M, w% W9 y7 @" g3 B
- }5 h6 c2 x4 C6 Z5 E2 l( g* e
- if((timeout--)==0)% X- @* S7 l: ~9 Y+ S, l q
- {
) l& P" j9 s5 ^( U3 P% i2 a6 o2 r - if(spi==SPI1)' c2 ?+ D7 }7 `3 Q% B! W6 C3 t( Q
- {
: {( H7 }9 \- Y& N - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 % \- [- l6 y4 j$ t5 [- k6 i4 R( ^
- break;- _- q8 ~( z7 \% O U- Z
- }0 J; R z5 G, i
- else if(spi==SPI2)! g* s8 X( n. S& ~
- {
2 C& n: r0 N t( y$ r9 g! B6 y* j - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
) y/ N! `7 Z3 V: ~4 m - break;
: K5 L' ^2 ^4 P# ? - }/ @2 K) @- G- I
- else
" T4 o: W: M1 j e/ A - break; 7 z6 d" g8 X( Q* b
- }
3 T# r3 k* Q% M9 b# P& }- _( e - }' {) s+ v, i* ^& I; v' Y; x$ z7 d
- //带有32位收发缓冲区的MCU需添加,否则屏蔽///) d7 B& I+ Q- W& x( r, f
% O! G# @: T3 h- E# C- 9 u+ M/ l& ^! T* S
- timeout=SPI_COMM_TIMEOUT;
1 w$ @& U8 {3 ]! h - /* Control the BSY flag */' q7 G% w, g' a2 w1 S6 B' ` Z
- while((spi->SR & SPI_FLAG_BSY) != RESET)
" E' x6 L0 u- p# S6 ~3 |. e - {& F4 R& C" e6 q* r2 h* Z
- if((timeout--)==0); U! |; j, T" Z8 K0 r
- {
- u# x3 E( J7 |0 D1 B, M - if(spi==SPI1). `% g4 U$ f9 ~+ o& V4 P
- { 4 e1 I1 ]( p" z: R) P |* U! T- K- b
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
$ N! q+ R3 P( y+ A+ Z# ]' Q - break;' q* a1 y# B |/ K+ `* j
- }
. x: _. K& O% y - else if(spi==SPI2)
0 P: I( n, Z& d q - {
]+ p" c* y& {9 P( J% K1 X/ _ - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
}9 f$ o& Q: E7 N - break;& M, A3 [4 p1 r8 ^
- }
! m9 ^# M4 P b6 {& V8 e - else
b* h: B, Z) ]) T ^% t! C - break;
( Q: j+ v4 F: O" x3 i2 I - }
# w) `9 i( u7 A1 H - } " r" D8 F7 f8 M' Q
- ! X6 M0 m& p* h9 m6 h
- //Clear overrun flag in 2 Lines communication mode because received is not read
- W8 X3 y# e/ A7 ]( u$ Q - tmpreg_ovr=spi->DR;& r( o9 Q# f/ r+ @! S% c
- tmpreg_ovr=spi->SR;; Z4 }0 u* y. O
- }
- A1 v0 @/ A2 Z `6 d- r8 u, F; h
0 p$ T/ v/ c) k/ @2 _; h
复制代码 + \ o- q! q4 C5 @( s6 R# s+ c2 i
|
MARK一下 看能否看到自己的标记 方便以后查找 学习