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

【经验分享】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)//寄存器版本
  2. {        
  3.         volatile unsigned char tmpreg;
  4.         unsigned short TxXferCount,RxXferCount;
  5.         unsigned char *pRxBuffPtr  = pRxData;
  6.         unsigned char *pTxBuffPtr  = pTxData;
  7.         unsigned char txallowed = 1U;
  8.         unsigned int timeout=SPI_COMM_TIMEOUT;
  9.         __IO unsigned int tmpreg_ovr = 0x00U;
  10.         TxXferCount=RxXferCount=Size;

  11.         //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
  12.         SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);

  13.         while((TxXferCount > 0) || (RxXferCount > 0))
  14.         {
  15.               // check TXE flag
  16.               if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
  17.               {
  18.                         *(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
  19.                         TxXferCount--;

  20.                         // Next Data is a reception (Rx). Tx not allowed
  21.                         if(TxXferCount==0)
  22.                                 txallowed = 0U;
  23.               }

  24.               /* Wait until RXNE flag is reset */
  25.               if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
  26.               {
  27.                         //改为1个字节接收,两个字节接收有的芯片会出问题
  28.                         (*pRxBuffPtr++) =  *(__IO unsigned char *)&spi->DR;
  29.                         RxXferCount--;
  30.                                 
  31.                         if(RxXferCount <= 1)
  32.                           {
  33.                                     //如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
  34.                                     SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
  35.                           }               
  36.                                   //Next Data is a Transmission (Tx). Tx is allowed
  37.                        if(RxXferCount==0)           
  38.                                   txallowed = 1U;
  39.               }

  40.                 if((timeout--)==0)
  41.                 {
  42.                         if(spi==SPI1)
  43.                         {        
  44.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
  45.                                 break;
  46.                         }
  47.                         else if(spi==SPI2)
  48.                         {        
  49.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
  50.                                 break;
  51.                         }
  52.                         else
  53.                                 break;
  54.                 }
  55.         }        


  56. //带有32位收发缓冲区的MCU需添加,否则屏蔽///
  57.         timeout=SPI_COMM_TIMEOUT;
  58.         // Check the end of the transaction
  59.         while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)
  60.         {//发送FIFO非空时
  61.                 if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))
  62.                 {
  63.                           tmpreg = *((__IO unsigned char*)&spi->DR);
  64.                 }
  65.                
  66.                 if((timeout--)==0)
  67.                 {
  68.                         if(spi==SPI1)
  69.                         {        
  70.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
  71.                                 break;
  72.                         }
  73.                         else if(spi==SPI2)
  74.                         {        
  75.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
  76.                                 break;
  77.                         }
  78.                         else
  79.                                 break;
  80.                 }               
  81.         }

  82.         timeout=SPI_COMM_TIMEOUT;
  83.         while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)
  84.         {
  85.                 if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
  86.                 {
  87.                         tmpreg = *((__IO unsigned char*)&spi->DR);
  88.                 }
  89.                 if((timeout--)==0)
  90.                 {
  91.                         if(spi==SPI1)
  92.                         {        
  93.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
  94.                                 break;
  95.                         }
  96.                         else if(spi==SPI2)
  97.                         {        
  98.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
  99.                                 break;
  100.                         }
  101.                         else
  102.                                 break;                        
  103.                 }               
  104.         }
  105. //带有32位收发缓冲区的MCU需添加,否则屏蔽///


  106.         timeout=SPI_COMM_TIMEOUT;
  107.         /* Control the BSY flag */
  108.         while((spi->SR & SPI_FLAG_BSY) != RESET)
  109.         {
  110.                 if((timeout--)==0)
  111.                 {
  112.                         if(spi==SPI1)
  113.                         {        
  114.                                 SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
  115.                                 break;
  116.                         }
  117.                         else if(spi==SPI2)
  118.                         {        
  119.                                 SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常               
  120.                                 break;
  121.                         }
  122.                         else
  123.                                 break;                        
  124.                 }
  125.         }        

  126.         //Clear overrun flag in 2 Lines communication mode because received is not read   
  127.         tmpreg_ovr=spi->DR;
  128.         tmpreg_ovr=spi->SR;
  129. }

复制代码

收藏 评论1 发布时间:2021-12-11 12:00

举报

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

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

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版