Forum Discussion
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!