Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
15 years ago

DMA 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:

//&#23383;&#31526;&#20018;&#20174;RS232&#20889;&#21040;SDRAM,&#20877;&#20174;SDRAM&#35835;&#21040;JTAG UART&#31471;# 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&#65292;written by memcpy function\n"} ;//&#24453;&#20889;&#21040;SDRAM&#30340;&#25968;&#25454;# define TRANSFER_LENGTH 1024

//&#22238;&#35843;&#20989;&#25968;

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);/* &#28304;&#22320;&#22336; */

void* dest = (void*)IOADDR_ALTERA_AVALON_UART_TXDATA(RS232_BASE );

memcpy(SDRAM_BASE,str,strlen(str)); //&#23558;STR&#22320;&#22336;&#20013;&#30340;&#23383;&#31526;&#20018;&#20889;&#21040;SDRAM

/* &#25171;&#24320;&#21457;&#36865;&#36890;&#36947; */

if ((txchan = alt_dma_txchan_open("/dev/dma")) == 0)

{ printf ("successful to open transmit channel\n");

exit (1);

}

/* &#35774;&#32622;&#30446;&#26631;&#22320;&#22336;&#22266;&#23450; */

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);

}

//&#35774;&#32622;&#27599;&#27425;&#21457;&#36865;&#19968;&#20010;&#23383;&#33410;&#65292;&#21363;8&#20301;&#65292;&#22240;&#20026;UART&#27599;&#27425;&#21482;&#21457;&#36865;8&#20301;

if((rc = alt_dma_txchan_ioctl(txchan,ALT_DMA_SET_MODE_8 ,NULL))<0)

{ printf("Failed to set mode 8\n");

exit(1);

}

/* &#24320;&#22987;&#21457;&#36865; */

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);

}

/* &#31561;&#24453;&#21457;&#36865;&#32467;&#26463; */

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's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    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