- 打卡等级:以坛为家II
- 打卡总天数:493
- 最近打卡:2025-05-01 08:31:58
荣誉版主
- 积分
- 3476
|
发表于 2025-2-24 10:21:14
|
显示全部楼层
感谢您的回复留言.
经过反复修改试验排查, 逐渐缩小包围圈,才发现原来意想不到的症结所在.
基本可以归纳, 试解释一下:
本实验主要是体现QSPI+DMA+P2P+LCM+TFT高速显示全屏图片,实现视频级动画效果,
程序代码逻辑都是没有问题的.
首先, 注意程序的开始, 执行了
W25Q_Enable_QE(); //使能QSPI FLASH的4线读写模式
这是让外部Flash存储器W25Q128从普通SPI模式进入QSPI工作模式.
此时, W25Q128的状态寄存器2的QE位为1.
当QSPI+DMA初始化参数到位,一旦执行启动传输:
DMA_QSPI_CR = 0xA1; //启动DMA并触发QSPI读操作
就会造成W25Q128的状态寄存器2的QE位为0.
根据资料表明, 当QE=0时,已经脱离了QSPI模式(但并非回到真正的普通SPI模式).
此后再执行有关QSPI模式的读写指令,就会出现异常(读写地址不对).
表现为: 只要浏览了图片, 就无法正常执行Flash编程操作.
同样, 只要执行了Flash编程某些(是某些)操作, 也会导致W25Q128的状态寄存器2的QE位为0.
此后, 就无法正常浏览图片了.
那么, 如果知道了QE=0的问题所在, 能否再次执行W25Q_Enable_QE()函数让其QE=1呢?
实验表明是不行的.
因为, W25Q_Enable_QE()是让W25Q128从普通SPI模式进入QSPI工作模式.
而此时,虽然QE=0,但并非回到真正的普通SPI模式. 简单调用W25Q_Enable_QE()是不行的.
重新上电启动可使W25Q128回到普通SPI模式, 可以回避这个问题. 当然这是我们不希望的.
幸好, 有直接写QSPI设备(W25Q128)状态寄存器2的函数.
W25Q_WriteSR2_31(0x02);
写入0x02就是使QE=1, 让其保持在QSPI的工作模式. 而后的实验就正常了.
注意写入0x02的时机. 在没有回到正常的QSPI模式之前, 不要执行其它有关QSPI的指令.
所以, 本实验中,在回到主菜单界面之前, 都加入了写0x02的操作.
另外, 本实验中,在[系统维护]中加入了读取W25Q128状态寄存器的操作函数.
可随时执行一下, 如果显示为:
SR: 00 02 60
就是正常的. 这是展现了W25Q128当时的三个状态寄存器的字节值.
|
|