|
|
硬汉哥,可以请教一下这个问题嘛?就是QSPI翻页写的时候中间有大概2ms的空挡期间。写满4K要用50ms左右主要翻页写的时候浪费了。图片中间的是读状态寄存器的指令,两边的都是写入的数据。这个问题要这么排查呢?用的主控是HPM6E80,下面是关键代码。主要目的是想把这个2ms去掉,做到手册的典型值0.7ms左右。开了DMA,测试时钟clk为8M到20M都有这么个固定是时间,感觉像卡住了一样。
static uint8_t qspi_program_pages(const uint8_t *buf, uint32_t addr, uint32_t size)
{
uint32_t current_addr = addr;
uint32_t remaining = size;
const uint8_t *current_buf = buf;
while (remaining > 0U) {
uint32_t page_offset = current_addr % W25Q128FV_PAGE_SIZE;
uint32_t chunk = W25Q128FV_PAGE_SIZE - page_offset;
if (chunk > remaining) {
chunk = remaining;
}
if (qspi_write_enable() != FLASH_OK) {
return FLASH_ERROR;
}
if (qspi_transfer_dma(spi_trans_write_only,
QUAD_INPUT_PAGE_PROG_CMD,
true,
current_addr,
spi_quad_io_mode,
current_buf,
chunk,
NULL,
0U,
0U) != FLASH_OK) {
return FLASH_ERROR;
}
if (qspi_wait_ready_poll(W25Q_READY_POLL_RETRY) != FLASH_OK) {
return FLASH_BUSY;
}
current_addr += chunk;
current_buf += chunk;
remaining -= chunk;
}
return FLASH_OK;
}
static uint8_t qspi_wait_ready_poll(uint32_t retry)
{
while (retry-- > 0U) {
if ((qspi_read_status1() & W25Q128FV_FSR_BUSY) == 0U) {
return FLASH_OK;
}
}
return FLASH_BUSY;
}
|
|