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

【经验分享】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)//寄存器版本
    $ n2 V: ^. P% B- h
  2. {          I( C" O+ V+ }0 ~$ k
  3.         volatile unsigned char tmpreg;+ p& v* d# g$ e' l) l
  4.         unsigned short TxXferCount,RxXferCount;
    ( u: ^( t) h/ i1 M  q
  5.         unsigned char *pRxBuffPtr  = pRxData;
    ! z) ?5 O2 k7 N. |1 J9 X$ T2 t% i% H
  6.         unsigned char *pTxBuffPtr  = pTxData;0 x0 K" C" o) g! O$ O" T0 Q
  7.         unsigned char txallowed = 1U;5 N! ~; K+ o' K: w4 |
  8.         unsigned int timeout=SPI_COMM_TIMEOUT;
    8 g. d7 n+ F2 _# z6 ?
  9.         __IO unsigned int tmpreg_ovr = 0x00U;
    $ }* t* S, r- f+ M
  10.         TxXferCount=RxXferCount=Size;
    : f+ ]! o# \, h: u+ ]

  11. . c* ?" X. P3 N! s, J. \! j; m2 N
  12.         //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
    / j5 o( j- L% R0 _! y+ d' v7 d9 I
  13.         SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);: a: D! m7 d: N
  14. 2 n& w# `( {/ f: A, _2 g' N
  15.         while((TxXferCount > 0) || (RxXferCount > 0))
      y7 }, |: p( `: p- ^
  16.         {
    1 k1 P. C/ ?' Q$ s* w- O
  17.               // check TXE flag
    6 F' A+ r) k, V0 g* L
  18.               if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
    ) ~$ F/ T* ~3 {( o
  19.               {
    + w7 k! b. t7 O& @* K: M
  20.                         *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
    0 \8 q: \0 r; P
  21.                         TxXferCount--;6 }4 Z" i8 Q5 V
  22. 9 j: p8 P7 e+ M: w4 L2 ?
  23.                         // Next Data is a reception (Rx). Tx not allowed ! G- q1 [0 F9 [+ M6 @' r
  24.                         if(TxXferCount==0)
    # b) e( R& c  V& t1 @) U8 {
  25.                                 txallowed = 0U;
    ! p1 L. |: O, h4 L+ s( |2 o
  26.               }
    ) Y3 t1 M& z5 L0 K& d+ u5 q$ m) u

  27. : D) ^2 Z9 I2 W: _. y
  28.               /* Wait until RXNE flag is reset */& }* k( L7 ]/ m) l2 K5 O1 R
  29.               if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
    6 @% f. V- w. |
  30.               {
    $ X* r# C/ w! q; P; A
  31.                         //改为1个字节接收,两个字节接收有的芯片会出问题
    2 R$ h! N$ w& n& H- d* w
  32.                         (*pRxBuffPtr++) =  *(__IO unsigned char *)&spi->DR;
    0 ^: w  j$ A. d3 W& A9 Z: y* Q  [
  33.                         RxXferCount--;  \& j* V6 c* k' x- N; k! B
  34.                                 / T% ~1 N/ @) K. W5 O7 w
  35.                         if(RxXferCount <= 1)  {3 E$ ~/ |7 L
  36.                           {. H8 E4 ?" E1 k- I( x2 @" ]
  37.                                     //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件/ I+ @. m3 X( l! v
  38.                                     SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);9 ]2 P. P* E( A, P
  39.                           }               
    5 L7 o3 M2 w2 S' @; }% j
  40.                                   //Next Data is a Transmission (Tx). Tx is allowed 9 c) W& d1 q/ j6 K1 t
  41.                        if(RxXferCount==0)           ) y/ o& y( P; C* p! {! h
  42.                                   txallowed = 1U;8 u' f( l" [) H* X! R% @. O
  43.               }
    " ]( F! z8 b3 d$ n
  44. 9 F- W2 S+ ?6 a8 |+ Q
  45.                 if((timeout--)==0), y; I9 Y& q4 ^% ^; R) o' m) z5 C
  46.                 {
    ; U2 g! e" F# p. B; a
  47.                         if(spi==SPI1)" l7 `, B6 X0 f8 X+ O
  48.                         {        : J$ F$ U# c  s9 s4 d( l
  49.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    # ?' e, H* `) }) L- g, |
  50.                                 break;) F! V! d. Z! }* `
  51.                         }  D5 l- k9 Q. @0 z; D! D
  52.                         else if(spi==SPI2)- W  C+ F, T' u) ?  P0 h
  53.                         {        
    # o  r" e3 M$ u& Q- j; Y" U5 z, ]
  54.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常                ! @5 B% r9 l  a4 q# q0 j
  55.                                 break;
    % v- i9 d1 ~8 Z
  56.                         }
    0 J) s; v) r7 t+ a
  57.                         else
    " i4 v7 y" D' t+ S6 [" R
  58.                                 break;: Z5 B9 s& P! ?3 U  H+ f8 c4 `
  59.                 }: K; z) M1 w6 _% r! H, U' q3 ^
  60.         }        
    " W. Y' b6 }# i9 R
  61. ) J/ b8 e0 G/ K# X
  62. & q# W7 V! G$ U! M0 K( c
  63. //带有32位收发缓冲区的MCU需添加,否则屏蔽///
      {- H. k4 H* I+ T
  64.         timeout=SPI_COMM_TIMEOUT;
    , H- \$ l, i1 P1 y
  65.         // Check the end of the transaction
    * M1 x4 G. b/ I# {. }  z$ ~
  66.         while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY), n: u* ~7 K: ~. Q. w+ v" H7 T
  67.         {//发送FIFO非空时
    : O6 ^. e( t) @8 ~0 h$ x. i% K
  68.                 if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY)), y9 Y: |$ G2 B. K! b
  69.                 {7 s9 s* E( g& m6 v7 C# D/ p  ]
  70.                           tmpreg = *((__IO unsigned char*)&spi->DR);/ s; h9 N5 E9 B. ?' a
  71.                 }
    8 x5 J% R3 x6 M% Z
  72.                
    % R  ?% q/ L# y7 \/ x
  73.                 if((timeout--)==0)7 |9 x! }9 P( W& x8 [6 B
  74.                 {
    / g/ o: L2 c5 s8 i8 G$ a  d
  75.                         if(spi==SPI1)
    0 Y  I) x$ h4 g. V, K' c; j
  76.                         {          J( e1 x2 H: K
  77.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常 8 @! d5 d2 ^# l' l7 N8 D: j
  78.                                 break;/ c6 w  b' `( k! p, ~2 e' V& L( P
  79.                         }
    2 g& ^$ r9 H5 J  T/ g9 ]9 U* J
  80.                         else if(spi==SPI2)
    " m2 |2 o( _4 o0 F
  81.                         {        ' ~/ z. P3 M1 B+ g
  82.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    3 J( E" X$ i: |5 Z
  83.                                 break;7 m/ O3 _, }) y+ T" {# s7 b
  84.                         }% d7 [* A) s. [( x. p
  85.                         else
    5 z- y+ E6 C0 {
  86.                                 break;  V! N/ T; Y, k* Z
  87.                 }               
    . D0 B; V  ^: r# \  P, o
  88.         }
    6 m# \& G, X: k8 \3 R% p9 ^- J

  89. 1 i8 Y4 b  L* `% V+ a* W3 p# v
  90.         timeout=SPI_COMM_TIMEOUT;
    / g  W8 v; M! w2 l; _& {9 ~
  91.         while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)
    4 A0 h+ W. L# T- v  D0 y2 w
  92.         {& `: m# l6 S4 ]
  93.                 if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY)): g. w/ q, d6 c8 b% K
  94.                 {
    ! N1 i0 i, n! P& L+ d; g
  95.                         tmpreg = *((__IO unsigned char*)&spi->DR);
    ' n9 _- o+ D1 \3 c: t' S
  96.                 }! `; z/ P5 E* p
  97.                 if((timeout--)==0), O8 ?* {/ b: A% `
  98.                 {; H9 [6 ^3 a* z  T
  99.                         if(spi==SPI1)6 q/ ^7 [" e/ }: T
  100.                         {        ( i# ^  t. ]; V$ M' V6 G% ?* w
  101.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    0 h1 f, i" f' o" v$ p: o" {
  102.                                 break;
    . i( e- Y' S8 p- h# V
  103.                         }* ?/ n6 O$ W- c3 e" A! f
  104.                         else if(spi==SPI2)
    # J9 E8 S$ t2 z
  105.                         {        , ?7 b+ V$ k! Q$ I/ T1 T3 ?
  106.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    ' M9 B3 }7 k( C$ |5 g0 {5 m
  107.                                 break;' I5 d& E5 j, C: J$ d, l6 k
  108.                         }
    - k# Z  S  h9 l5 j$ \' _7 U
  109.                         else
    + V+ y2 ?/ |  m, B/ e
  110.                                 break;                        . ?' @# k+ @1 L& Y
  111.                 }                , `( y' @' f0 L' l8 E2 I/ F
  112.         }; h0 l: r3 u3 c$ m" L$ Z. _% e
  113. //带有32位收发缓冲区的MCU需添加,否则屏蔽///
    * D. y9 c" P+ `# ^  ]
  114. 3 Z1 A9 L7 {  [' a8 E3 K( {8 z% [2 k, x7 w
  115. & t$ x0 t6 T( S) d$ m
  116.         timeout=SPI_COMM_TIMEOUT;
    ( A: T( O. K/ _6 O
  117.         /* Control the BSY flag */
    % M. t- ]" ?/ t; l
  118.         while((spi->SR & SPI_FLAG_BSY) != RESET)
    ! R4 p4 g% J+ P* ?# W8 E3 d* t
  119.         {
    ; w7 e' R3 k3 j. z8 h, }
  120.                 if((timeout--)==0)
    0 p. r* B4 T2 ?+ v/ X- j7 C2 A# U
  121.                 {
    ( i- P* ?. M7 H3 d* n+ j8 E
  122.                         if(spi==SPI1)
    + z. i3 q; {3 W4 o
  123.                         {        
    . s5 U# W3 h, z# W0 f
  124.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
    , K9 J5 q' h* _# J9 v% m; B" g
  125.                                 break;( [- U! C# i# U/ M* Q
  126.                         }
    # w7 s- G6 |, u, U
  127.                         else if(spi==SPI2), S2 Q0 u% V9 u- d% W
  128.                         {        . t! f, {  m# Q: u6 e
  129.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
    : ?9 c* j2 n+ Q( d
  130.                                 break;  m$ X1 A% `+ P
  131.                         }
    " t! P* T2 N8 g' o+ ~) d+ I/ D$ N
  132.                         else
    4 T2 q+ `9 s* U2 E) @# D5 F
  133.                                 break;                        1 q! J4 K, H: K5 o! a" e
  134.                 }, w- d6 [9 |* m5 o3 n
  135.         }        6 N+ a5 L' w( b5 A8 A  H
  136. ) f9 i& O) M2 j# A
  137.         //Clear overrun flag in 2 Lines communication mode because received is not read   
    # a: a5 {$ z  G
  138.         tmpreg_ovr=spi->DR;8 A1 M- x3 e( J- q4 `7 @* [
  139.         tmpreg_ovr=spi->SR;
    2 x; Y- c; i+ b  V, x: v
  140. }
    $ @8 y: ^9 g0 @) z

  141.   [' m& B" B6 |1 B( P9 ]6 K. e% _
复制代码
8 b, \8 i. S/ n
赞 收藏 评论1 发布时间:2021-12-11 12:00

举报

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

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

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版