|
发表于 2019-4-20 11:21:48
|
显示全部楼层
你好,我的 qspi 芯片,使用 1线模式,中断方式,貌似读取速度可以到达 GB 级别啊,有些不敢想啊
这几个模式都是采用 1线模式读写,即
1位指令
1位地址
1位数据
读写数据总大小 16MB
一、使用 SPI 中断模式
QSPI_EraseSector: EraseSector Time: 91282ms
QSPI Write Flash OK
Data Len: 16777216Byte, Write Time: 17755ms, Write Speed: 944KB/s
Data Len: 16777216Byte, Read Time: 1ms, Read Speed: 16777216 KB/s
QSPI RW OK !
二、中断 + dma
QSPI_EraseSector: EraseSector Time: 93500ms
QSPI Write Flash OK
Data Len: 16777216Byte, Write Time: 17757ms, Write Speed: 944KB/s
Data Len: 16777216Byte, Read Time: 1343ms, Read Speed: 12492 KB/s
QSPI RW OK !
三、 使用 SPI 查询模式
QSPI_EraseSector: EraseSector Time: 89542ms
QSPI Write Flash OK
Data Len: 16777216Byte, Write Time: 18616ms, Write Speed: 901KB/s
Data Len: 16777216Byte, Read Time: 2688ms, Read Speed: 6241 KB/s
QSPI RW OK !
四 读写测试函数
#include "malloc_conf.h"
#define QSPI_RW_TEST_SIZE 1024*1024*16
void QSPI_ReadWriteDemo(void)
{
uint32_t i, EarseCnt =0;
uint32_t iTime1, iTime2;
uint32_t uiAddrBase = 8531; //起始扇区地址,
uint8_t j =0;
uint8_t * QSPI_tx_buff = (uint8_t *)mymalloc(SDRAMEX, QSPI_RW_TEST_SIZE );
uint8_t * QSPI_rx_buff = (uint8_t *)mymalloc(SDRAMEX, QSPI_RW_TEST_SIZE );
EarseCnt = QSPI_RW_TEST_SIZE / 4096;
if((QSPI_RW_TEST_SIZE % 4096) != 0)
EarseCnt += 1;
/* 填充测试缓冲区 */
for (i = 0; i < QSPI_RW_TEST_SIZE; i++)
{
QSPI_tx_buff[i] = j++;
}
iTime1 = bsp_GetRunTime(); /* 记下开始时间 */
for(i=0; i<EarseCnt; i++)
{
QSPI_EraseSector(uiAddrBase + i); //擦除第一个 4096byte 扇区
}
iTime2 = bsp_GetRunTime(); /* 记下结束时间 */
QSPI_Printf("QSPI_EraseSector: EraseSector Time: %dms\r\n", (iTime2 - iTime1));
iTime1 = bsp_GetRunTime(); /* 记下开始时间 */
QSPI_WriteBuff(QSPI_tx_buff, uiAddrBase*4096, QSPI_RW_TEST_SIZE);
iTime2 = bsp_GetRunTime(); /* 记下结束时间 */
QSPI_Printf("QSPI Write Flash OK \r\n");
/* 打印读速度 */
QSPI_Printf("Data Len: %dByte, Write Time: %dms, Write Speed: %dKB/s\r\n", QSPI_RW_TEST_SIZE, iTime2 - iTime1, (uint32_t)(QSPI_RW_TEST_SIZE) / ((iTime2 - iTime1)));
// ------------------------------------------------------------------------------------
for (i = 0; i < QSPI_RW_TEST_SIZE; i++)
{
QSPI_rx_buff[i] = 0; //数据清 0
}
iTime1 = bsp_GetRunTime(); /* 记下开始时间 */
QSPI_ReadBuff(QSPI_rx_buff, uiAddrBase*4096, QSPI_RW_TEST_SIZE);
iTime2 = bsp_GetRunTime(); /* 记下结束时间 */
/* 打印读速度 */
QSPI_Printf("Data Len: %dByte, Read Time: %dms, Read Speed: %d KB/s\r\n", QSPI_RW_TEST_SIZE, iTime2 - iTime1, (uint32_t)(QSPI_RW_TEST_SIZE) / ((iTime2 - iTime1)));
if(Buffercmp_8(QSPI_rx_buff, QSPI_tx_buff, QSPI_RW_TEST_SIZE) == 0)
{
QSPI_Printf("QSPI RW OK !\r\n");
}
else
QSPI_Printf("QSPI RW Error ?\r\n");
}
|
|