找回密码
 立即注册
查看: 78|回复: 4

疑为DMA总线并行访问题反馈

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2026-03-21 11:26:47

36

主题

1153

回帖

2871

积分

荣誉版主

积分
2871
发表于 2026-3-5 16:54:22 | 显示全部楼层 |阅读模式
型号: AI8051U-34K64  LQFP48,
问题描述,发现一个代码段xdata区的静态全局变量被未知指针改写或自身访问不正常,数据错乱。可排除代码自己的写错,因为代码是成熟代码移值的.
经过几天的排查,销定在DMA身上,DMA局部代码如下:

void ledp_run()
{
    ledp_yhdata_dt(Hub_Bufferdc);            //现在改成端口模拟时序一切正常
   
//    Buffer = (u16)Hub_Bufferdc;                      //使用DMA发数据就有问题
//    DMA_LCM_TXAH = (u8)(Buffer>>8);
//    DMA_LCM_TXAL = (u8)(Buffer);
//    DMA_LCM_TRIG_WD();
   
        HUB_STB=1;
        NOP(16);
        HUB_STB=0;
}

/*---------------------------------------------------------
DMA 配置
----------------------------------------------------------*/
void DMA_LCM_config()
{
        DMA_LCM_InitTypeDef                DMA_LCM_InitStructure;                        //结构定义

        DMA_LCM_InitStructure.DMA_Enable = ENABLE;                                //DMA使能          ENABLE,DISABLE
        DMA_LCM_InitStructure.DMA_Length = 128-1;              //DMA传输总字节数          (0~65535) + 1, 不要超过芯片 xdata 空间上限
//        DMA_LCM_InitStructure.DMA_Length = xfnu*128-1;              //DMA传输总字节数          (0~65535) + 1, 不要超过芯片 xdata 空间上限
//        DMA_LCM_InitStructure.DMA_Tx_Buffer = (u16)Hub_Bufferdc;      //发送数据存储地址
//        DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)Hub_Bufferdc;      //接收数据存储地址
        DMA_LCM_Inilize(&DMA_LCM_InitStructure);                            //初始化
   
    DMA_LCM_CFG = 0x02;     //  DAM访问优先级
}

问题奇怪就奇怪到,不是DMA自身发送数据有问题。DMA可以正确发送数据。
但是另一个模块中的数据总是不正常,DMA是在中断里触发的。
怀疑是DMA占住了XDATA的总线访问权,使另外的代码访问XDATA时出现读写错误,但手册上说是可以并行访问的。
2. 改用端口模拟时序一切正常。
3. DMA应该注意的都注意了,比如4字节对齐,不进入空IDL模式。


暂时改用端口模拟已解决问题,只是反馈一下给官方是否需要留意,不需要大家帮忙解决问题。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:257
  • 最近打卡:2026-04-01 08:14:32
已绑定手机

22

主题

631

回帖

2340

积分

金牌会员

积分
2340
发表于 2026-3-5 17:11:58 | 显示全部楼层
关掉DMA试一下
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:494
  • 最近打卡:2026-04-03 08:57:18
已绑定手机

104

主题

4237

回帖

9413

积分

荣誉版主

无情的代码机器

积分
9413
发表于 2026-3-5 17:20:54 | 显示全部楼层
楼主有空可否搞个问题复现工程上传下,目前已知的只有qspi的p2p会修改xram


截图202603051719328980.jpg

点评

测试新进展: 1. 因为从不使用DMA_LCM接收数据,原代码未初始化接收地址,现添加DMA接收地址为一块空闲的地址,发现没有作用,代码如下: DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)(Hub_Buffer1+512); //  详情 回复 发表于 2026-3-6 08:57
可以复现,但对于你们来说应该是比较难排查问题的,  详情 回复 发表于 2026-3-6 08:36
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2026-03-21 11:26:47

36

主题

1153

回帖

2871

积分

荣誉版主

积分
2871
发表于 2026-3-6 08:36:33 | 显示全部楼层
erci*** 发表于 2026-3-5 17:20
楼主有空可否搞个问题复现工程上传下,目前已知的只有qspi的p2p会修改xram

可以复现,但对于你们来说应该是比较难排查问题的,
1,代码比较大,用于驱动一个自制的点阵屏,非标准屏,所以你们难以看到运行结果。
2.  改变代码总大小可能问题会消失,改变xdata的总用量也是如此。所以定向问题困难。


我还在测试中,现在有些方向了,估计时总线权的问题,因为我中断频率非常高,代码和DMA会同时访问xdata总线
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2026-03-21 11:26:47

36

主题

1153

回帖

2871

积分

荣誉版主

积分
2871
发表于 2026-3-6 08:57:02 | 显示全部楼层
erci*** 发表于 2026-3-5 17:20
楼主有空可否搞个问题复现工程上传下,目前已知的只有qspi的p2p会修改xram

测试新进展:
1. 因为从不使用DMA_LCM接收数据,原代码未初始化接收地址,现添加DMA接收地址为一块空闲的地址,发现没有作用,代码如下:
        DMA_LCM_InitStructure.DMA_Rx_Buffer = (u16)(Hub_Buffer1+512);      //接收数据存储地址,这是准备了一块空闲的数据池,虽然用不到。但添加了也不起作用


2. 添加等待DMA完成后再继续执行代码,有用。代码如下:
void ledp_run()
{     
    static u16 data Buffer;   
    HUB_STB=1;   
    NOP(16);   
    HUB_STB=0;
      
    DMA_LCM_STA=0;

    Buffer = (u16)Hub_Bufferdc;   
    DMA_LCM_TXAH = (u8)(Buffer>>8);
    DMA_LCM_TXAL = (u8)(Buffer);      
    DMA_LCM_TRIG_WD();   

    while(!(DMA_LCM_STA&0x01));    添加此句后,就正常了,等待DMA完成后再执行后续代码。呃,后来发现也不完全正常,改善了一些,出错的概率变小了
    DMA_LCM_STA=0;
}

3. 改变DMA总线访问优先级,没有作用


总结,个人认为是总线访问权的问题,因为DMA运行频繁,并且是在中断里触发的,退出中断后DMA还在运行,
如果退出中断后用户代码访问xdata,就造成代码和DMA同时访问xdata总线,可能仲裁失效或DMA改写了其他xdata区域的数据或其它原因,导至代码读写xdata异常。
注意,是CPU和DMA同时访问xdata总线,不是同时访问同一块地址



回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-3 16:07 , Processed in 0.121908 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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