搜索
bottom↓
回复: 5

lpc3131 SD卡的DMA读写问题

[复制链接]

出0入0汤圆

发表于 2011-1-12 10:57:47 | 显示全部楼层 |阅读模式
我用的NXP的LPC3131试图用DMA方式读取SD卡的内容,但是始终没有什么反应,希望有人不吝赐教一下,我都怀疑那个SD卡到底有没有DMA模式啊?对于数据手册所写有点怀疑。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-1-12 22:45:46 | 显示全部楼层
开DMA的时候,是否打开了MMU和数据缓存?

出0入0汤圆

发表于 2011-1-13 01:17:04 | 显示全部楼层
这是我2440用DMA显示SD卡里面的图片的函数
         DMA_SWHW.DMA_SWHW_SEL=1;
                 DMA_SWHW.DMA_HW_ID   =2;
                 DMA_Install(0,0x5A000040,1,1,(U32)g_ausLCD_BUFFER,0,0,1,nLength,DMA_SWHW,1,DMA_End);
                 DMA_Start(0);
                 while(g_DmaFlag==1);
                 DMA_Stop(0);

char g_DmaFlag=0;
void DMA_Install(U8 nChannle,
                                 U32 ulSrcAddr,
                                 U8 cSrcAddrAddEn,
                 U32 cSRCSelHP,
                                 U32 ulDstAddr,
                                 U8 cDstAddrAddEn,
                                 U32 cDSTSelHP,
                                 U32 cDataSize,
                                 U32 nLength,
                                DMA_SWHW_SEL_T cSWHW_Sel,
                                 U32 cIntEn,
                                 DmaIrqFunc Func)
{
        DMA_REG_T *pstDMA=NULL;
       
        switch(nChannle)
        {
                case 0:
                                {
                                        pstDMA=(void *)0x4b000000;
                                        if(cIntEn==1)
                                        {
                                                IRQ_Install(INT_TYPE_SUB_DMA0,0,Func);
                                        }
                                        break;
                                }
                case 1:
                                {
                                        pstDMA=(void *)0x4b000040;
                                        if(cIntEn==1)
                                        {
                                                IRQ_Install(INT_TYPE_SUB_DMA1,0,Func);
                                        }
                                        break;
                                }
                case 2:
                                {
                                        pstDMA=(void *)0x4b000080;
                                        if(cIntEn==1)
                                        {
                                                IRQ_Install(INT_TYPE_SUB_DMA2,0,Func);
                                        }
                                        break;
                                }
                case 3:
                                {
                                        pstDMA=(void *)0x4b0000c0;
                                        if(cIntEn==1)
                                        {
                                                IRQ_Install(INT_TYPE_SUB_DMA3,0,Func);
                                        }
                                        break;
                                }
                default:
                                return ;
        }

        pstDMA->DMA_DISRC  = ulSrcAddr;

        pstDMA->DMA_DISRCC = (cSRCSelHP<<1)|cSrcAddrAddEn;

        pstDMA->DMA_DIDST  = ulDstAddr;

        pstDMA->DMA_DIDSTC = (cDSTSelHP<<1)|cDstAddrAddEn;

        pstDMA->DMA_DCON   = (1<<31)+(1<<30)+(cIntEn<<29)+(DMA_TANS_WIDTH<<28)+\
                             (0<<27)+(cSWHW_Sel.DMA_HW_ID<<24)+(cSWHW_Sel.DMA_SWHW_SEL<<23)+\
                                                 (1<<22)+(cDataSize<<20)|nLength;
                                                 
                                                 
               
}

void DMA_Start(U8 nChannle)
{
        switch(nChannle)
        {
                case 0: rDMASKTRIG0=(1<<1)|(rDCON0&(1<<23));
                                break;
                case 1: rDMASKTRIG1=(1<<1)|(rDCON1&(1<<23));
                                break;
                case 2: rDMASKTRIG2=(1<<1)|(rDCON2&(1<<23));
                                break;
                case 3: rDMASKTRIG3=(1<<1)|(rDCON3&(1<<23));
                                break;
                default:
                                return ;
        }

        g_DmaDoneFlagN[nChannle]=1;       
        g_DmaFlag=1;
}

void DMA_Stop(U8 nChannle)
{
        switch(nChannle)
        {
                case 0: rDMASKTRIG0=(1<<2);
                                break;
                case 1: rDMASKTRIG1=(1<<2);
                                break;
                case 2: rDMASKTRIG2=(1<<2);
                                break;
                case 3: rDMASKTRIG3=(1<<2);
                                break;
                default:
                                return ;
        }
       
        g_DmaDoneFlagN[nChannle]=0;

        IRQ_Uninstall(INT_TYPE_SUB_DMA0+nChannle,0);
               
}

出0入0汤圆

发表于 2011-1-13 01:18:52 | 显示全部楼层
DMA是否成功 要注意 配置源与目标的地址设置 和 DMA触发方式(软件 硬件)

出0入0汤圆

 楼主| 发表于 2011-1-14 17:27:42 | 显示全部楼层
回复【楼主位】lijun2010
-----------------------------------------------------------------------

已经打开了啊!

出0入0汤圆

发表于 2011-8-2 12:23:50 | 显示全部楼层
关注楼主进展如何?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 21:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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