完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大神们,最近在捣鼓 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; } |
|
相关推荐
12个回答
|
|
写入时间主要由flash芯片自身擦除写入时间决定,是瓶颈,读取自然是时钟越高越快,数据线位宽越大越好
|
|
|
|
楼上解释的非常到位啊。 |
|
|
|
理论上是这么回事,但是不知道我的 qspi 与 spi 在读写上差别并不这么明显,擦除时间假设他们是一样的 qspi 与 spi 的 写入函数都自带自带擦除功能的,所以这点他们应该基本上也是一样的 |
|
|
|
SPI FLASH设置最大频率进行,书写数据量就可以看出来效果了;
|
|
|
|
spi的时钟频率受 spi2 这个接口的频率限制,再设置高的也设置不了啊 |
|
|
|
|
|
|
|
dma 木有怎么用过啊,每次写入到spi的数据都是要重新读出来验证对不对的,使用dma也是需要等待的,所以就干脆不使用了, 当然如果写入的数据不用及时验证对不对的话,应该可以使用dma, |
|
|
|
我个人认为QSPI并不一定比SPI快,他们的最大区别不在于速度。QSPI用RAM代替了SPI中的BUF寄存器,可以一次发更多数据,在发送的过程中就可以减少CPU的参与。
|
|
|
|
楼主,你好,我用了你发的另外一篇的QSPI的源码,可是QSPI读取的速度达不到你这个计算的值,请问能看一下这篇的代码么,谢谢
|
|
|
|
你的 qspi 有没有进入 4字节模式啊 ? |
|
|
|
有啊,串口打印是QSPI_WORK_MODE是等于1的,而且时钟是明显不对的,每次读取500个字节的数据的话,时钟会出现8个连续的周期,然后时钟被拉低了,过了很久再出现8个连续的周期,这样就读取速度很慢了。 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:03 , Processed in 0.769116 second(s), Total 94, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号