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

QSPI PK SPI 读写速度 ??

[复制链接]
hpdell 提问时间:2016-11-13 17:50 /
悬赏2ST金币未解决
各位大神们,最近在捣鼓 QSPI 的读写

发现 QSPI 的读写速度 比 SPI 的读写速度 貌似差不多,

同样都是读写 8192*2个字节的数据

SPI Write 8192 * 2  End   ... ... 514ms
SPI Read  8192 * 2  End   ... ... 10ms
SPI Data Read Write Auto Erase Sector OK ..  SWS  


QSPI Write 8192 * 2  End   ... ... 523ms
QSPI Read  8192 * 2  End   ... ... 4ms
QSPI Data Read Write Auto Erase Sector OK ... DD

在读取上要稍微快点,但是我的 SPI 的时钟 也只有 27MHz, 如果提高 SPI 的时钟频率,那么有可能 这个 SPI 的读写速度还会超过 QSPI 的吧,

spi 的芯片:w25q128fvsg
qspi芯片: w25q256fvfg         

大神们看看 是什么歌情况 ???

spi的读取函数
_SPI_FLASH_TATUS_T SPI_FlashReadBuffer(uint8_t * _pBuf, uint32_t _uiReadAddr, uint32_t _uiSize)
{        
        /* 如果读取的数据长度为0或者超出串行Flash地址空间,则直接返回 */
        if ((_uiReadAddr + _uiSize) > g_tFlash.TotalSize)
        {
                return SPI_FLASH_OUT_SIZE;
        }  

        if (_uiSize == 0)
        {
                return SPI_FLASH_OUT_SIZE;
        }   
        SPI_FLASH_CS_L;        


#if  1
  // 芯片 W25Q256, 512 是 32bit地址
  if(g_tFlash.ChipID >= JEDEC_W25Q256FVSG_ID)                //如果是W25Q256的话地址为4字节的,要发送最高8位
  {
    uint8_t TxAddr[5] ;

    TxAddr[0] = W25Q_ReadData;
    TxAddr[1] = (uint8_t)((_uiReadAddr)>>24);
    TxAddr[2] = (uint8_t)((_uiReadAddr)>>16);
    TxAddr[3] = (uint8_t)((_uiReadAddr)>>8);
    TxAddr[4] = (uint8_t)((_uiReadAddr)>>0);

    HAL_SPI_Transmit(&hspi2, &TxAddr[0], 5, 0x1fff);
  }

  else
  {
    uint8_t TxAddr[5] ;

    TxAddr[0] = W25Q_ReadData;
    TxAddr[1] = (uint8_t)((_uiReadAddr)>>16);
    TxAddr[2] = (uint8_t)((_uiReadAddr)>>8);
    TxAddr[3] = (uint8_t)((_uiReadAddr)>>0);

    HAL_SPI_Transmit(&hspi2, &TxAddr[0], 4, 0x1fff);  
  }


  HAL_SPI_Receive( &hspi2, (uint8_t *)_pBuf, _uiSize, 0x3fffff);    // 采用此方法接收数据速度至少快4倍或以上

#else

  SPI_ReadWriteByte(W25Q_ReadData);

  // 芯片 W25Q256, 512 是 32bit地址
  if(g_tFlash.ChipID >= JEDEC_W25Q256FVSG_ID)                //如果是W25Q256的话地址为4字节的,要发送最高8位
  {
    SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>24));
  }

  SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>16));    // 发送 24 bit 地址
  SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>8));
  SPI_ReadWriteByte((uint8_t)((_uiReadAddr)>>0));

  /*   这段读取速度太慢了,所以屏蔽了
  while (_uiSize--)
  {
    *_pBuf++ = SPI_ReadWriteByte(0XFF);    // 读一个字节并存储到pBuf,读完后指针自加1
  }
  */

  HAL_SPI_Receive( &hspi2, (uint8_t *)_pBuf, _uiSize, 0x3fffff);    // 采用此方法接收数据速度至少快4倍或以上
#endif
        SPI_FLASH_CS_H;

  return SPI_FLASH_OK;
}

收藏 4 评论12 发布时间:2016-11-13 17:50

举报

12个回答
peter001 回答时间:2016-11-14 00:46:39
写入时间主要由flash芯片自身擦除写入时间决定,是瓶颈,读取自然是时钟越高越快,数据线位宽越大越好

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

高二毛 回答时间:2016-11-14 08:45:58
peter001 发表于 2016-11-14 00:46
写入时间主要由flash芯片自身擦除写入时间决定,是瓶颈,读取自然是时钟越高越快,数据线位宽越大越好 ...

楼上解释的非常到位啊。
hpdell 回答时间:2016-11-14 09:24:18
peter001 发表于 2016-11-14 00:46
写入时间主要由flash芯片自身擦除写入时间决定,是瓶颈,读取自然是时钟越高越快,数据线位宽越大越好 ...

理论上是这么回事,但是不知道我的 qspi 与 spi 在读写上差别并不这么明显,擦除时间假设他们是一样的

qspi 与 spi  的 写入函数都自带自带擦除功能的,所以这点他们应该基本上也是一样的
xhzheng 回答时间:2016-11-14 09:43:51
SPI FLASH设置最大频率进行,书写数据量就可以看出来效果了;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2016-11-14 16:42:03
xhzheng 发表于 2016-11-14 09:43
SPI FLASH设置最大频率进行,书写数据量就可以看出来效果了;

spi的时钟频率受 spi2 这个接口的频率限制,再设置高的也设置不了啊
xhzheng 回答时间:2016-11-15 08:12:49
hpdell 发表于 2016-11-14 16:42
spi的时钟频率受 spi2 这个接口的频率限制,再设置高的也设置不了啊

那只能说,受MCU自身限制了;
有些功能,可以使用DMA进行,速度还是可以的;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2016-11-15 09:45:11
xhzheng 发表于 2016-11-15 08:12
那只能说,受MCU自身限制了;
有些功能,可以使用DMA进行,速度还是可以的; ...

dma 木有怎么用过啊,每次写入到spi的数据都是要重新读出来验证对不对的,使用dma也是需要等待的,所以就干脆不使用了,

当然如果写入的数据不用及时验证对不对的话,应该可以使用dma,
阿峰-2003139 回答时间:2017-8-31 08:35:19
我个人认为QSPI并不一定比SPI快,他们的最大区别不在于速度。QSPI用RAM代替了SPI中的BUF寄存器,可以一次发更多数据,在发送的过程中就可以减少CPU的参与。
永夜衣袂 回答时间:2018-5-24 16:44:37
楼主,你好,我用了你发的另外一篇的QSPI的源码,可是QSPI读取的速度达不到你这个计算的值,请问能看一下这篇的代码么,谢谢
hpdell 回答时间:2018-5-24 22:31:10
永夜衣袂 发表于 2018-5-24 16:44
楼主,你好,我用了你发的另外一篇的QSPI的源码,可是QSPI读取的速度达不到你这个计算的值,请问能看一下这 ...

你的 qspi 有没有进入 4字节模式啊 ?
永夜衣袂 回答时间:2018-5-25 09:50:14
hpdell 发表于 2018-5-24 22:31
你的 qspi 有没有进入 4字节模式啊 ?

有啊,串口打印是QSPI_WORK_MODE是等于1的,而且时钟是明显不对的,每次读取500个字节的数据的话,时钟会出现8个连续的周期,然后时钟被拉低了,过了很久再出现8个连续的周期,这样就读取速度很慢了。
永夜衣袂 回答时间:2018-5-25 09:52:49
C:\Users\ileevio\Desktop\QSPI_Clock.jpg
QSPI_Clock.jpg

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版