完成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模式
请提供完整的简洁测试代码,我们好测试 神农鼎 发表于 2025-6-26 10:33
请提供完整的简洁测试代码,我们好测试
实际就是 例程中<72.3-QSPI-TFT_DMA_P2P外设到外设_显示视频级动画效果程序>这个程序,
设置一个 在Xdata中的大数组,读完一次flash数据,再检测Xdata 的数据就不对了,
实际Xdata的数据还在,带电复位后,Xdata的数据还在. 神农鼎 发表于 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() 请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的? 请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的? ercircle 发表于 2025-6-26 11:05
请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的? ...
精简的测试代码
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;
zhx 发表于 2025-6-26 12:16
对例程的修改:
DMA 长度,有常数改为变量
缺失文件
这个好像是P2P操作空间和str声明空间重叠导致的
将操作空间减小#define DMA_AMT_LEN (20480UL)
将str声明位置靠后,char xdata str _at_ 0x7000;
问题现象消失
页:
[1]
2