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

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读取的速度达不到你这个计算的值,请问能看一下这篇的代码么,谢谢
12下一页

所属标签

相似问题

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