- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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; }Link Copied
11 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Look at the end of thread dma transfer inside isr: problem
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
thanks for your suggestion,
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
good evenning!
colud you give me program about DMA(from uart to SDRAM OR ONCHIP),i can't solve this trouble . regardly- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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; }
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi!
In my project I use the CPU/f and I have a istruction and data cache. My program works only I use uncached memory: alt_u8 *buffer; // buffer of chars -> unsigned 8 bit buffer = alt_uncached_malloc(BUFF_SIZE * sizeof (alt_u8)); Regards
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page