- void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本
/ q4 w# V+ w7 \8 T3 C; q - {
1 c# G# H! Y! p - volatile unsigned char tmpreg;0 r7 [5 x$ L; d7 ~2 H
- unsigned short TxXferCount,RxXferCount;
9 ]1 ]1 B0 b' a - unsigned char *pRxBuffPtr = pRxData;
/ X. x% h, S/ X* x: f9 [8 G% s - unsigned char *pTxBuffPtr = pTxData;. z0 `- }8 [& E' J6 S+ v2 I
- unsigned char txallowed = 1U;7 B" K7 w& M2 z' q: Z
- unsigned int timeout=SPI_COMM_TIMEOUT;
: m7 g3 ^6 \ T - __IO unsigned int tmpreg_ovr = 0x00U;
% G& l {0 n6 s4 g! @9 c - TxXferCount=RxXferCount=Size;
9 [1 Q0 y" D% h! Q5 h - ; G" X5 ?) c9 ^5 B3 J
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
6 M9 o6 N, K. x: Z/ P" ~$ V - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
, F( i& b+ x/ H$ \0 {" T* } - - V; Y8 {. p0 A
- while((TxXferCount > 0) || (RxXferCount > 0)), x, P$ ?) w$ b! R" N
- {
" {; D9 D: a+ |2 y w' b - // check TXE flag
- J" C A! E V+ h0 F7 a | - if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
* `, ?* I5 o7 M - {# I( o$ x5 C( n2 d2 d# ]
- *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
: f1 f! {& Z( X$ |) m - TxXferCount--;
* {' D' h; {4 K% H
7 F+ n- P# b6 T: p- // Next Data is a reception (Rx). Tx not allowed % a( x* y3 F6 w2 _1 X0 f
- if(TxXferCount==0)
5 s- n6 |3 L6 R5 z6 W - txallowed = 0U;
6 D3 u5 r% d+ _( d. A% h6 S4 W - }+ A& S) \" y9 E6 a6 {& M
- ( X2 Y) y% V0 L6 L! f" h: l4 Z
- /* Wait until RXNE flag is reset */
' f5 S8 h" H7 V7 } - if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
5 E: W/ a+ \' c9 E9 F - {
- {& |# O2 _. m% b1 d$ o1 M - //改为1个字节接收,两个字节接收有的芯片会出问题( b# W8 |+ T- b7 [
- (*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;: v8 l' D8 X p S7 W$ ^) P
- RxXferCount--;
5 h2 O- R ~; U2 C' X - ( o- a1 s" o; t0 I% F/ ] k
- if(RxXferCount <= 1)- v |0 d) ~, ^; F6 e3 K
- {* w9 M! m& s( S) A
- //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
) S, p ~+ Q) j$ ]9 f5 K" }4 ^ ? - SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
& \" I, V z" H1 N8 C - }
9 c3 n1 J; w5 E% Q: o ]( G; e) w - //Next Data is a Transmission (Tx). Tx is allowed & `; x' f0 {. x* ]$ g& G4 ~3 X
- if(RxXferCount==0) 6 ^2 s, s) F" x$ r5 w; L8 O+ I
- txallowed = 1U;, B2 ~7 f D' a1 U
- }
+ A0 ?- [! G5 l - / J- [3 V, a4 [- ^6 }, e D) S
- if((timeout--)==0)1 d9 X# d$ ] U, [+ {9 |
- {: k! R% j5 X" V# V4 I
- if(spi==SPI1)8 u* y: r; c& z! g
- {
1 k' {% L8 [4 o9 c% _( ]; |, b1 e - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 2 l) w! _3 t; y. I
- break;$ x- T% N' _& D& \4 [
- }& J! z/ L5 g; f) y6 ^- T$ e
- else if(spi==SPI2)
( P3 l8 X4 x5 b& F - { # L7 c/ h5 k# X$ `6 ^
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
# a, v9 t& Y6 P& s+ | - break;
( T7 Y9 Y, @+ h: P0 S0 n: l - }
: R8 O+ f L5 o& o1 Z$ R- j - else
1 g$ v0 B e' \* T0 Q# P; T - break;
1 j/ p% }4 V! q. @4 N. P9 b. P - }
& S0 e; y" T1 Q4 [! P# Z, v2 m0 A - } 5 Y' _$ W& Y* J, q2 @" r: i
- ) t) r. V) Z2 v# w
- 5 ?/ J$ c" V+ h+ J& A4 ~
- //带有32位收发缓冲区的MCU需添加,否则屏蔽///! x0 ~' p/ f/ Y1 I" ?
- timeout=SPI_COMM_TIMEOUT;0 L$ D( ]/ X3 E2 `. K4 @2 i' ^( p" J
- // Check the end of the transaction
5 M* l) \' {7 Y, O - while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)$ Q/ X+ |0 N7 T9 ?
- {//发送FIFO非空时0 ~: S, E L% H
- if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))2 j8 y2 C+ i$ i" ^
- {
5 c1 @: [/ S8 R8 }0 g0 [' S - tmpreg = *((__IO unsigned char*)&spi->DR);
) E' |7 V& G! o% `) t' i - }
/ ?* V6 v9 Z, c; {% V$ J; r& I -
, `3 H% ]7 T$ E* L3 F - if((timeout--)==0)
0 @ p/ E7 r' E. P* E5 i4 n7 t a' T - {( n! n6 l( m' g' V( r7 G
- if(spi==SPI1); e, b+ r# ~; t/ G3 M5 E
- { 1 t( A+ c: C9 L' a
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 ( @6 |0 Q) p1 f Z4 Y9 ?- N$ f# { ~. n
- break;+ W9 o# a i8 i2 ?9 s
- }
% C3 U5 q3 m6 Y, w2 K+ s2 L% @ - else if(spi==SPI2)' d5 v! l: a4 C
- { 6 \) \2 j- i8 A) H/ A P
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
4 }. k* U/ u+ E* ]8 \/ T0 V - break;5 f6 ^7 Z2 Y4 }# E% X
- }9 M! X7 y3 g" o/ t
- else
# y9 X e! i. v% h& j# D; d - break;- s2 W9 j' L& w4 S
- } & U# [/ u- }" L n3 @: v2 ~
- }
4 v5 p) I2 S$ A - $ z& H) Q2 D4 j" ~) D/ ]7 U
- timeout=SPI_COMM_TIMEOUT;6 }) Q" ?; h$ y& W( R$ M3 c
- while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)# y1 d5 ]* o- B& k" q
- {
7 G$ ^* s& U. N/ d: ~ - if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
. ?! l' ~, `- w, P4 ]! O$ j. } - {: G1 K6 D9 k8 ?$ k
- tmpreg = *((__IO unsigned char*)&spi->DR);
7 L3 T: n" O1 D' ~- W. n - }
% t) k: }7 d; \4 f - if((timeout--)==0)
# c9 L; b+ a8 j - {) _& \0 `0 `* g- y& K
- if(spi==SPI1)
6 x+ B. S3 m9 _+ P0 u - {
7 u; e) `% a$ O: [; R - SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
' T4 Q- @: P, ]" D! Q& A# ~* V1 f! P - break;
% v4 N! U7 L' D c+ G- x1 s6 L - }
5 r/ t3 u7 O. s$ B) ^1 m$ r - else if(spi==SPI2)
6 ]6 R1 {& V0 ~2 r - {
$ f% N8 i9 H" |0 B% ?% p1 v D! R - SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常 + i' _& @( w& W5 W
- break;
# D- a- U. f8 ~" l8 C) { - }3 O3 R0 m' o4 i$ C
- else. E% J/ n7 o) Y- J$ J1 v
- break; # b# O4 H* c4 {9 v, _
- }
4 h( O, ?% A. B9 [# B6 ^$ P8 n! p - }0 y' }" Z' ~# c3 G. m
- //带有32位收发缓冲区的MCU需添加,否则屏蔽/// w0 u3 F1 i5 s$ y1 z) ~5 ?) g
- 7 z6 W# G: U$ c6 m6 I
- 9 W% R: g* F; z) Y# O- Z
- timeout=SPI_COMM_TIMEOUT;
8 e V- h% q& z1 H2 N - /* Control the BSY flag */
- p7 w- B" ?! f - while((spi->SR & SPI_FLAG_BSY) != RESET)
" q; t! m# w4 M+ I/ A4 f7 C - {( t4 T0 N; a1 n* ~) _* L7 {1 X- f
- if((timeout--)==0)
2 \ }8 W9 r" f6 L" j2 A# D! Z - {3 K G0 G4 q$ k; u3 w
- if(spi==SPI1)
1 E0 @' H: m5 c/ n - { / y. P% [) k0 e) }) x# N+ ?" n
- SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
X* C p* X n/ `9 N& H7 {$ `. e - break;
( ^8 k# @- L2 y8 K$ B% v" M - }
3 ^" ] t/ G& E4 S' h- { - else if(spi==SPI2)
; G8 K# l' X! N# \ - { + S4 y$ e& Q4 R5 j$ W- s9 s7 _
- SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
7 {6 \% {( e$ L! } - break;
7 K% n! E, v5 B |2 Z" Y - }) j7 x; R6 w' n6 Q7 s, }
- else8 W! z: e4 x( r
- break;
+ b. c& |1 ]8 P$ y - }
) u8 b% L1 h9 o4 ^; S3 L. L - } 4 u% t, [" @1 A8 N% P
- 8 {$ @1 _7 Z( g( j( Q
- //Clear overrun flag in 2 Lines communication mode because received is not read
5 ^+ e% o) m' I$ m5 U; r* {* s - tmpreg_ovr=spi->DR;* q |/ D9 _$ h7 c; n7 H0 x$ F: W
- tmpreg_ovr=spi->SR;
1 j+ n9 W- |: _! C2 }8 ^ - }; h( L( a/ Q' Q. K3 ]8 P
5 X5 |& {$ T3 l* H! x
复制代码 8 }) W8 i3 g! Z( j Q
|
MARK一下 看能否看到自己的标记 方便以后查找 学习