STM32的SPI速度怎么这么慢?

2019-12-14 13:23发布

本帖最后由 prince2010 于 2018-12-6 10:08 编辑

代码如下——

        SPI1_CS0_Enable();
        for(i = 0; i < 1000; i++)
        {
            SPI1->DR = DataIn;
            while(!(SPI1->SR & SPI_I2S_FLAG_RXNE)); //等待一个字节接收完
            DataOut = SPI1->DR;  //返回SPI1接收的数据
        }
        SPI1_CS0_Disable();

系统时钟72MHz,可是用示波器观察,循环体就这么几句代码,字节间发送间隔竟然达到1us!!!

大家帮忙看看

补充:以下是SPI 时钟引脚的波形。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
26条回答
Eric2013
2019-12-17 07:53
发送阶段等待TXE,发送完毕后等RXNE即可,你试试。

  1. /* SPI_SR位定义 */
  2. #define RXNE    0x01
  3. #define TXE      0x02
  4. #define BSY      0x80

  5. /*
  6. *********************************************************************************************************
  7. *        函 数 名: SendBuf
  8. *        功能说明: 通过SPI接口发送多个字节
  9. *        形    参: buf 数据地址
  10. *                  sz  发送数据大小
  11. *        返 回 值: __TRUE
  12. *********************************************************************************************************
  13. */
  14. static BOOL SendBuf (U8 *buf, U32 sz)
  15. {
  16.         U32 i;

  17.         for (i = 0; i < sz; i++)
  18.         {
  19.                 SPI_SelectHard->DR = buf[i];
  20.                 /* 等待发送完成 */
  21.                 while (!(SPI_SelectHard->SR & TXE));
  22.                 SPI_SelectHard->DR;
  23.         }
  24.        
  25.         /* 等待接收完成 */
  26.         while (SPI_SelectHard->SR & (BSY | RXNE))
  27.         {
  28.                 SPI_SelectHard->DR;
  29.         }
  30.         return (__TRUE);
  31. }
复制代码

一周热门 更多>