打印
[STM32F1]

香主求解 : F103使用SPI发送接收数据,每个字节间延时很大

[复制链接]
7476|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smartpower|  楼主 | 2015-11-23 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
spi, AN, ce, TI, ST
本帖最后由 smartpower 于 2015-11-25 11:23 编辑

各位高手,小弟使用SPI遇到点小问题,烦请大家赐教。

使用SPI接口进发送接收时,每个字节间有延时,如下图所示:

使用的函数为HAL_SPI_TransmitReceive,已确认延时来自下面这句话
          if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK)
          {
            return HAL_TIMEOUT;
          }

我的问题是:
1. 为什么会有延时,8个sck后数据应该就已收到,为什么SPI_FLAG_RXNE标志要延时约1us才能置起?
2. 将程序改为查到发送为空就发数据,查到有数据到达就收数据则发现收到的数据不对。
    (已确认在这种情况下的MISO的波形是对的)
   修改后的核心代码如下:
//注: TxCnt = RxCnt = 3
while ( TxCnt>0 && RxCnt>0 )
{
    if ( (hspi->Instance->SR & SPI_FLAG_TXE ) != RESET )  //发送寄存器为空
    {
        if( TxCnt > 0 )   //数据还没有发送完成
        {
            hspi->Instance->DR = *pTxData++;
            TxCnt--
        }
    }
    if ( (hspi->Instance->SR & SPI_FLAG_RXNE) != RESET )
    {
        if( RxCnt > 0)
        {
            *pRxData++ = hspi->Instance->DR;
            RxCnt--;
        }
    }
}




沙发
huangcunxiake| | 2015-11-23 15:21 | 只看该作者
完成一个发送后,就是一个周期,要进行代码地址跳转返回,所以,就是那个波形了。

使用特权

评论回复
板凳
smartpower|  楼主 | 2015-11-23 22:23 | 只看该作者
回楼上,我用avr/ht时间隔看不到的!ST间隔太明显,故有此问。

使用特权

评论回复
地板
gejigeji521| | 2015-11-23 22:38 | 只看该作者
那个是实时的波特图吗?是都这么脉冲严重?我以前以为是整齐的方波呢。

使用特权

评论回复
5
smartpower|  楼主 | 2015-11-24 18:54 | 只看该作者
香主,求解。

使用特权

评论回复
6
捉虫天师| | 2015-11-24 20:42 | 只看该作者
为何会有这样的时间间隔呢?这个硬件电路的问题?换个ST的其他芯片的板子试试。

使用特权

评论回复
7
smartpower|  楼主 | 2015-11-25 11:21 | 只看该作者
香主,求解。
请问这是硬件的问题吗?
之前用其它家的MCU时没有出现这样的问题。

使用特权

评论回复
8
smartpower|  楼主 | 2015-11-25 19:11 | 只看该作者
没有人知道吗?

使用特权

评论回复
9
smartpower|  楼主 | 2015-11-26 14:03 | 只看该作者
不要沉了。

使用特权

评论回复
10
zjh2009| | 2015-11-26 20:23 | 只看该作者
TxCnt--后少个;号。应该是手误。

我看你到吗是对寄存器的直接操作,应该没什么问题。现在就想知道逆选择的SPI的波特率有多大?

使用特权

评论回复
11
hwl1023| | 2015-11-27 07:48 | 只看该作者
之前写SD卡时测试过这个,ST的硬件SPI的确是间隔很大,对此atmel的片子比ST的小很多!

使用特权

评论回复
12
zchong| | 2015-11-27 08:44 | 只看该作者
看程序,判断较多,应该可以进一步优化。
可以通过汇编代码评估一下时间,如果波特率较高,是有可能出现楼主位的情况。
另外可以写一段测试代码,通过判断TXE,直接发送一组数据,不做其它事,看看是否依然是这种情况。

使用特权

评论回复
13
//YZC| | 2015-11-27 10:09 | 只看该作者
这个很正常,跟芯片厂商的设计有关,我用老款omap芯片的sdio时,那间隔让我想撞墙

使用特权

评论回复
14
desertsailor| | 2015-11-27 17:34 | 只看该作者
调用库函数本身就要费一些时间,你改为直接查询寄存器试试。

使用特权

评论回复
15
smartpower|  楼主 | 2015-11-28 19:28 | 只看该作者
按11楼和13楼两位仁兄的说法, 那应该就是硬件的实现方法问题了。
回12楼 , 这个判断只需要一点点时间,远小于1us.
哎 , 这个IP设计得不好~~:L:L:L:L

使用特权

评论回复
16
smartpower|  楼主 | 2015-11-28 19:31 | 只看该作者
@香水城 给出结论以便结贴。

使用特权

评论回复
17
yutianxiang618| | 2015-11-29 11:03 | 只看该作者
我这都这样

使用特权

评论回复
18
cornrn| | 2016-1-25 16:39 | 只看该作者
同问

使用特权

评论回复
19
cornrn| | 2016-1-25 16:39 | 只看该作者
smartpower 发表于 2015-11-28 19:28
按11楼和13楼两位仁兄的说法, 那应该就是硬件的实现方法问题了。
回12楼 , 这个判断只需要一点点时间,远 ...

难道真是ST的IP设计有问题?!!!:funk:

使用特权

评论回复
20
xmshao| | 2016-1-25 17:00 | 只看该作者
楼主你直接查寄存器也有这么大的间隔吗? 不要调用函数,函数进出栈需要时间的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

442

帖子

11

粉丝