你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】SPI读写函数寄存器版本(STM32F1xx,STM32F7xx实测完美)

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
  1. void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char  *pRxData, unsigned short  Size)//寄存器版本
    4 \2 |& ?; t3 `* y" Y# U& {
  2. {        
    ! K3 R7 z, b6 T; L0 B
  3.         volatile unsigned char tmpreg;
    : T  }. Y8 h/ i
  4.         unsigned short TxXferCount,RxXferCount;
    + c+ L2 ~% ^, m0 u
  5.         unsigned char *pRxBuffPtr  = pRxData;8 k7 x1 }% O6 o) P
  6.         unsigned char *pTxBuffPtr  = pTxData;
    $ C9 _7 Y/ ?$ c2 q* t
  7.         unsigned char txallowed = 1U;
    / ~# q( u3 H9 t" x. a" r
  8.         unsigned int timeout=SPI_COMM_TIMEOUT;5 U2 L# Z1 E' k2 E+ a! J- N5 e
  9.         __IO unsigned int tmpreg_ovr = 0x00U;7 M# u9 _6 \9 g/ C, c4 K) K3 h, G
  10.         TxXferCount=RxXferCount=Size;
    # X# S8 T' P4 h: G
  11. 5 y. W8 e2 \* p* _
  12.         //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件& o4 v1 K  U4 c4 M+ R4 |& L
  13.         SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
    0 M7 f! i) p8 v2 K, q: V

  14. , ]  l0 Q6 \, _( \/ P
  15.         while((TxXferCount > 0) || (RxXferCount > 0))( W$ E' a$ S) e2 d$ G$ T
  16.         {6 `2 Y1 l, c6 f
  17.               // check TXE flag * D1 y+ C& e- }: T; v* I7 s
  18.               if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
    : a9 O" o4 O' ?; o; f) k6 j9 z
  19.               {* b3 y1 H0 V+ N% O/ T( @
  20.                         *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);) M9 f% z8 v8 f7 D
  21.                         TxXferCount--;
    ' @4 H  f' m' ^3 _3 @% z

  22. 8 H: W+ b+ C$ ~8 M( l" ]
  23.                         // Next Data is a reception (Rx). Tx not allowed - C7 _) ~2 j- Q" ^6 }( g
  24.                         if(TxXferCount==0)
    ! U9 E2 o5 E1 \; ^
  25.                                 txallowed = 0U;" Y) z9 z# V3 Y. \$ v% ^
  26.               }- R% k5 C9 @1 J9 c, y- @
  27. : S6 Q; S5 D2 p* s1 f
  28.               /* Wait until RXNE flag is reset */6 r0 A) A$ ~1 ^( B. R* w+ F7 t) @3 j
  29.               if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
    / B5 i7 G& d6 K- e: o  X4 g& y
  30.               {! O) t2 a- g+ t' {* `) o
  31.                         //改为1个字节接收,两个字节接收有的芯片会出问题
    2 }8 v+ u- G2 y/ y3 C" j
  32.                         (*pRxBuffPtr++) =  *(__IO unsigned char *)&spi->DR;
    . b/ h6 P% _6 [
  33.                         RxXferCount--;) s7 a( Y3 O( p
  34.                                 
    ! o* O, z, Y- @! K
  35.                         if(RxXferCount <= 1)
    % v& w6 g3 q: B7 N* |1 y" W
  36.                           {- [1 x/ E# L3 B' u
  37.                                     //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
    0 v' l* z& r* ?
  38.                                     SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);3 E" S  U2 Q; K# N  p
  39.                           }               
    & N+ O" c3 A! i' x( t$ S' }  K
  40.                                   //Next Data is a Transmission (Tx). Tx is allowed
    , T' t: B: [( [4 S$ X% s
  41.                        if(RxXferCount==0)           2 c3 f3 M5 C# c
  42.                                   txallowed = 1U;% c' {; J6 P  u/ x( E
  43.               } / v! }4 h  q; s7 h4 l& T

  44. + K% k. p0 i2 n7 M: }4 ?9 |
  45.                 if((timeout--)==0)
    ' S9 e0 o" l+ F& v+ }4 ^, z
  46.                 {8 V  X8 u& [. `* [7 O' }
  47.                         if(spi==SPI1)0 K- B; v1 `/ X; r* T- x/ \7 j
  48.                         {        
    . k4 b9 ^/ a: i/ ]- i, @- o% |
  49.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    ) r0 p0 }  T$ r  S; l7 s
  50.                                 break;) J" e  m- J4 U0 D& d$ Y/ m0 M, t- e
  51.                         }& q% I/ G9 J1 J. K$ Y
  52.                         else if(spi==SPI2)
    ; Q4 J8 E& r6 a1 Q: n0 a; b
  53.                         {        : U8 o4 t4 e. h8 A/ W3 j
  54.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    5 e! q" Z, I$ h& d: j6 |' e
  55.                                 break;
    + v2 E( |4 k/ I
  56.                         }
    ) ]) T& U9 ~3 A' G8 L0 T
  57.                         else) s+ I1 t- O! t) T  T1 }: L
  58.                                 break;$ _0 y# l. |- ^% E  ]
  59.                 }7 ~0 X6 d2 k* |6 P
  60.         }        " K% `( j3 B6 b- I7 k- s. G) p
  61. - O- D7 ?! ~( _1 B

  62. & v5 `5 H  x/ r  e  }! j* }
  63. //带有32位收发缓冲区的MCU需添加,否则屏蔽///
    . x. c# n- H" Y% ^; C. m
  64.         timeout=SPI_COMM_TIMEOUT;
    6 h3 O; g3 P" O2 r$ n6 X: h+ X
  65.         // Check the end of the transaction
    + b" k+ y3 ?  H6 w/ h4 b
  66.         while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY). q/ S/ ]( F8 m7 u8 J/ @
  67.         {//发送FIFO非空时& R9 b0 B/ U, K8 j
  68.                 if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))
    ' T# ^  e+ W& b2 b. b3 T/ b
  69.                 {* W9 d" c/ i# F5 s5 s$ C  W
  70.                           tmpreg = *((__IO unsigned char*)&spi->DR);
    : o/ R* k7 q1 Q: P( V$ ^
  71.                 }9 V& L; k5 y5 J8 F" k8 j. v. j8 T' g
  72.                 8 O' s. b1 i0 ]( [4 _8 m* C! p
  73.                 if((timeout--)==0)) [& a3 r( G: Y* D
  74.                 {& S3 L# h; @5 d" o* A/ j$ m9 q
  75.                         if(spi==SPI1)" r4 j, f" z" \5 S- }
  76.                         {        
    $ p( S3 S- j' ~/ D' R
  77.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 7 a7 y! z3 p- ]7 e1 `) c
  78.                                 break;
    8 n0 u& R/ T$ V* l  x: Z5 P# L/ k  p' Z
  79.                         }
    3 B, t2 l8 D, f$ c! {+ r: p
  80.                         else if(spi==SPI2)
    7 g5 Q, Z1 B( b: L3 `- Y7 z( d1 o
  81.                         {        
    $ O) B! f' a  {
  82.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常                , C! C* Y. Y9 a" v9 l
  83.                                 break;' {( f$ P* u% [% L
  84.                         }
    ' D% [# ^, P/ m3 m
  85.                         else1 a: s/ r5 W5 A! J
  86.                                 break;
    8 I# l  S8 {2 J
  87.                 }                : q9 P3 V0 S0 E1 z3 k# @
  88.         }
    % l' S0 A; r; b& K: S

  89. . t# T5 C5 [8 N1 N% @3 i
  90.         timeout=SPI_COMM_TIMEOUT;
    & A. }; v! F: G; b5 L
  91.         while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)) ]& l7 W8 _7 G6 e( |* n3 F
  92.         {
    2 q" x, g/ J  B1 n. c
  93.                 if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
    9 V$ e( R" |% H6 y! R
  94.                 {; S1 u% Z4 b5 e4 d/ R0 k# k& x; N
  95.                         tmpreg = *((__IO unsigned char*)&spi->DR);5 y% R) g# _. r8 f
  96.                 }
      ?* b2 F4 s2 v7 y! k. \- t  n4 g3 J
  97.                 if((timeout--)==0)
    - y2 M9 @3 V6 o2 _9 p* |+ j5 \* F
  98.                 {5 O/ C$ f0 W3 d
  99.                         if(spi==SPI1)$ e) m9 `) F& @/ Y# l
  100.                         {        5 V0 R: q+ }9 d, o. V
  101.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    1 K4 x, j8 D4 N3 @9 }- s5 X! V
  102.                                 break;8 S2 p& ~: x1 _7 D. z, Y, T
  103.                         }# V' [0 p4 E- H) U) V+ _
  104.                         else if(spi==SPI2)
    5 N" x3 [8 N2 I" D4 }+ L
  105.                         {        # W/ @: T- K  f4 E- @/ A
  106.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    ; D2 [5 e+ W6 p" e- e
  107.                                 break;
    - e6 c1 m! U) r) ~; \$ O
  108.                         }9 i8 m' q  x1 w! A& x" l
  109.                         else
    . z& x- E* w4 S, u" h4 N3 M; ^+ E
  110.                                 break;                        $ h- M: v6 o9 {' `
  111.                 }                ! w' l8 E4 s( i9 {
  112.         }$ l% G5 l; e2 e' ]( `5 u0 y% h! x
  113. //带有32位收发缓冲区的MCU需添加,否则屏蔽///4 m, j) d4 y: E% w5 ~6 y
  114. ! {+ b/ M% ]2 s, T% ]4 k% U2 t
  115. - E. v; o, h) Y. n8 P
  116.         timeout=SPI_COMM_TIMEOUT;
    ; D/ Y) F9 W- X+ N# y
  117.         /* Control the BSY flag */
    % V( i5 R. Z8 e8 Z0 Q* _
  118.         while((spi->SR & SPI_FLAG_BSY) != RESET)
    8 x1 Q7 ~( I) S2 R
  119.         {' g$ d! O+ N1 g( O; O, z& D
  120.                 if((timeout--)==0)
    0 I3 I% \4 w8 j9 A
  121.                 {& {- }2 x- }3 Q, a% P) `
  122.                         if(spi==SPI1)
    6 B' U/ o9 h, p/ P! n
  123.                         {        
    & K' N- O% x8 M  O) t3 x+ y& D
  124.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    " G5 S5 D7 c. l: L" e* a
  125.                                 break;
    ) g0 P+ Z1 J7 ]7 T/ m
  126.                         }
    ; _1 |% x8 d9 M' d% R% u
  127.                         else if(spi==SPI2)+ O8 Y- u8 r/ x, Y: P
  128.                         {        4 E: |. e; E* U& G
  129.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    % B: w2 k" L! X5 C6 v5 |# q
  130.                                 break;' s. [1 V* m8 V: ]5 ?
  131.                         }, T$ T- h& o4 T+ V' q4 V, r
  132.                         else
    0 u4 }! e! u7 w. f5 T
  133.                                 break;                        
    ) b1 B; s% U/ u  @6 N
  134.                 }4 C1 Y& B' i% p4 U& P
  135.         }        
    6 A. T4 r% l' `4 }
  136. & U. Z, B# N) m6 n' m" I: ^/ l
  137.         //Clear overrun flag in 2 Lines communication mode because received is not read    / W1 x3 R( z# o- N
  138.         tmpreg_ovr=spi->DR;
    , n$ K: G0 v) p* @
  139.         tmpreg_ovr=spi->SR;2 _1 `& P. b" [
  140. }
    5 M1 ~( o" G' t+ M6 Y/ a( U9 \/ [
  141. . o5 y5 f) j' P9 L' _% s: O
复制代码
: d  t. E/ N0 N
收藏 评论1 发布时间:2021-12-11 12:00

举报

1个回答
tianqi911 回答时间:2021-12-14 10:25:35

MARK一下 看能否看到自己的标记 方便以后查找 学习

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版