lijun2010 发表于 2011-1-12 10:57:47

lpc3131 SD卡的DMA读写问题

我用的NXP的LPC3131试图用DMA方式读取SD卡的内容,但是始终没有什么反应,希望有人不吝赐教一下,我都怀疑那个SD卡到底有没有DMA模式啊?对于数据手册所写有点怀疑。

llf021421 发表于 2011-1-12 22:45:46

开DMA的时候,是否打开了MMU和数据缓存?

fengyuganyu 发表于 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=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=0;

        IRQ_Uninstall(INT_TYPE_SUB_DMA0+nChannle,0);
               
}

fengyuganyu 发表于 2011-1-13 01:18:52

DMA是否成功 要注意 配置源与目标的地址设置 和 DMA触发方式(软件 硬件)

lijun2010 发表于 2011-1-14 17:27:42

回复【楼主位】lijun2010
-----------------------------------------------------------------------

已经打开了啊!

ljqlaq 发表于 2011-8-2 12:23:50

关注楼主进展如何?
页: [1]
查看完整版本: lpc3131 SD卡的DMA读写问题