adsp214xx的DMA使用

谁能给我一个针对214XX系列DSP芯片的DMA例子?用DMA实现内部sram与片外sdram之间数据传输。我调试了很久,不知道我程序哪里出了问题。谢谢

  • 0
    •  Analog Employees 
    on Apr 23, 2013 6:47 AM

    此时要使用214xx的External Port DMA即可。

    下面是一个External Port DMA的例子:

              while((*pDMAC0)&DMAS){asm("nop;");};    // DMA in progress

                *pDMAC0 = 0; //Disable External Port CH 0 DMA
               
                *pIIEP0 = Internal_buffer;   //Internal Memory Source
                *pEIEP0 = SDRAM_wbuffer;  //External Memory Destination
                *pIMEP0 = 1;    //Set up internal modify
                *pEMEP0 = 1;    //Set up external modify
                *pICEP0 = DMA_LEN;  //length of DMA
                *pECEP0 = DMA_LEN;
               
                printf("\nWrite DDR DMA start!\n");

                //Config and enable External Port CH 0 DMA 

                *pDMAC0 = DEN|TRAN|DFLSH|INTIRT;    // write to external memory, Internal DMA Completion Interrupt in enabled.

  • 谢谢frank!

          我参考了你的代码,发现我的程序还有些问题。

         我需要从外部sdram读数据到内部sram,计算好之后再将结果写到外部sdram。我配置了DDR2,我的代码类似于下面的:

    DMA_Internal2External(int*Internal_buffer,int *SDRAM_buffer,int DMA_LEN)

    {

                 while((*pDMAC0)&DMAS){asm("nop;");};  

                *pDMAC0 = 0;     
                *pIIEP0 = Internal_buffer;
                *pEIEP0 = SDRAM_buffer;
                *pIMEP0 = 1; 
                *pEMEP0 = 256;  //此处我设置为256
                *pICEP0 = DMA_LEN; 
                *pECEP0 = DMA_LEN

                *pDMAC0 = DEN|TRAN|DFLSH|INTIRT;

    }

    DMA_External2Internal(int *SDRAM_rbuffer,int *Internal_buffer,int DMA_LEN)

    {

                 while((*pDMAC0)&DMAS){asm("nop;")};//代码会在此处死循环,死循环的发生很随机

                *pDMAC0 = 0;     
                *pIIEP0 = Internal_buffer;
                *pEIEP0 = SDRAM_buffer;
                *pIMEP0 = 1; 
                *pEMEP0 = 1;  //此处仍为1
                *pICEP0 = DMA_LEN; 
                *pECEP0 = DMA_LEN

               *pDMAC0 = DEN|DFLSH|INTIRT;

    }

    调用过程类似于:

    for(i = 0; i < 100; i++)

    {

         DMA_External2Internal();

         DMA_External2Internal();

         数据计算;

         DMA_Internal2External();

         DMA_Internal2External();

    }

    我配置了DDR2,不知道是不是这里有问题。

    当用DMA将外部数据读入内部时发现,得到的数据里第一个数有时候会读取失败,得到数据0。

    另外我用的是adsp-21469评估板

    我的问题在哪里呢?谢谢!

  • 0
    •  Analog Employees 
    on Apr 24, 2013 7:42 AM

    附件里,是一个DMA的完整例子,直接可以在ADI的评估板上运行。你可以参考该例程即可。

    21469MDMA_0.1.zip