Forum Discussion
Altera_Forum
Honored Contributor
15 years agoURGENT: Peripheral to Memory DMA Transaction
Hello, may I know how to transfer data from peripheral to memory using DMA? It is quite confusing from memory-to-memory transfer. please help! thanks!
Altera_Forum
Honored Contributor
15 years agoYes, I just read all the registers and the values are all correct. before i print out the result, the DONE is already '1' and status is '10001' in binary, suppose finish running. But still, in the dst, cant get the result. my new code is as below, DMA transfer data from SDRAM to peripheral, then second DMA_0 transfer from peripheral to EXT_SRAM.
--- Quote Start --- # include "io.h"# include <stdio.h># include <unistd.h># include <sys/alt_dma.h># include "altera_avalon_dma_regs.h"# include "altera_avalon_pio_regs.h"# include "alt_types.h"# include "system.h" int main() { int i; unsigned int src = SDRAM_BASE + 0x200000; unsigned int dst = EXT_SRAM_BASE; for(i=0; i<100; i++) { IOWR(src, i, 1); printf("initial: %d\n", IORD(src, i)); } IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE, 0x1000); printf("ctrl1: %d\n", IORD_ALTERA_AVALON_DMA_CONTROL(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE, 0x1000); printf("ctrl2: %d\n", IORD_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE)); IOWR_ALTERA_AVALON_DMA_STATUS(DMA_BASE, 0x00); printf("stat1: %d\n", IORD_ALTERA_AVALON_DMA_STATUS(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE, 0x00); printf("stat2: %d\n", IORD_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE)); IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_BASE, src); printf("rdadd1: %d\n", IORD_ALTERA_AVALON_DMA_RADDRESS(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_BASE, PERIPHERAL_0_BASE); printf("wradd1: %d\n", IORD_ALTERA_AVALON_DMA_WADDRESS(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_0_BASE, PERIPHERAL_0_BASE); printf("rdadd2: %d\n", IORD_ALTERA_AVALON_DMA_RADDRESS(DMA_0_BASE)); IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_0_BASE, dst); printf("wradd2: %d\n", IORD_ALTERA_AVALON_DMA_WADDRESS(DMA_0_BASE)); IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_BASE, 200); printf("len1: %d\n", IORD_ALTERA_AVALON_DMA_LENGTH(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_0_BASE, 200); printf("len2: %d\n", IORD_ALTERA_AVALON_DMA_LENGTH(DMA_0_BASE)); IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE, 0x282); printf("crtl1: %d\n", IORD_ALTERA_AVALON_DMA_CONTROL(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE, 0x182); printf("ctrl2: %d\n", IORD_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE)); IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE, 0x28A); printf("run1: %d\n", IORD_ALTERA_AVALON_DMA_CONTROL(DMA_BASE)); IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE, 0x18A); printf("run2: %d\n", IORD_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE)); printf("status: %d\t%d\n", IORD_ALTERA_AVALON_DMA_STATUS(DMA_BASE), IORD_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE)); for(i=0;i<100;i++) { printf("waiting\n"); } printf("status: %d\t%d\n", IORD_ALTERA_AVALON_DMA_STATUS(DMA_BASE), IORD_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE)); printf("done\n"); for(i=0; i<100; i++) { printf("end: %d\n", IORD(dst, i)); } return 0; } --- Quote End --- pls help me to check the flow of my code. i am not sure if i arrange the calling function in such way is correct or not. i am afraid, maybe sometimes the data hasnt arrive and DMA also start fetching the data. pls help me to check. thanks!