Forum Discussion
Altera_Forum
Honored Contributor
15 years agoDMA Issue ,please help me,PLEASE
I have a program about DMA , The functions is send data from RS232 to SDRAM, SDRAM can receive data ,but when i check this data whther rightly, find the data that it's not send from uart . the problem is i can't receive right data from uart. this problem have trouble me about 3 weeks .please give me a sugesttion or verify this programs. deeply thanks.
( Another program work rightly to send data from SDRAM to RS232 ,so SDRAM and RS232 work rightly) software visions: Q10.0+NIOS 10.0 PLEASE HELP ME,THANK YOU the program is: //字符串从RS232写到SDRAM,再从SDRAM读到JTAG UART端# include <stdio.h># include <stdlib.h># include "sys/alt_dma.h"# include "altera_avalon_uart_regs.h"# include "system.h"# include "alt_types.h"# include <string.h> static volatile int tx_done = 0; volatile static char str[] = {"this is sdram data,written by memcpy function\n"} ;//待写到SDRAM的数据# define TRANSFER_LENGTH 1024 //回调函数 static void done (void* handle) { tx_done++; } int main() { alt_u8 i; FILE *fp_LCD=0; FILE *fp_RS232=0; fp_LCD = fopen("/dev/lcd","w"); fp_RS232 = fopen("/dev/rs232","w"); int rc; alt_dma_txchan txchan; void* source = (void*)(SDRAM_BASE);/* 源地址 */ void* dest = (void*)IOADDR_ALTERA_AVALON_UART_TXDATA(RS232_BASE ); memcpy(SDRAM_BASE,str,strlen(str)); //将STR地址中的字符串写到SDRAM /* 打开发送通道 */ if ((txchan = alt_dma_txchan_open("/dev/dma")) == 0) { printf ("successful to open transmit channel\n"); exit (1); } /* 设置目标地址固定 */ if ((rc = alt_dma_txchan_ioctl(txchan, ALT_DMA_TX_ONLY_ON, dest)) < 0) { printf ("Failed to set ioctl, reason = %i\n", rc); exit (1); } //设置每次发送一个字节,即8位,因为UART每次只发送8位 if((rc = alt_dma_txchan_ioctl(txchan,ALT_DMA_SET_MODE_8 ,NULL))<0) { printf("Failed to set mode 8\n"); exit(1); } /* 开始发送 */ if ((rc = alt_dma_txchan_send(txchan, source, strlen(str), done, NULL)) < 0) { printf ("Failed to post transmit request, reason = %i\n", rc); exit (1); } /* 等待发送结束 */ while (!tx_done); printf ("Transfer to jtag!\n"); fprintf(fp_LCD,"Transfer to lcd! \n"); fprintf(fp_RS232,"Transfer to rs232 ! \n"); for(i=0;i<=strlen(str);i++) { printf ("%s\n",(SDRAM_BASE+i)); fprintf(fp_LCD,(SDRAM_BASE+i)); } return 0; }11 Replies
- Altera_Forum
Honored Contributor
Look at the end of thread dma transfer inside isr: problem
- Altera_Forum
Honored Contributor
thanks for your suggestion,
- Altera_Forum
Honored Contributor
Hi,
Does it work by now? What did you change? --- Quote Start --- void* dest = (void*)IOADDR_ALTERA_AVALON_UART_TXDATA(RS232_BASE ); --- Quote End --- Did you change it to void* dest = rs232_base+1 and it worked (which would confuse me a lot)?! Regards - Altera_Forum
Honored Contributor
thanks for your suggestion
work baddly as yet, How to explain (rs232_base+1) ,Means TXDATA's address? sdram can't receive valid data as yet.I'M confusing,work hard search solution - Altera_Forum
Honored Contributor
Hi
--- Quote Start --- How to explain (rs232_base+1) ,Means TXDATA's address? --- Quote End --- Micio82 described that it worked for him. At least partially. He used (rs232_base+1) for TXDATA-address. but in my code I am using: --- Quote Start --- IOADDR_ALTERA_AVALON_UART_TXDATA(RS232_BASE ) --- Quote End --- which works fine and I am thinking which should be the correct way to get the TXDATA-address. We (micio82 and me) thought it was a bit strange that (rs232_base+1) partially worked. Therefore was my question, did you make the same observation? - Altera_Forum
Honored Contributor
good evenning!
colud you give me program about DMA(from uart to SDRAM OR ONCHIP),i can't solve this trouble . regardly - Altera_Forum
Honored Contributor
my email is [email protected]
- Altera_Forum
Honored Contributor
at laset ,change code as this ,work baddly as now
//从RS232接收字符,传到SDRAM,在将所传送的信息,反馈到JTAG和RS232(通过文件形式),检查两者是否正确# include <stdio.h># include <stdlib.h># include "sys/alt_dma.h"# include "altera_avalon_uart_regs.h"# include "altera_avalon_dma_regs.h"# include "system.h"# include "alt_types.h"# include <string.h># define TRANSFER_LENGTH 1024 static volatile int tx_done = 0; static char str[512]={"this is str data,well\n"}; //回调函数 static void done (void* handle) { tx_done++; } int main() { alt_u8 i; FILE *fp_LCD=0; FILE *fp_RS232=0; fp_LCD = fopen("/dev/lcd","w"); fp_RS232 = fopen("/dev/rs232","w"); int rc; alt_dma_rxchan rxchan; void* source = RS232_BASE+1;/* 源地址 */ void* dest = (void*)(SDRAM_BASE+100); /* 打开发送通道 */ if ((rxchan = alt_dma_rxchan_open("/dev/dma")) == 0) { printf ("successful to open transmit channel\n"); exit (1); } /* 设置发送地址固定 */ if ((rc = alt_dma_rxchan_ioctl(rxchan, ALT_DMA_RX_ONLY_ON, source)) < 0) { printf ("Failed to set ioctl, reason = %i\n", rc); exit (1); } //设置每次接收一个字节,即8位,因为UART每次只发送8位 if((rc = alt_dma_rxchan_ioctl(rxchan,ALT_DMA_SET_MODE_8 ,NULL))<0) { printf("Failed to set mode 8\n"); exit(1); } /* 开始接收 */ if ((rc = alt_dma_rxchan_prepare(rxchan, SDRAM_BASE+100, 32, done, NULL)) < 0) { printf ("Failed to post transmit request, reason = %i\n", rc); exit (1); } /* 等待接收结束 */ while (!tx_done); printf ("Transfer to jtag!\n"); fprintf(fp_LCD,"Transfer to lcd! \n"); fprintf(fp_RS232,"Transfer to rs232 ! \n"); //alt_dma_rxchan_close(rxchan); memcpy(str,SDRAM_BASE+100,32); // 将SDRAM内容复制到ONCHIP str,并显示输出,以便检查 for(i=0;i<=32;i++) { printf ("%x\n",str);fprintf(fp_lcd,str); fprintf(fp_RS232,str[i]); //printf("%x\n",(SDRAM_BASE+100+i)); } //printf("%x\n",SDRAM_BASE+100); alt_dma_rxchan_close(rxchan); return 0; }
- Altera_Forum
Honored Contributor
You can see my program in the Thread dma transfer inside isr: problem; but I use the UART register to implement the driver - (you are using the HAL).
- Altera_Forum
Honored Contributor
Hi micio82
deep thanks. Did you write program about DMA ,send data from uart to SDRAM,(in my another code,sdram to uart ,it works well(didn't bypass cache),but from uart to sdram not work at all) I select cpu is CPU/F ,Must it bypass the cache ? to selsect none?