zhx 发表于 4 天前

完成DMA TFT显示后,访问Xdata 的数据就会错误

   DMA_P2P_CR1 = 0x87;               //P2P_SRC_QSPIRX(0x80) | P2P_DEST_LCMTX(0x07);

    DMA_QSPI_CFG = 0x20;                //使能DMA读取操作,不中断

    DMA_QSPI_STA = 0x00;                //清除DMA状态

    DMA_QSPI_AMT = (len-1);             //设置DMA数据长度

    DMA_QSPI_AMTH = (len-1) >> 8;

    DMA_LCM_CR = 0xa0;

    DMA_QSPI_CR = 0xa1;               //启动DMA并触发QSPI读操作

    while(DMA_QSPI_STA==0);             //等待DMA 完成

    DMA_QSPI_STA=0;执行完这段代码后,XDATA的数据读取就不正确了,大家帮忙分析是什么原因?是否DMA之后,还要做什么设置才能访问 XDATA

MCU 是 AI8051,8bit模式

神农鼎 发表于 4 天前

请提供完整的简洁测试代码,我们好测试

zhx 发表于 4 天前

神农鼎 发表于 2025-6-26 10:33
请提供完整的简洁测试代码,我们好测试

实际就是 例程中<72.3-QSPI-TFT_DMA_P2P外设到外设_显示视频级动画效果程序>这个程序,
设置一个 在Xdata中的大数组,读完一次flash数据,再检测Xdata 的数据就不对了,
实际Xdata的数据还在,带电复位后,Xdata的数据还在.

zhx 发表于 4 天前

神农鼎 发表于 2025-6-26 10:33
请提供完整的简洁测试代码,我们好测试
void SPI_Read_Nbytes(u32 addr, u16 len) //显示一帧图片
{
    while (QSPI_CheckBusy());         //检测忙状态
    QSPI_SetReadMode();               //读模式
    QSPI_SetDataLength(len-1);          //设置数据长度
    QSPI_SetAddressSize(2);             //设置地址宽度为24位(2+1字节)
    QSPI_SetDummyCycles(8);             //设置DUMMY时钟
    QSPI_NoInstruction();               //设置无指令模式(防止误触发)
    QSPI_NoAddress();                   //设置无地址模式(防止误触发)
    QSPI_NoAlternate();               //无间隔字节
    QSPI_DataQuadMode();                //设置数据为四线模式
    QSPI_SetInstruction(0x6B);          //设置指令
    QSPI_InstructionSingMode();         //设置指令为单线模式
    QSPI_NoAddress();                   //设置无地址模式(防止误触发)
    QSPI_SetAddress(addr);            //设置地址
    QSPI_AddressSingMode();             //设置地址为单线模式
//这里Xdata 数据正确               
    DMA_P2P_CR1 = 0x87;               //P2P_SRC_QSPIRX(0x80) | P2P_DEST_LCMTX(0x07);
    DMA_QSPI_CFG = 0x20;                //使能DMA读取操作,不中断
    DMA_QSPI_STA = 0x00;                //清除DMA状态
    DMA_QSPI_AMT = (len-1);             //设置DMA数据长度
    DMA_QSPI_AMTH = (len-1) >> 8;
    DMA_LCM_CR = 0xa0;
    DMA_QSPI_CR = 0xa1;               //启动DMA并触发QSPI读操作
    while(DMA_QSPI_STA==0);             //等待DMA 完成
    DMA_QSPI_STA=0;
//这里Xdata 数据错误
}
主要问题在这个函数里,这个就是 <72.3-QSPI-TFT_DMA_P2P外设到外设_显示视频级动画效果程序> 里的 void QSPI2TFT_Start()

ercircle 发表于 4 天前

请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的?

ercircle 发表于 4 天前

请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的?

zhx 发表于 4 天前

ercircle 发表于 2025-6-26 11:05
请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的? ...
精简的测试代码



zhx 发表于 4 天前

ercircle 发表于 2025-6-26 11:05
请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的? ...
对例程的修改:

DMA 长度,有常数改为变量
DMA_QSPI_AMT = (len-1);             //设置DMA数据长度
DMA_QSPI_AMTH = (len-1) >> 8;

例程:

DMA_QSPI_AMT = (DMA_AMT_LEN-1);   //设置DMA数据长度
DMA_QSPI_AMTH = (DMA_AMT_LEN-1) >> 8;

ercircle 发表于 4 天前

zhx 发表于 2025-6-26 12:16
对例程的修改:

DMA 长度,有常数改为变量


缺失文件

ercircle 发表于 4 天前

这个好像是P2P操作空间和str声明空间重叠导致的
将操作空间减小#define DMA_AMT_LEN         (20480UL)
将str声明位置靠后,char xdata str _at_ 0x7000;
问题现象消失





页: [1] 2
查看完整版本: 完成DMA TFT显示后,访问Xdata 的数据就会错误