原创 Nios II DMA: memory to memory

2010-2-7 09:40 4209 3 4 分类: FPGA/CPLD

本实例在SDRAM中开辟了一个存储空间,无符号字符数组,通过DMA,将SDRAM中数据发送到on_chip ram中。其中可以通过串口监控DMA开始与结束目标地址空间的数据,此外也可以通过LED的状态,知晓DMA是否执行完毕。


此外还可以通过Dubeg模式下,memory观察目标地址空间的数据变化。


点击看大图


上图是发起DMA前,地址空间0x801000往后的地址全为零。


点击看大图


上图是DMA传输完成后,地址空间0x801000往后的地址的数据变成红色,发生改变,数值与chr数组中元素的值一致,说明DMA传输成功。


#include <stdio.h><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


#include <stdlib.h>


#include "unistd.h"


#include "string.h"


#include "io.h"


#include "system.h"


#include "sys/alt_dma.h"


#include "sys/alt_cache.h"


#include "sys/alt_irq.h"


#include "alt_types.h"


#include "sys/alt_irq.h"


 


#include "altera_avalon_dma_regs.h"


#include "altera_avalon_uart_regs.h"


 


 


volatile alt_u8 chr[20] = {1,2,3,4,6,5,7,8,9,10,


                        11,12,13,14,15,16,17,18,19,20} ;//数据源


static volatile int rx_done = 0;


 


static void done (void* handle, void* data)


{


rx_done++;


IOWR(LED_BASE,0, rx_done);//LED显示rx_done的变化


}


 


int main (int argc, char* argv[], char* envp[])


{


alt_u8 i="0";


int rc;


alt_dma_txchan txchan;


alt_dma_rxchan rxchan;


void * tx_data = (void*) chr;


alt_u8 *rx = (alt_u8 *)ONCHIP_RAM_BASE;


void* rx_buffer = (void*) ONCHIP_RAM_BASE;//0x00801000; /* pointer to rx buffer */


IOWR(LED_BASE,0, 0);


for(i =0;i<20;i++)  //串口输出目标地址空间的数据


{


   printf ("%c\n",*(rx+i));


}


printf ("Let's begin!\n");


 


if ((txchan = alt_dma_txchan_open("/dev/DMA0")) == NULL)


{


printf ("Failed to open transmit channel\n");


}


 


if ((rxchan = alt_dma_rxchan_open("/dev/DMA0")) == NULL)


{


printf ("Failed to open receive channel\n");


}


 


if ((rc = alt_dma_txchan_send (txchan,


tx_data,


20,


NULL,


NULL)) < 0)


{


printf ("Failed to post transmit request, reason = %i\n", rc);


}


 


if ((rc = alt_dma_rxchan_prepare (rxchan,


rx_buffer,


20,


done,


NULL)) < 0)


{


printf ("Failed to post read request, reason = %i\n", rc);


 


}


while (!rx_done);


printf ("Transfer successful!\n");


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


{


   printf ("%c",*(rx+i)); //再次输出dma传输后目标地址的数据


}


while(1);


return 0;


}


 如有问题可以留言讨论!

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户258499 2011-3-15 11:57

您好,问题已得到一点解决。
相关推荐阅读
用户180508 2011-08-08 22:29
运算放大器指标
1.输入失调电压VIO(input offset voltage) :输入电压为零时,将输出电压除以电压增益,再加上负号,即为折算到输入端的失调电压。亦即使输出电压为零时在输入端所加的补偿电压。VIO...
用户180508 2011-02-18 22:21
UDE(u盘超级加密2008)失效解决
UDE伪装成唐诗三百首的加密软件,在忘记密码资料还没有丢失,操作系统改变时加密文件没有显示在加密区内。此时文件也没有丢失。 采用R-Studio(注册后)可以探测到隐藏的文件,并恢复。 本人遇到的隐藏...
用户180508 2011-02-01 12:35
Altea公司FPGA开发软件安装指南与注意
Quartus II安装点击Setup,和安装其他应用程序一样。可以根据自己的需要决定安装的大小。比如可以选择是否安装某种型号的器件 QuartusII8.0 破解补丁1将sys_cpt.dll覆盖掉...
用户180508 2011-02-01 12:02
Altea公司FPGA开发软件安装指南与注意
Quartus II安装点击Setup,和安装其他应用程序一样。可以根据自己的需要决定安装的大小。比如可以选择是否安装某种型号的器件QuartusII8.0 破解补丁1将sys_cpt.dll覆盖掉安...
用户180508 2011-02-01 12:01
Altea公司FPGA开发软件安装指南与注意
Quartus II安装点击Setup,和安装其他应用程序一样。可以根据自己的需要决定安装的大小。比如可以选择是否安装某种型号的器件QuartusII8.0 破解补丁1将sys_cpt.dll覆盖掉安...
用户180508 2010-12-30 10:18
VC安装错误解决
安装VC++6.0时候总是说我的安装程序无法创建一个DCOM用户来注册? 右击我的电脑-》管理-》本地用户和组-》用户-》删除VSA Sever Account项 再安装,成功!...
EE直播间
更多
我要评论
1
3
关闭 站长推荐上一条 /3 下一条