QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1317|回复: 4

44b0的 dma不写内存。

[复制链接]
发表于 2006-7-18 13:28:05 | 显示全部楼层 |阅读模式
今天试验使用dma传送数据。本来的目的是用于传送网卡的package的。
可是打示波器发现dma对网卡能读,却不能写内存。我写了以下的代码试验
用zdma0来在内存中传送数据,发现更本没有进行读写操作,但奇怪dam计数器
的计数和des地址都已经进行了相应增减。
那位有经验的老鸟帮忙看看
   INT32U *src,*des,i,j,k;
    INT32U srcData[200],desData[200];
    src=srcData;
    des=desData;
        k=0;
  do{
    for(i=0;i<200;i++){
                srcData=20000-k-i;
                desData=0;
            }
    //use ZDMA0, whole mode,unit mode ,count.          
    rZDICNT0=(0x2<<2|(0x1<<26)|(0x3<<22)|(0<<20)|800;
        ///4byte unit,fixed src,src address
        rZDISRC0=(0xb<<2|(INT32U)src ;
        //increase dis ,dis address
        rZDIDES0=(0x01<<2|(INT32U)des;
    //enable ZDMA0,
    rZDICNT0|=(1<<20);
        //rx cfg
        //issue s/w command,disable nxDREQ.
        rZDCON0=1;
       
        j=200;
         while( (j>0)&&((rZDICNT0&(1<<20))!=0) ){
             j--;
         }
         k=k+10;
  }while(1);
 楼主| 发表于 2006-7-21 09:00:15 | 显示全部楼层
自己顶一下:怎么30多人看了都没给出个意见呢!我再说说我仔示波器看到的现象:如果是读网卡则读信号非常紧密,似乎完全没有留下写内存的时间。如果是上面的内存搬运,则什么信号都没有,就dma计数自己变了。
回复

使用道具 举报

发表于 2006-7-21 14:33:35 | 显示全部楼层
你的src,des都需要配置在Physical Memory中
回复

使用道具 举报

发表于 2006-7-21 17:13:41 | 显示全部楼层
rZDISRC0=(0xb<<2|(INT32U)src
这句有没有问题?这样源地址不会变吧
源地址应该是增量方式,rZDISRC0=(0x9<<2|(INT32U)src 才对吧
回复

使用道具 举报

 楼主| 发表于 2006-7-27 09:15:15 | 显示全部楼层
终于找到原因了!原来用dma就不能用cache!,必须先对做dma的内存禁止cache才能做dma操作!dma的设置倒是没有错的。

但这又有问题,关闭cache,系统的效率奇低,如果临时把那部分内存屏蔽一下cache,dma完了以后怎么告诉cache与内存同步起来呢!真是个头痛的问题。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 12:26 , Processed in 0.037894 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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