硬汉嵌入式论坛

 找回密码
 立即注册
查看: 300|回复: 5
收起左侧

[SPI/QSPI] QSPI速率问题

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2026-4-23 09:48:22 | 显示全部楼层 |阅读模式
硬汉哥,可以请教一下这个问题嘛?就是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;
}



回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2026-4-23 09:51:00 | 显示全部楼层
逻辑分析仪的图片,图片中间的是读状态寄存器的指令,两边的都是写入的数据
11111.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122500
QQ
发表于 2026-4-23 11:26:31 | 显示全部楼层
楼主说的是这个参数吗

典型值0.7 最大值3m,你测试的2m还行,这个参数可以提升SPI速度来降低,搞个100M试试


下载.png

回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2026-4-23 11:31:07 | 显示全部楼层
eric2013 发表于 2026-4-23 11:26
楼主说的是这个参数吗

就是现在的qspi写的速度太慢了,写4k要50ms左右。然后发现每次写完一个页后不知道为什么有1ms左右的空的,主要是这里把时间给浪费掉了。DMA什么也都开了不知道怎么排查了:',感觉像堵塞一样,时钟频率开大些,也是1ms左右的空隔
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2026-4-23 12:51:25 | 显示全部楼层
谢谢硬汉哥啦,找到问题了是HPM那里FIFO的问题,把FIFO给开到了最大。时钟为8M,写入4K用时10ms左右。贴出来参考的地方:https://mp.weixin.qq.com/s/Bvt0hkheNfQL2S6wC3j_9Q
希望后面坛友遇到可以直接跳坑。
2222.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122500
QQ
发表于 2026-4-24 08:08:26 | 显示全部楼层
xuzhongyu 发表于 2026-4-23 12:51
谢谢硬汉哥啦,找到问题了是HPM那里FIFO的问题,把FIFO给开到了最大。时钟为8M,写入4K用时10ms左右。贴出 ...

谢谢告知最终原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-5-13 00:50 , Processed in 0.620117 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表