- void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本
$ n2 V: ^. P% B- h - { I( C" O+ V+ }0 ~$ k
- volatile unsigned char tmpreg;+ p& v* d# g$ e' l) l
- unsigned short TxXferCount,RxXferCount;
( u: ^( t) h/ i1 M q - unsigned char *pRxBuffPtr = pRxData;
! z) ?5 O2 k7 N. |1 J9 X$ T2 t% i% H - unsigned char *pTxBuffPtr = pTxData;0 x0 K" C" o) g! O$ O" T0 Q
- unsigned char txallowed = 1U;5 N! ~; K+ o' K: w4 |
- unsigned int timeout=SPI_COMM_TIMEOUT;
8 g. d7 n+ F2 _# z6 ? - __IO unsigned int tmpreg_ovr = 0x00U;
$ }* t* S, r- f+ M - TxXferCount=RxXferCount=Size;
: f+ ]! o# \, h: u+ ]
. c* ?" X. P3 N! s, J. \! j; m2 N- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
/ j5 o( j- L% R0 _! y+ d' v7 d9 I - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);: a: D! m7 d: N
- 2 n& w# `( {/ f: A, _2 g' N
- while((TxXferCount > 0) || (RxXferCount > 0))
y7 }, |: p( `: p- ^ - {
1 k1 P. C/ ?' Q$ s* w- O - // check TXE flag
6 F' A+ r) k, V0 g* L - if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
) ~$ F/ T* ~3 {( o - {
+ w7 k! b. t7 O& @* K: M - *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
0 \8 q: \0 r; P - TxXferCount--;6 }4 Z" i8 Q5 V
- 9 j: p8 P7 e+ M: w4 L2 ?
- // Next Data is a reception (Rx). Tx not allowed ! G- q1 [0 F9 [+ M6 @' r
- if(TxXferCount==0)
# b) e( R& c V& t1 @) U8 { - txallowed = 0U;
! p1 L. |: O, h4 L+ s( |2 o - }
) Y3 t1 M& z5 L0 K& d+ u5 q$ m) u
: D) ^2 Z9 I2 W: _. y- /* Wait until RXNE flag is reset */& }* k( L7 ]/ m) l2 K5 O1 R
- if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
6 @% f. V- w. | - {
$ X* r# C/ w! q; P; A - //改为1个字节接收,两个字节接收有的芯片会出问题
2 R$ h! N$ w& n& H- d* w - (*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;
0 ^: w j$ A. d3 W& A9 Z: y* Q [ - RxXferCount--; \& j* V6 c* k' x- N; k! B
- / T% ~1 N/ @) K. W5 O7 w
- if(RxXferCount <= 1) {3 E$ ~/ |7 L
- {. H8 E4 ?" E1 k- I( x2 @" ]
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件/ I+ @. m3 X( l! v
- SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);9 ]2 P. P* E( A, P
- }
5 L7 o3 M2 w2 S' @; }% j - //Next Data is a Transmission (Tx). Tx is allowed 9 c) W& d1 q/ j6 K1 t
- if(RxXferCount==0) ) y/ o& y( P; C* p! {! h
- txallowed = 1U;8 u' f( l" [) H* X! R% @. O
- }
" ]( F! z8 b3 d$ n - 9 F- W2 S+ ?6 a8 |+ Q
- if((timeout--)==0), y; I9 Y& q4 ^% ^; R) o' m) z5 C
- {
; U2 g! e" F# p. B; a - if(spi==SPI1)" l7 `, B6 X0 f8 X+ O
- { : J$ F$ U# c s9 s4 d( l
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
# ?' e, H* `) }) L- g, | - break;) F! V! d. Z! }* `
- } D5 l- k9 Q. @0 z; D! D
- else if(spi==SPI2)- W C+ F, T' u) ? P0 h
- {
# o r" e3 M$ u& Q- j; Y" U5 z, ] - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 ! @5 B% r9 l a4 q# q0 j
- break;
% v- i9 d1 ~8 Z - }
0 J) s; v) r7 t+ a - else
" i4 v7 y" D' t+ S6 [" R - break;: Z5 B9 s& P! ?3 U H+ f8 c4 `
- }: K; z) M1 w6 _% r! H, U' q3 ^
- }
" W. Y' b6 }# i9 R - ) J/ b8 e0 G/ K# X
- & q# W7 V! G$ U! M0 K( c
- //带有32位收发缓冲区的MCU需添加,否则屏蔽///
{- H. k4 H* I+ T - timeout=SPI_COMM_TIMEOUT;
, H- \$ l, i1 P1 y - // Check the end of the transaction
* M1 x4 G. b/ I# {. } z$ ~ - while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY), n: u* ~7 K: ~. Q. w+ v" H7 T
- {//发送FIFO非空时
: O6 ^. e( t) @8 ~0 h$ x. i% K - if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY)), y9 Y: |$ G2 B. K! b
- {7 s9 s* E( g& m6 v7 C# D/ p ]
- tmpreg = *((__IO unsigned char*)&spi->DR);/ s; h9 N5 E9 B. ?' a
- }
8 x5 J% R3 x6 M% Z -
% R ?% q/ L# y7 \/ x - if((timeout--)==0)7 |9 x! }9 P( W& x8 [6 B
- {
/ g/ o: L2 c5 s8 i8 G$ a d - if(spi==SPI1)
0 Y I) x$ h4 g. V, K' c; j - { J( e1 x2 H: K
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 8 @! d5 d2 ^# l' l7 N8 D: j
- break;/ c6 w b' `( k! p, ~2 e' V& L( P
- }
2 g& ^$ r9 H5 J T/ g9 ]9 U* J - else if(spi==SPI2)
" m2 |2 o( _4 o0 F - { ' ~/ z. P3 M1 B+ g
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
3 J( E" X$ i: |5 Z - break;7 m/ O3 _, }) y+ T" {# s7 b
- }% d7 [* A) s. [( x. p
- else
5 z- y+ E6 C0 { - break; V! N/ T; Y, k* Z
- }
. D0 B; V ^: r# \ P, o - }
6 m# \& G, X: k8 \3 R% p9 ^- J
1 i8 Y4 b L* `% V+ a* W3 p# v- timeout=SPI_COMM_TIMEOUT;
/ g W8 v; M! w2 l; _& {9 ~ - while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)
4 A0 h+ W. L# T- v D0 y2 w - {& `: m# l6 S4 ]
- if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY)): g. w/ q, d6 c8 b% K
- {
! N1 i0 i, n! P& L+ d; g - tmpreg = *((__IO unsigned char*)&spi->DR);
' n9 _- o+ D1 \3 c: t' S - }! `; z/ P5 E* p
- if((timeout--)==0), O8 ?* {/ b: A% `
- {; H9 [6 ^3 a* z T
- if(spi==SPI1)6 q/ ^7 [" e/ }: T
- { ( i# ^ t. ]; V$ M' V6 G% ?* w
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
0 h1 f, i" f' o" v$ p: o" { - break;
. i( e- Y' S8 p- h# V - }* ?/ n6 O$ W- c3 e" A! f
- else if(spi==SPI2)
# J9 E8 S$ t2 z - { , ?7 b+ V$ k! Q$ I/ T1 T3 ?
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
' M9 B3 }7 k( C$ |5 g0 {5 m - break;' I5 d& E5 j, C: J$ d, l6 k
- }
- k# Z S h9 l5 j$ \' _7 U - else
+ V+ y2 ?/ | m, B/ e - break; . ?' @# k+ @1 L& Y
- } , `( y' @' f0 L' l8 E2 I/ F
- }; h0 l: r3 u3 c$ m" L$ Z. _% e
- //带有32位收发缓冲区的MCU需添加,否则屏蔽///
* D. y9 c" P+ `# ^ ] - 3 Z1 A9 L7 { [' a8 E3 K( {8 z% [2 k, x7 w
- & t$ x0 t6 T( S) d$ m
- timeout=SPI_COMM_TIMEOUT;
( A: T( O. K/ _6 O - /* Control the BSY flag */
% M. t- ]" ?/ t; l - while((spi->SR & SPI_FLAG_BSY) != RESET)
! R4 p4 g% J+ P* ?# W8 E3 d* t - {
; w7 e' R3 k3 j. z8 h, } - if((timeout--)==0)
0 p. r* B4 T2 ?+ v/ X- j7 C2 A# U - {
( i- P* ?. M7 H3 d* n+ j8 E - if(spi==SPI1)
+ z. i3 q; {3 W4 o - {
. s5 U# W3 h, z# W0 f - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
, K9 J5 q' h* _# J9 v% m; B" g - break;( [- U! C# i# U/ M* Q
- }
# w7 s- G6 |, u, U - else if(spi==SPI2), S2 Q0 u% V9 u- d% W
- { . t! f, { m# Q: u6 e
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
: ?9 c* j2 n+ Q( d - break; m$ X1 A% `+ P
- }
" t! P* T2 N8 g' o+ ~) d+ I/ D$ N - else
4 T2 q+ `9 s* U2 E) @# D5 F - break; 1 q! J4 K, H: K5 o! a" e
- }, w- d6 [9 |* m5 o3 n
- } 6 N+ a5 L' w( b5 A8 A H
- ) f9 i& O) M2 j# A
- //Clear overrun flag in 2 Lines communication mode because received is not read
# a: a5 {$ z G - tmpreg_ovr=spi->DR;8 A1 M- x3 e( J- q4 `7 @* [
- tmpreg_ovr=spi->SR;
2 x; Y- c; i+ b V, x: v - }
$ @8 y: ^9 g0 @) z
[' m& B" B6 |1 B( P9 ]6 K. e% _
复制代码 8 b, \8 i. S/ n
|
MARK一下 看能否看到自己的标记 方便以后查找 学习