版主好!
我使用的D213EC,用户手册上看到QSPI速度可以达到100MHz,通过例程实验时钟能接近100MHz,很好!可是我现在使用QSPI发送大量数据到外部的设备。CPU就被严重占用,虽然我现在已经使用DMA发送数据,但是CPU还是不能释放。查看qspi_master_transfer_dma_sync函数中的qspi_master_wait_dma_done函数才发现,cpu在这里时死循环,一直等到传输结束才能释放CPU。请问这个是为什么呢?我想尝试修改驱动,需要注意什么呢?
另外一个问题:在发送数据时QSPI总线输出的同步时钟,在发送多个字节(32或者64个)后时钟会有一段高电平的时间,猜测是等待fifo中的数据就绪。看手册fifo读写过半会有中断或者标志产生,为什么实际情况是每次都要fifo读空时,CPU或者是DMA才会给fifo补充数据呢?这个是因为对于外设获取DDR3内部数据时,芯片也有设优先级吗?重点是给cpu、显示模块、2D加速器使用的吗?
最近编辑记录 LB_YJY (2025-04-18 19:23:37)
离线
1、因为当前demo板上QSPI的主要应用场景还是读写Flash,考虑到对存储性能的要求QSPI每笔都是占用CPU轮询等待QSPI传输完成,如果想使用异步加中断回调的方式可以参考drv层的drv_qspi.c 中 spi_nonblock_set() 函数配置发送时使用异步方式,发送后上层可以通过spi_get_transfer_status()主动查询状态也可以在完成回调中处理;
需要注意的是,该方法仅实现了发送方向的异步,接收方向可以参考发送函数使用hal_xxx_async替换hal_xxx_sync;
如果对QSPI比较熟悉的话也可以直接调用hal 层接口
2、QSPI等待是因为DMA搬运速度不够快,d21多master使用dma情况下有风险,当前dma参数用的是最低的;其他IC没有这个问题
如果确保没有其他master在用dma,也可以修改hal_dma_reg_v1x.h下的DMA_SLAVE_DEF(xx_QSPI_xx), 参考其他版本的参数
离线
非常感谢!谢谢你解答了我的疑惑!:)
离线
@五花肉
专业!
离线