找回密码
 立即注册
楼主: 浦江一水

基于AI8051U_V1.2实验箱_学习实验之驱动TFT彩屏显示全屏图片(QSPI_DMA_P2P)(已优化)

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-2-5 21:10:10 | 显示全部楼层
电子*** 发表于 2025-2-5 16:52
楼主这个问题有解决吗?  
   目前我这边只要使用QSPI-DMA-TFT刷屏后,连25q128里面的字库都读不出 ...

很抱歉,由于近来一直在忙于其他非51单片机的项目,还没有时间来研究这本实验中存在的问题。
根据官方的72-4例程看,显示图像与刷新外部存储器,是分开进行的, 也就是说必须重新启动,两者选一, 即没有实现在运行中(不重启)随意切换。
本实验的初衷本意是想有所突破,但是没有完全成功。
主要是对于AI8051U的QSPI+DMA+CDC串口通讯等方面的机理以及相关寄存器的功能运用还没完全吃透。也希望对此感兴趣的你,和其他坛友也能谈谈对此问题的学习心得与对策。  
目前只能先这样: 需要刷外部存储器的时候,重新启动一下。需要显示图像动画时,再重新启动一下。
这仅仅是一个实验的体验,不是用于实际项目中的。
其实,本实验还存在另外一个问题,官方的72-4例程也是同样的。
那就是: 实验箱不是用一个USB通讯线连接电脑USB口,而是离开电脑单独供电,那程序就走不下去了。(因为实际产品项目不可能让用户必须连接电脑USB通讯口才能工作)
这就是牵涉的CDC串口通讯的初始化,不是一个简单的问题了,是否允许在运行中(不重启)切换USB-CDC的使用与不使用。这个问题也有待思考和学习。虽说USB-CDC就是普通串口通讯,其实还是有所不同的。
如果说,在实际产品项目中就必须要这样通过菜单选择,在不重启的情况下,既能刷新外部存储器中的数据,又能实现图像显示以及其他数据处理的话。那么,我是采用传统成熟的方案来实现的。而这些处理技术,其实在我的各帖子中,已有所体现,并没有什么新意。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-2-12 21:58:09 | 显示全部楼层
对于本实验存在的问题,今日抽空,仔细实验学习研究了一下,似乎是找到了症结所在,但是尚无很好的对策。
学习过程在此与各位有兴趣的坛友聊聊...


首先说说本实验问题的现象:
若上电启动后, 直接浏览图片或动画,没有问题。
    如果此时,切换到刷新图片,即与Flash编辑器(USB-ISP中的工具)对话操作,会出现异常,读回数据,比如ID或状态字等等不正常。
若上电启动后, 直接进入刷新图片,即与Flash编辑器对话操作,没有问题。
    如果此时,切换到浏览图片或动画, 不能正常显示,甚至死机不动了。


那么, 目前这个实验只能这样使用: 或者浏览图片,或者刷新图片,两者必选其一,通过上电重启切换。官方72-4例程就是这样的。
虽然能够体验到AI8051U+QSPI+DMA+LCM+P2P的显示效果, 但是总是感到不算是太成功,留下了遗憾。

经过反复看阅资料分析和实验排查,逐渐发现规律。发现是有时是可以实现不断电切换的,只是需要符合一个条件。
那就是:用上位机Flash编辑器,反复多次发送读取状态寄存器的命令,观察其返回的字符信息。
如果返回的状态寄存器信息是: 000260,
这是什么意思? W25Q128有三个状态寄存器,状态寄存器1=00, 状态寄存器2=02,状态寄存器3=60,
如果是这样就可以了。这样退出Flash编辑器,再返回浏览图片和动画,也就是正常的。
这说明什么呢? 说明W25Q128的寄存器2中的QE位只要为1即可。

根据资料说明, QE=1 是QSPI模式, QE=0 是SPI模式。
本实验就是在QSPI模式实验的,有多种原因,会导致寄存器2中的QE从1变为0,
如果QE=0, 那么后继的有关QSPI操作指令,都会不正常了。
本实验程序的现在情况是:
上电后,直接浏览图片后,QE就会从1变为0, 再切入Flash就不正常(Flash编辑器需要QSPI工作模式)。
上电后,直接操作Flash编辑,QE也会从1变为0,再切入浏览图也就不正常了(浏览需要QSPI工作模式)。
那么, 能不能加入指令,强制让QE=1呢? 不是可解决问题了吗?
不料,这不是一件简单的事了。
看W25Q128的资料图示:
QE位写入时序.JPG

从此图中的英文说明(红线画出部分)可以看出:
改写状态寄存器可以在两种模式下进行,
然而,当处于QSPI模式时,QE位不能被写入,因为设备进入和操作在QSPI模式下需要QE=1。

也就是说,虽然处于QSPI模式,但是QE=0,是不能操作改写状态寄存器的。
换言之,当QE=0时,是无法用指令实现从QSPI模式切换到普通SPI模式的。
上面是普通SPI模式下的写入时序,是单线指令单线数据指令时序,因为不能返回普通SPI模式而无法执行。
下面是QSPI模式下的写入时序,是四线指令四线数据指令时序,因为QE=0而无法执行。

于是形成了死结。。。
思考良久后,发现有一个非常简单方便而简单的方法: 上电重启。
猛然醒悟:这不是重复了官方例程的实验吗?毫无进展和突破。
。。。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-2-12 21:59:39 | 显示全部楼层
QSPI模式,命令序列有五个阶段。
截图202502122208485713.jpg

每个阶段又有单线、双线、四线模式之分,各阶段又可能有、可能无,交替,复用,空字节周期,新概念不少,
由此这般,排列与组合,能变化出多种形态,使得指令系统变得不是一般的复杂,令新手眼花缭乱,望而生畏。
还有待继续学习。。。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-2-20 15:47:23 | 显示全部楼层
电子*** 发表于 2025-1-7 12:35
楼主,你好。 感谢你提供的资料。
  我现在用你提供的例程运行了一下,发现了一个问题。 只要当浏览一次图 ...

已优化, 可再试试看...
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-2-20 15:48:15 | 显示全部楼层
电子*** 发表于 2025-2-5 16:52
楼主这个问题有解决吗?  
   目前我这边只要使用QSPI-DMA-TFT刷屏后,连25q128里面的字库都读不出 ...

已优化, 可再试试看...
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-03-14 18:28:41

2

主题

22

回帖

306

积分

中级会员

积分
306
发表于 2025-2-23 16:47:48 | 显示全部楼层
浦江*** 发表于 2025-2-20 15:47
已优化, 可再试试看...

         确实可以了,感谢楼主提供的资料。可以看得出来楼主下来是查了很多资料,发现了这个问题。非常感谢。
   
          看了一下代码,在执行完成刷新图片或者flash CDC后,都进行了W25Q_WriteSR2_31(0x02);  。目的是对寄存器2进行写2操作。 其主要是代表什么意思呢?不管怎么样,之前的bug好像是解决了, 下来我在研究一下。 再次感谢楼主的热心分享!

点评

感谢您的回复留言. 经过反复修改试验排查, 逐渐缩小包围圈,才发现原来意想不到的症结所在. 基本可以归纳, 试解释一下: 本实验主要是体现QSPI+DMA+P2P+LCM+TFT高速显示全屏图片,实现视频级动画效果, 程序代码逻辑都  详情 回复 发表于 2025-2-24 10:21
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-2-24 10:21:14 | 显示全部楼层
电子*** 发表于 2025-2-23 16:47
确实可以了,感谢楼主提供的资料。可以看得出来楼主下来是查了很多资料,发现了这个问题。非常 ...

感谢您的回复留言.

经过反复修改试验排查, 逐渐缩小包围圈,才发现原来意想不到的症结所在.
基本可以归纳, 试解释一下:
本实验主要是体现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当时的三个状态寄存器的字节值.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-03-14 18:28:41

2

主题

22

回帖

306

积分

中级会员

积分
306
发表于 2025-3-3 17:25:15 | 显示全部楼层
浦江*** 发表于 2025-2-24 10:21
感谢您的回复留言.

经过反复修改试验排查, 逐渐缩小包围圈,才发现原来意想不到的症结所在.

但是这样有点前后矛盾了,前面说QE=0已经退出了QPIS模式,但是后面W25Q_WriteSR2_31(0x02);  使其置1. 我打开函数看了,void W25Q_WriteSR2_31(BYTE dat)
{ QSPI_WRITE_INSTR_SADDR8(0x31, dat); W25Q_WaitBusy(100);}这个函数里面依然是采用的QSPI发送,如果已经成功退出了QSPI模式,那么这条指令他是无法成功发送的。

不知道为什么,反正你那个例程我试了试可以的。 但是移植到我的项目中目前还是无法正常运行。也试过读取那3个寄存器的值,虽然我的也显示00 02 60。但是依然存在问题。

点评

这个问题确实比较微妙... 对于本实验来说是没有问题了.但是... 说移植到你的项目中还不行, 可能还存在我们尚未发现的因素了. 这就要根据具体情况再来分析和寻找原因了. 此前也已感觉到: "当QE=0时,已经脱离了QSPI  详情 回复 发表于 2025-3-3 21:46
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-05-01 08:31:58

30

主题

347

回帖

3476

积分

荣誉版主

积分
3476
发表于 2025-3-3 21:46:04 | 显示全部楼层
电子*** 发表于 2025-3-3 17:25
但是这样有点前后矛盾了,前面说QE=0已经退出了QPIS模式,但是后面W25Q_WriteSR2_31(0x02);  使其置1. 我 ...

这个问题确实比较微妙...

对于本实验来说是没有问题了.但是...
说移植到你的项目中还不行, 可能还存在我们尚未发现的因素了.
这就要根据具体情况再来分析和寻找原因了.

此前也已感觉到: "当QE=0时,已经脱离了QSPI模式(但并非回到真正的普通SPI模式)."
这就是说, 没有完全脱离QSPI模式, 有的QSPI指令还能执行,有的就是不行了.
用W25Q_WriteSR2_31(0x02)可改写QE=1.
但为什么调用W25Q_Enable_QE()就不行呢?
其中不是也有W25Q_WriteSR2_31(0x02)吗?
这就让人感到可能还有一个执行时机的因素了.
根据目前的资料和例程还不能完全得出解释, 还有待于继续摸索吧...

日前我已将本实验改写成QSPI_DMA_P2P_UART模式(不是CDC模式), 浏览与刷图,切换也是可以的.
这样更符合应用于实际项目中...
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-03-14 18:28:41

2

主题

22

回帖

306

积分

中级会员

积分
306
发表于 2025-3-3 22:16:19 | 显示全部楼层
浦江*** 发表于 2025-3-3 21:46
这个问题确实比较微妙...

对于本实验来说是没有问题了.但是...

           QSPI_DMA_P2P_UART模式(不是CDC模式)的例程可以分享一下吗,我刚下载的本帖的链接资料,里面还是CDC模式的。

点评

本帖的链接并没有改变, 还是原来CDC模式的. 如果对UART方式有兴趣,可以的, 稍后可在本贴此后下载. 现在需要整理一下, 还要补充一些说明.... 稍等....  详情 回复 发表于 2025-3-4 09:02
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:59 , Processed in 0.150366 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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