搜索
bottom↓
回复: 26

STM32的SPI速度怎么这么慢?

[复制链接]

出0入0汤圆

发表于 2018-12-6 09:26:49 | 显示全部楼层 |阅读模式
本帖最后由 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 时钟引脚的波形。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-12-6 09:33:27 | 显示全部楼层
你用的是硬件SPI?那得看你是如何配置速率的,比如时钟,分频等。

出0入4汤圆

发表于 2018-12-6 09:34:34 | 显示全部楼层
字节间发送间隔竟然达到1us!!!

是不是for循环引起的?   可以尝试用库 一次发送多个字节 的方式  速度就上去了。

出0入0汤圆

 楼主| 发表于 2018-12-6 09:35:23 | 显示全部楼层
wuha 发表于 2018-12-6 09:33
你用的是硬件SPI?那得看你是如何配置速率的,比如时钟,分频等。

是36MHz——

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;       //设置SPI工作模式:设置为主SPI
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;     //选择了串行时钟的稳态:时钟悬空高  1
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;    //数据捕获于第1个时钟沿           0
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;       //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;        //定义波特率预分频的值:波特率预分频值为16
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;    //CRC值计算的多项式
    SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

出0入42汤圆

发表于 2018-12-6 09:40:56 | 显示全部楼层
LZ试试这个。。

  1. int txcnt, rxcnt;
  2. uint32_t sr;
  3. SPI1_CS0_Enable();
  4. txcnt = SPI1->DR;//空读
  5. txcnt = rxcnt = 0;
  6. while(1)
  7. {
  8.     sr = SPI1->SR;
  9.     if(sr & SPI_I2S_FLAG_TXE)
  10.     {
  11.         if(txcnt < 1000)
  12.             SPI1->DR = DataIn[txcnt++];
  13.     }
  14.     if(sr & SPI_I2S_FLAG_RXNE)
  15.     {
  16.         if(rxcnt < 1000)
  17.             DataOut[rxcnt++] = SPI1->DR;
  18.     }
  19.     if(rxcnt >= 1000 && txcnt >= 1000)
  20.     {
  21.         break;
  22.     }
  23. }
  24. SPI1_CS0_Disable();
复制代码

出0入90汤圆

发表于 2018-12-6 09:44:46 | 显示全部楼层
想快就用DMA,这个波形是连续的

出30入54汤圆

发表于 2018-12-6 09:46:54 | 显示全部楼层
楼主不用奇怪,把反汇编打开来看看,再看看优化等级,另外一些总线寄存器访问并不是单、双周期的,可能要等很久,再另外程序在flash上面跑并不是全速的,反正存在各种可能的原因

出0入0汤圆

 楼主| 发表于 2018-12-6 09:48:55 | 显示全部楼层

跑不起来。  

出0入0汤圆

 楼主| 发表于 2018-12-6 10:00:02 | 显示全部楼层
cloudboy 发表于 2018-12-6 09:46
楼主不用奇怪,把反汇编打开来看看,再看看优化等级,另外一些总线寄存器访问并不是单、双周期的,可能要等 ...

平时基本不敢开优化,我刚试了以下(O3,Optimize for Time),直接跑不起来了。

不知道优化需要注意什么?

出0入0汤圆

 楼主| 发表于 2018-12-6 10:29:39 | 显示全部楼层
不知道是代码执行效率的问题,还是SPI硬件的问题?

出0入0汤圆

 楼主| 发表于 2018-12-6 10:39:11 | 显示全部楼层
这儿有篇类似的帖子——

http://bbs.21ic.com/icview-1211954-1-1.html

出0入0汤圆

发表于 2018-12-6 11:38:44 | 显示全部楼层
一个循环里面多发送几次看看是不是也一样的.

出30入54汤圆

发表于 2018-12-6 11:51:34 | 显示全部楼层
prince2010 发表于 2018-12-6 10:00
平时基本不敢开优化,我刚试了以下(O3,Optimize for Time),直接跑不起来了。

不知道优化需要注意什 ...

优化和抗优化这个东西要自己慢慢体会,搜一下volatile相关的知识,然后不断地尝试debug代码,初学者就走这条路。等你经验多了,自然知道哪里要开优化,哪里出错可能的原因是什么了

出0入0汤圆

发表于 2018-12-6 11:53:26 | 显示全部楼层
不是LZ想像的每個指令只花14ns(72MhZ)執行, 還要考慮pipeline的reload. 通常一個load/store指令最少需要5 cycles或者更多. 這段code裏至少有4 load/store和2 branch, 所以這結果沒什奇怪的.

出0入0汤圆

发表于 2018-12-6 11:56:12 | 显示全部楼层
强迫症表示不可接受,需要使用DMA

出0入8汤圆

发表于 2018-12-6 11:58:19 | 显示全部楼层
prince2010 发表于 2018-12-6 10:00
平时基本不敢开优化,我刚试了以下(O3,Optimize for Time),直接跑不起来了。

不知道优化需要注意什 ...

代码一直都是最高优化 写的 和跑的。

出0入0汤圆

发表于 2018-12-6 12:01:19 | 显示全部楼层
prince2010 发表于 2018-12-6 10:00
平时基本不敢开优化,我刚试了以下(O3,Optimize for Time),直接跑不起来了。

不知道优化需要注意什 ...

开最高优化吧,这是程序员必须要过的一个坎

出10入12汤圆

发表于 2018-12-6 13:15:28 | 显示全部楼层
一直用10M的速度在跑 !! 没出现过异常

出0入90汤圆

发表于 2018-12-6 13:32:31 | 显示全部楼层
程序写的不好的时候,开了优化程序就不对。

出0入0汤圆

发表于 2018-12-6 13:35:10 | 显示全部楼层
要速度DMA啊,至少也用中断吧

出0入0汤圆

发表于 2018-12-6 17:12:05 | 显示全部楼层
kebaojun305 发表于 2018-12-6 11:58
代码一直都是最高优化 写的 和跑的。


我和你一样,平时都是开最高优化。。。好的代码是抗优化得。。。

出0入0汤圆

发表于 2018-12-6 17:22:09 | 显示全部楼层
使用DMA + SPI可以获取比较高的数据吞吐量

出0入0汤圆

 楼主| 发表于 2018-12-6 18:15:53 | 显示全部楼层
laoshuhunya 发表于 2018-12-6 12:01
开最高优化吧,这是程序员必须要过的一个坎

一般要注意些什么?

出0入0汤圆

发表于 2018-12-6 18:24:39 | 显示全部楼层
发送阶段等待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. }
复制代码

出0入0汤圆

发表于 2018-12-6 19:33:55 | 显示全部楼层
prince2010 发表于 2018-12-6 18:15
一般要注意些什么?

如果开启高优化后软件不能运行,大部分和“volatile”有关。
先把优化开到最高,有问题再一步步解决,可以参考下图来查找问题可能的原因:
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入12汤圆

发表于 2018-12-6 19:39:20 | 显示全部楼层
laoshuhunya 发表于 2018-12-6 19:33
如果开启高优化后软件不能运行,大部分和“volatile”有关。
先把优化开到最高,有问题再一步步解决,可 ...

赞一个

出105入79汤圆

发表于 2018-12-6 19:55:29 | 显示全部楼层
1us 都有1M的代码速率了,可以了。连续读取使用DMA。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 01:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表