爱吃鱼苗 发表于 2025-5-15 23:14:18

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

现象就是使用QSPI的DMA-P2P将数据读出到LCM就不行。第一次可有读出数据。

国芯人工智能 发表于 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控制器诊断:
   c
   // 检查DMAISR寄存器状态
   if (DMA1->ISR & DMAISRTCIFx) {
       DMA1->IFCR = DMAIFCRCTCIFx; // 显式清除传输完成标志
       DMA1Channelx->CCR &= ~DMACCREN; // 先关闭通道
       DMA1Channelx->CNDTR = BUFFERSIZE; // 重装载数据量
       DMA1Channelx->CCR |= DMACCREN; // 重新使能通道
   }

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

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

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

2. 固件架构改进:
   c
   void QSPIDMARetryHandler(void)
   {
       static uint8t retrycount = 0;
       if(HALQSPIGetState(&hqspi) == HALQSPISTATEERROR)
       {
         HALQSPIAbort(&hqspi);
         MXQSPIReinit(); // 硬件复位序列
         if(++retrycount < 3)
               QSPIDMATransmit();
         else
               ErrorHandler();
       }
   }

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]

爱吃鱼苗 发表于 2025-5-15 23:36:10

国芯人工智能 发表于 2025-5-15 23:18
关于QSPI-Flash通过DMA-P2P向TFT彩屏传输数据时出现单次启动异常的现象分析及建议解决方案:

一、现象技术 ...

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

爱吃鱼苗 发表于 2025-5-17 00:13:11

我自己发现他死在了QSPI_CheckBusy() 这个语句 ,QSPI_SR1的值是0x38 ,bti5 查询手册以后发现其应该是在完成后自动清零才对。实际并没有清零,加延时并没有作用

DebugLab 发表于 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 发表于 2025-5-18 17:44:34

爱吃鱼苗 发表于 2025-5-15 23:36
hqspi.Init.ClockPrescaler = 2;程序里的分频系数是3 改2不是变快了吗,但是改成20 又不行了
...


找不到“hqspi.Init.ClockPrescaler”

爱吃鱼苗 发表于 2025-5-19 12:54:12

DebugLab 发表于 2025-5-18 17:41
有以下8个函数调用了QSPI_CheckBusy,卡在哪里?
QSPI_Inilize
QSPI_ReadData_DMA_to_LCM


QSPI_ReadData_DMA_to_LCM这个函数 调用了第二次就卡住了

爱吃鱼苗 发表于 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
这个参数还是卡住

爱吃鱼苗 发表于 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设置问题。{:4_188:}{:4_188:}没弄过这个求大佬解惑。拜托了。 (图片的flash 的数据提前写入的,通过果qspi的dma将数组的数据写入的)

乘风飞扬 发表于 2025-5-22 16:45:00

你这程序是移植部分例程代码编写的?
建议直接在AI8051U实验箱例程包 QSPI P2P LCM 的例子上修改你需要使用的脚位通道试试。
例程下载地址:https://www.stcai.com/syx
页: [1] 2
查看完整版本: QSPI-Flash ==> DMA-P2P ==> TFT彩屏 / i8080-8位并口 只能启动一次