找回密码
 立即注册
查看: 107|回复: 14

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-26 10:23:11

20

主题

99

回帖

818

积分

高级会员

积分
818
发表于 3 天前 | 显示全部楼层 |阅读模式
  1.    DMA_P2P_CR1 = 0x87;                 //P2P_SRC_QSPIRX(0x80) | P2P_DEST_LCMTX(0x07);
  2.     DMA_QSPI_CFG = 0x20;                //使能DMA读取操作,不中断
  3.     DMA_QSPI_STA = 0x00;                //清除DMA状态
  4.     DMA_QSPI_AMT = (len-1);             //设置DMA数据长度
  5.     DMA_QSPI_AMTH = (len-1) >> 8;
  6.     DMA_LCM_CR = 0xa0;
  7.     DMA_QSPI_CR = 0xa1;                 //启动DMA并触发QSPI读操作
  8.     while(DMA_QSPI_STA==0);             //等待DMA 完成  
  9.     DMA_QSPI_STA=0;
复制代码
执行完这段代码后,XDATA的数据读取就不正确了,大家帮忙分析是什么原因?是否DMA之后,还要做什么设置才能访问 XDATA

MCU 是 AI8051,8bit模式
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-06-29 00:35:48

740

主题

1万

回帖

1万

积分

管理员

积分
17153
发表于 3 天前 | 显示全部楼层
请提供完整的简洁测试代码,我们好测试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-26 10:23:11

20

主题

99

回帖

818

积分

高级会员

积分
818
发表于 3 天前 | 显示全部楼层
神*** 发表于 2025-6-26 10:33
请提供完整的简洁测试代码,我们好测试

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-26 10:23:11

20

主题

99

回帖

818

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-28 13:49:44
已绑定手机

72

主题

2016

回帖

4540

积分

荣誉版主

无情的代码机器

积分
4540
发表于 3 天前 | 显示全部楼层
请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的?
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-28 13:49:44
已绑定手机

72

主题

2016

回帖

4540

积分

荣誉版主

无情的代码机器

积分
4540
发表于 3 天前 | 显示全部楼层
请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的?
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-26 10:23:11

20

主题

99

回帖

818

积分

高级会员

积分
818
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-6-26 11:05
请上传完整工程及说明修改了哪些地方~
这个函数里都没检测xdata相关代码,如何确认对与不对的? ...

精简的测试代码
XDATA测试.rar (104.11 KB, 下载次数: 4)

截图202506261206082698.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-26 10:23:11

20

主题

99

回帖

818

积分

高级会员

积分
818
发表于 3 天前 | 显示全部楼层
erci*** 发表于 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;

点评

缺失文件 [attachimg]106144[/attachimg]  详情 回复 发表于 3 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-28 13:49:44
已绑定手机

72

主题

2016

回帖

4540

积分

荣誉版主

无情的代码机器

积分
4540
发表于 3 天前 | 显示全部楼层
zh*** 发表于 2025-6-26 12:16
对例程的修改:

DMA 长度,有常数改为变量

缺失文件
截图202506261244586586.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-28 13:49:44
已绑定手机

72

主题

2016

回帖

4540

积分

荣誉版主

无情的代码机器

积分
4540
发表于 3 天前 | 显示全部楼层
这个好像是P2P操作空间和str声明空间重叠导致的
将操作空间减小#define DMA_AMT_LEN         (20480UL)
将str声明位置靠后,char xdata str[10] _at_ 0x7000;
问题现象消失



截图202506261324217882.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-29 03:32 , Processed in 0.283994 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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