各位大神们,最近在捣鼓 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; } |
评分
查看全部评分
楼上解释的非常到位啊。
理论上是这么回事,但是不知道我的 qspi 与 spi 在读写上差别并不这么明显,擦除时间假设他们是一样的
qspi 与 spi 的 写入函数都自带自带擦除功能的,所以这点他们应该基本上也是一样的
评分
查看全部评分
spi的时钟频率受 spi2 这个接口的频率限制,再设置高的也设置不了啊
那只能说,受MCU自身限制了;
有些功能,可以使用DMA进行,速度还是可以的;
评分
查看全部评分
dma 木有怎么用过啊,每次写入到spi的数据都是要重新读出来验证对不对的,使用dma也是需要等待的,所以就干脆不使用了,
当然如果写入的数据不用及时验证对不对的话,应该可以使用dma,
你的 qspi 有没有进入 4字节模式啊 ?
有啊,串口打印是QSPI_WORK_MODE是等于1的,而且时钟是明显不对的,每次读取500个字节的数据的话,时钟会出现8个连续的周期,然后时钟被拉低了,过了很久再出现8个连续的周期,这样就读取速度很慢了。