您的位置: OpenADSP社区论坛 -> SHARC/TigerSHARC专区 -> 新手上路 -> 21469/21489的DMA使用
本帖共有640个阅读者
发表帖子 发表投票 回复主题
21469/21489的DMA使用
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
21469/21489的DMA使用
问:谁能给我一个针对214XX系列DSP芯片的DMA例子?用DMA实现内部sram与片外sdram之间数据传输。我调试了很久,不知道我程序哪里出了问题。谢谢

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 17:43:19
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:此时要使用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.


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 17:43:50
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问:谢谢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评估板

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


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 17:44:06
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:附件里,是一个DMA的完整例子,直接可以在ADI的评估板上运行。你可以参考该例程即可。

https://ezchina.analog.com/servlet/JiveServlet/download/2878-1-1829/21469MDMA_0.1.zip

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 17:44:32
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154026 Call, 1 Queries, Processed in 0.186523 second(s),