- 打卡等级:以坛为家III
 
				- 打卡总天数:661
 
				
				
				- 最近打卡:2025-11-04 07:56:51
 
				  
  
荣誉版主 
 
	- 积分
 - 4485
 
 
 
 
 | 
 
 
发表于 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当时的三个状态寄存器的字节值.  
 |   
 
 
 
 |