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

【经验分享】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)//寄存器版本
    / q4 w# V+ w7 \8 T3 C; q
  2. {        
    1 c# G# H! Y! p
  3.         volatile unsigned char tmpreg;0 r7 [5 x$ L; d7 ~2 H
  4.         unsigned short TxXferCount,RxXferCount;
    9 ]1 ]1 B0 b' a
  5.         unsigned char *pRxBuffPtr  = pRxData;
    / X. x% h, S/ X* x: f9 [8 G% s
  6.         unsigned char *pTxBuffPtr  = pTxData;. z0 `- }8 [& E' J6 S+ v2 I
  7.         unsigned char txallowed = 1U;7 B" K7 w& M2 z' q: Z
  8.         unsigned int timeout=SPI_COMM_TIMEOUT;
    : m7 g3 ^6 \  T
  9.         __IO unsigned int tmpreg_ovr = 0x00U;
    % G& l  {0 n6 s4 g! @9 c
  10.         TxXferCount=RxXferCount=Size;
    9 [1 Q0 y" D% h! Q5 h
  11. ; G" X5 ?) c9 ^5 B3 J
  12.         //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
    6 M9 o6 N, K. x: Z/ P" ~$ V
  13.         SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
    , F( i& b+ x/ H$ \0 {" T* }
  14. - V; Y8 {. p0 A
  15.         while((TxXferCount > 0) || (RxXferCount > 0)), x, P$ ?) w$ b! R" N
  16.         {
    " {; D9 D: a+ |2 y  w' b
  17.               // check TXE flag
    - J" C  A! E  V+ h0 F7 a  |
  18.               if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
    * `, ?* I5 o7 M
  19.               {# I( o$ x5 C( n2 d2 d# ]
  20.                         *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
    : f1 f! {& Z( X$ |) m
  21.                         TxXferCount--;
    * {' D' h; {4 K% H

  22. 7 F+ n- P# b6 T: p
  23.                         // Next Data is a reception (Rx). Tx not allowed % a( x* y3 F6 w2 _1 X0 f
  24.                         if(TxXferCount==0)
    5 s- n6 |3 L6 R5 z6 W
  25.                                 txallowed = 0U;
    6 D3 u5 r% d+ _( d. A% h6 S4 W
  26.               }+ A& S) \" y9 E6 a6 {& M
  27. ( X2 Y) y% V0 L6 L! f" h: l4 Z
  28.               /* Wait until RXNE flag is reset */
    ' f5 S8 h" H7 V7 }
  29.               if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
    5 E: W/ a+ \' c9 E9 F
  30.               {
    - {& |# O2 _. m% b1 d$ o1 M
  31.                         //改为1个字节接收,两个字节接收有的芯片会出问题( b# W8 |+ T- b7 [
  32.                         (*pRxBuffPtr++) =  *(__IO unsigned char *)&spi->DR;: v8 l' D8 X  p  S7 W$ ^) P
  33.                         RxXferCount--;
    5 h2 O- R  ~; U2 C' X
  34.                                 ( o- a1 s" o; t0 I% F/ ]  k
  35.                         if(RxXferCount <= 1)- v  |0 d) ~, ^; F6 e3 K
  36.                           {* w9 M! m& s( S) A
  37.                                     //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
    ) S, p  ~+ Q) j$ ]9 f5 K" }4 ^  ?
  38.                                     SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
    & \" I, V  z" H1 N8 C
  39.                           }               
    9 c3 n1 J; w5 E% Q: o  ]( G; e) w
  40.                                   //Next Data is a Transmission (Tx). Tx is allowed & `; x' f0 {. x* ]$ g& G4 ~3 X
  41.                        if(RxXferCount==0)           6 ^2 s, s) F" x$ r5 w; L8 O+ I
  42.                                   txallowed = 1U;, B2 ~7 f  D' a1 U
  43.               }
    + A0 ?- [! G5 l
  44. / J- [3 V, a4 [- ^6 }, e  D) S
  45.                 if((timeout--)==0)1 d9 X# d$ ]  U, [+ {9 |
  46.                 {: k! R% j5 X" V# V4 I
  47.                         if(spi==SPI1)8 u* y: r; c& z! g
  48.                         {        
    1 k' {% L8 [4 o9 c% _( ]; |, b1 e
  49.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 2 l) w! _3 t; y. I
  50.                                 break;$ x- T% N' _& D& \4 [
  51.                         }& J! z/ L5 g; f) y6 ^- T$ e
  52.                         else if(spi==SPI2)
    ( P3 l8 X4 x5 b& F
  53.                         {        # L7 c/ h5 k# X$ `6 ^
  54.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    # a, v9 t& Y6 P& s+ |
  55.                                 break;
    ( T7 Y9 Y, @+ h: P0 S0 n: l
  56.                         }
    : R8 O+ f  L5 o& o1 Z$ R- j
  57.                         else
    1 g$ v0 B  e' \* T0 Q# P; T
  58.                                 break;
    1 j/ p% }4 V! q. @4 N. P9 b. P
  59.                 }
    & S0 e; y" T1 Q4 [! P# Z, v2 m0 A
  60.         }        5 Y' _$ W& Y* J, q2 @" r: i
  61. ) t) r. V) Z2 v# w
  62. 5 ?/ J$ c" V+ h+ J& A4 ~
  63. //带有32位收发缓冲区的MCU需添加,否则屏蔽///! x0 ~' p/ f/ Y1 I" ?
  64.         timeout=SPI_COMM_TIMEOUT;0 L$ D( ]/ X3 E2 `. K4 @2 i' ^( p" J
  65.         // Check the end of the transaction
    5 M* l) \' {7 Y, O
  66.         while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)$ Q/ X+ |0 N7 T9 ?
  67.         {//发送FIFO非空时0 ~: S, E  L% H
  68.                 if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))2 j8 y2 C+ i$ i" ^
  69.                 {
    5 c1 @: [/ S8 R8 }0 g0 [' S
  70.                           tmpreg = *((__IO unsigned char*)&spi->DR);
    ) E' |7 V& G! o% `) t' i
  71.                 }
    / ?* V6 v9 Z, c; {% V$ J; r& I
  72.                
    , `3 H% ]7 T$ E* L3 F
  73.                 if((timeout--)==0)
    0 @  p/ E7 r' E. P* E5 i4 n7 t  a' T
  74.                 {( n! n6 l( m' g' V( r7 G
  75.                         if(spi==SPI1); e, b+ r# ~; t/ G3 M5 E
  76.                         {        1 t( A+ c: C9 L' a
  77.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 ( @6 |0 Q) p1 f  Z4 Y9 ?- N$ f# {  ~. n
  78.                                 break;+ W9 o# a  i8 i2 ?9 s
  79.                         }
    % C3 U5 q3 m6 Y, w2 K+ s2 L% @
  80.                         else if(spi==SPI2)' d5 v! l: a4 C
  81.                         {        6 \) \2 j- i8 A) H/ A  P
  82.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    4 }. k* U/ u+ E* ]8 \/ T0 V
  83.                                 break;5 f6 ^7 Z2 Y4 }# E% X
  84.                         }9 M! X7 y3 g" o/ t
  85.                         else
    # y9 X  e! i. v% h& j# D; d
  86.                                 break;- s2 W9 j' L& w4 S
  87.                 }                & U# [/ u- }" L  n3 @: v2 ~
  88.         }
    4 v5 p) I2 S$ A
  89. $ z& H) Q2 D4 j" ~) D/ ]7 U
  90.         timeout=SPI_COMM_TIMEOUT;6 }) Q" ?; h$ y& W( R$ M3 c
  91.         while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)# y1 d5 ]* o- B& k" q
  92.         {
    7 G$ ^* s& U. N/ d: ~
  93.                 if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
    . ?! l' ~, `- w, P4 ]! O$ j. }
  94.                 {: G1 K6 D9 k8 ?$ k
  95.                         tmpreg = *((__IO unsigned char*)&spi->DR);
    7 L3 T: n" O1 D' ~- W. n
  96.                 }
    % t) k: }7 d; \4 f
  97.                 if((timeout--)==0)
    # c9 L; b+ a8 j
  98.                 {) _& \0 `0 `* g- y& K
  99.                         if(spi==SPI1)
    6 x+ B. S3 m9 _+ P0 u
  100.                         {        
    7 u; e) `% a$ O: [; R
  101.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    ' T4 Q- @: P, ]" D! Q& A# ~* V1 f! P
  102.                                 break;
    % v4 N! U7 L' D  c+ G- x1 s6 L
  103.                         }
    5 r/ t3 u7 O. s$ B) ^1 m$ r
  104.                         else if(spi==SPI2)
    6 ]6 R1 {& V0 ~2 r
  105.                         {        
    $ f% N8 i9 H" |0 B% ?% p1 v  D! R
  106.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常                + i' _& @( w& W5 W
  107.                                 break;
    # D- a- U. f8 ~" l8 C) {
  108.                         }3 O3 R0 m' o4 i$ C
  109.                         else. E% J/ n7 o) Y- J$ J1 v
  110.                                 break;                        # b# O4 H* c4 {9 v, _
  111.                 }               
    4 h( O, ?% A. B9 [# B6 ^$ P8 n! p
  112.         }0 y' }" Z' ~# c3 G. m
  113. //带有32位收发缓冲区的MCU需添加,否则屏蔽///  w0 u3 F1 i5 s$ y1 z) ~5 ?) g
  114. 7 z6 W# G: U$ c6 m6 I
  115. 9 W% R: g* F; z) Y# O- Z
  116.         timeout=SPI_COMM_TIMEOUT;
    8 e  V- h% q& z1 H2 N
  117.         /* Control the BSY flag */
    - p7 w- B" ?! f
  118.         while((spi->SR & SPI_FLAG_BSY) != RESET)
    " q; t! m# w4 M+ I/ A4 f7 C
  119.         {( t4 T0 N; a1 n* ~) _* L7 {1 X- f
  120.                 if((timeout--)==0)
    2 \  }8 W9 r" f6 L" j2 A# D! Z
  121.                 {3 K  G0 G4 q$ k; u3 w
  122.                         if(spi==SPI1)
    1 E0 @' H: m5 c/ n
  123.                         {        / y. P% [) k0 e) }) x# N+ ?" n
  124.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
      X* C  p* X  n/ `9 N& H7 {$ `. e
  125.                                 break;
    ( ^8 k# @- L2 y8 K$ B% v" M
  126.                         }
    3 ^" ]  t/ G& E4 S' h- {
  127.                         else if(spi==SPI2)
    ; G8 K# l' X! N# \
  128.                         {        + S4 y$ e& Q4 R5 j$ W- s9 s7 _
  129.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    7 {6 \% {( e$ L! }
  130.                                 break;
    7 K% n! E, v5 B  |2 Z" Y
  131.                         }) j7 x; R6 w' n6 Q7 s, }
  132.                         else8 W! z: e4 x( r
  133.                                 break;                        
    + b. c& |1 ]8 P$ y
  134.                 }
    ) u8 b% L1 h9 o4 ^; S3 L. L
  135.         }        4 u% t, [" @1 A8 N% P
  136. 8 {$ @1 _7 Z( g( j( Q
  137.         //Clear overrun flag in 2 Lines communication mode because received is not read   
    5 ^+ e% o) m' I$ m5 U; r* {* s
  138.         tmpreg_ovr=spi->DR;* q  |/ D9 _$ h7 c; n7 H0 x$ F: W
  139.         tmpreg_ovr=spi->SR;
    1 j+ n9 W- |: _! C2 }8 ^
  140. }; h( L( a/ Q' Q. K3 ]8 P

  141. 5 X5 |& {$ T3 l* H! x
复制代码
8 }) W8 i3 g! Z( j  Q
收藏 评论1 发布时间:2021-12-11 12:00

举报

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

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

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