找回密码
 立即注册
查看: 289|回复: 12

QSPI-Flash ==> DMA-P2P ==> TFT彩屏 / i8080-8位并口 只能启动一次

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-27 00:25:01
已绑定手机

2

主题

7

回帖

79

积分

注册会员

积分
79
发表于 2025-5-15 23:14:18 | 显示全部楼层 |阅读模式
现象就是  使用QSPI的DMA-P2P将数据读出到LCM就不行。第一次可有读出数据。

lcm_dam (2).zip

749 KB, 下载次数: 4

回复

使用道具 举报 送花

3

主题

727

回帖

165

积分

等待验证会员

积分
165
发表于 2025-5-15 23:18:00 | 显示全部楼层
关于QSPI-Flash通过DMA-P2P向TFT彩屏传输数据时出现单次启动异常的现象分析及建议解决方案:

一、现象技术定位
该问题属于典型的非易失存储器数据通道异常中断故障,具体表现为:
1. 首次冷启动时QSPI-Flash通过DMA-P2P路径可正常完成CLM数据加载
2. 连续运行过程中二次数据传输请求失效
3. 硬件接口层面未检测到物理层错误标志

二、核心问题排查方向
1. DMA控制器状态机异常
传输完成标志(TCIF)未正确清除
通道优先级冲突导致仲裁失效
突发传输模式(Burst Mode)配置残留

2. QSPI协议栈状态保持异常
连续读取时的指令序列未完整复位
四线模式(Quad Mode)退出时序偏差
闪存写使能位(WEL)未自动复位

3. 存储器映射冲突
P2P传输目标地址未动态重映射
内存屏障(Memory Barrier)未及时更新
缓存一致性协议违反

三、建议调试方案
1. DMA控制器诊断:
  
  1. c
  2.    // 检查DMAISR寄存器状态
  3.    if (DMA1->ISR & DMAISRTCIFx) {
  4.        DMA1->IFCR = DMAIFCRCTCIFx; // 显式清除传输完成标志
  5.        DMA1Channelx->CCR &= ~DMACCREN; // 先关闭通道
  6.        DMA1Channelx->CNDTR = BUFFERSIZE; // 重装载数据量
  7.        DMA1Channelx->CCR |= DMACCREN; // 重新使能通道
  8.    }
复制代码

2. QSPI接口状态验证:
使用示波器捕获CLK/CS#/DQS信号:
      确认二次传输时Chip Select信号有效脉宽≥tCSS
      检查DQ线在指令阶段的0-1-2-3阶段电平跳变
读取状态寄存器:
   
  1. c
  2.      HALQSPICommand(&hqspi, &scommand, HALQPSITIMEOUTDEFAULTVALUE);
  3.      HALQSPIReceive(&hqspi, &statusreg, 100);
  4.      // 验证WIP位(bit0)和WEL位(bit1)
复制代码

3. 时序约束优化:
在DMA传输前后插入硬件延迟:
   
  1. c
  2.      DSB(); // 数据同步屏障
  3.      ISB(); // 指令同步屏障
  4.      DWT->CYCCNT = 0;
  5.      while(DWT->CYCCNT < 12); // 12周期延迟补偿
复制代码
调整QSPI时钟分频系数:
   
  1. c
  2.      hqspi.Init.ClockPrescaler = 2; // 降频至1/2系统时钟
复制代码

四、长效解决方案建议
1. 硬件层面:
在QSPI CLK线上增加RC滤波电路(典型值:R=33Ω, C=10pF)
采用阻抗匹配设计:LVCMOS接口串联22Ω电阻

2. 固件架构改进:
  
  1. c
  2.    void QSPIDMARetryHandler(void)
  3.    {
  4.        static uint8t retrycount = 0;
  5.        if(HALQSPIGetState(&hqspi) == HALQSPISTATEERROR)
  6.        {
  7.            HALQSPIAbort(&hqspi);
  8.            MXQSPIReinit(); // 硬件复位序列
  9.            if(++retrycount < 3)
  10.                QSPIDMATransmit();
  11.            else
  12.                ErrorHandler();
  13.        }
  14.    }
复制代码

建议配合逻辑分析仪同时捕获以下信号序列:
1. QSPI接口的CLK/D0-D3/CS#信号
2. DMA请求(DREQ)和应答(DACK)信号
3. TFT接口的WR#/RD#脉冲时序

通过交叉验证总线仲裁器(Bus Matrix)的优先级权重寄存器设置,确保DMA控制器在访问共享存储资源时具有最高仲裁优先级。同时建议检查电源完整性,特别是VDDQSPI供电网络的纹波特性,要求峰峰值≤50mV。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-27 00:25:01
已绑定手机

2

主题

7

回帖

79

积分

注册会员

积分
79
发表于 2025-5-15 23:36:10 | 显示全部楼层
国芯人*** 发表于 2025-5-15 23:18
关于QSPI-Flash通过DMA-P2P向TFT彩屏传输数据时出现单次启动异常的现象分析及建议解决方案:

一、现象技术 ...

hqspi.Init.ClockPrescaler = 2;  程序里的分频系数是3 改2不是变快了吗,但是改成20 又不行了

点评

找不到“hqspi.Init.ClockPrescaler” [attachimg]99649[/attachimg]  详情 回复 发表于 2025-5-18 17:44
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-27 00:25:01
已绑定手机

2

主题

7

回帖

79

积分

注册会员

积分
79
发表于 2025-5-17 00:13:11 | 显示全部楼层
我自己发现他死在了  QSPI_CheckBusy() 这个语句 ,QSPI_SR1的值是0x38 ,bti5 查询手册以后发现其应该是在完成后自动清零才对。实际并没有清零,加延时并没有作用

点评

有以下8个函数调用了QSPI_CheckBusy,卡在哪里? QSPI_Inilize QSPI_ReadData_DMA_to_LCM QSPI_READ_INSTR_SDATA QSPI_WRITE_INSTR QSPI_WRITE_INSTR_SADDR8 QSPI_READ_INSTR_SADDR24_DUMMY_QDATA QSPI_WRITE_INSTR_  详情 回复 发表于 2025-5-18 17:41
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2025-5-18 17:41:57 | 显示全部楼层
爱吃*** 发表于 2025-5-17 00:13
我自己发现他死在了  QSPI_CheckBusy() 这个语句 ,QSPI_SR1的值是0x38 ,bti5 查询手册以后发现其应该是在 ...

有以下8个函数调用了QSPI_CheckBusy,卡在哪里?
QSPI_Inilize
QSPI_ReadData_DMA_to_LCM
QSPI_READ_INSTR_SDATA
QSPI_WRITE_INSTR
QSPI_WRITE_INSTR_SADDR8
QSPI_READ_INSTR_SADDR24_DUMMY_QDATA
QSPI_WRITE_INSTR_SADDR24
QSPI_WRITE_INSTR_SADDR24_QDATA
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2025-5-18 17:44:34 | 显示全部楼层
爱吃*** 发表于 2025-5-15 23:36
hqspi.Init.ClockPrescaler = 2;  程序里的分频系数是3 改2不是变快了吗,但是改成20 又不行了
...


找不到“hqspi.Init.ClockPrescaler”
截图202505181744147071.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-27 00:25:01
已绑定手机

2

主题

7

回帖

79

积分

注册会员

积分
79
发表于 2025-5-19 12:54:12 | 显示全部楼层
Debu*** 发表于 2025-5-18 17:41
有以下8个函数调用了QSPI_CheckBusy,卡在哪里?
QSPI_Inilize
QSPI_ReadData_DMA_to_LCM

QSPI_ReadData_DMA_to_LCM  这个函数 调用了第二次就卡住了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-27 00:25:01
已绑定手机

2

主题

7

回帖

79

积分

注册会员

积分
79
发表于 2025-5-19 13:00:12 | 显示全部楼层
爱吃*** 发表于 2025-5-15 23:36
hqspi.Init.ClockPrescaler = 2;  程序里的分频系数是3 改2不是变快了吗,但是改成20 又不行了
...

这个是ai工具提示的的查找方向,  我自己根据提示修改的是初始化里:  QSPI_InitStructure.ClockDiv   = 3;      //设置QSPI时钟 = 系统时钟/(n+1), 0~255
这个参数还是卡住
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-27 00:25:01
已绑定手机

2

主题

7

回帖

79

积分

注册会员

积分
79
发表于 2025-5-21 00:48:51 | 显示全部楼层
我之前的提问描述有些问题,给人有些模糊,我主要的问题是qspi的DMA-P2P将数据读出到clm里去 ,当我第二次调用QSPI_ReadData_DMA_to_LCM这个函数时我死在了 QSPI_CheckBusy()语句,这个语句其实就是检查了QSPI_SR1的值是,我打印出来的结果是0x38,我不清楚的是程序设置不对还是硬件问题,因为我单独调qpis的dma功能将数据读到xdata区是能够显示正常的图片的,说明硬件连线是没有问题的,P2P和qspi的dma两个都是dma功能使用了P2P功能就只能掉用一次,所以我更偏向软件的P2P设置问题。没弄过这个求大佬解惑。拜托了。 (图片的flash 的数据提前写入的,通过果qspi的dma将数组的数据写入的)
bdb52b12cc6bc66c7ed26dae8c017a7b.png
f7892b38bdccdd29a387d14adb80f185.png
94c91a5d623300e15ec7961752c7382f.png

lcm_dam (3).zip

748.73 KB, 下载次数: 3

373787e4e4b53df7bccd24923c4521ee.mp4

4.19 MB, 下载次数: 3

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2056

回帖

7064

积分

论坛元老

积分
7064
发表于 2025-5-22 16:45:00 | 显示全部楼层
你这程序是移植部分例程代码编写的?
建议直接在AI8051U实验箱例程包 QSPI P2P LCM 的例子上修改你需要使用的脚位通道试试。
例程下载地址:https://www.stcai.com/syx
截图202505221642311414.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 10:37 , Processed in 0.200953 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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