fengchen2008 发表于 2009-12-21 17:00

ads1.2 dma s3c2410问题

/****** DMA0 Initialize *****/

    rDISRC0 = (U32)(s_array);   //将数组首地址赋值给DMA源地址寄存器,但是s_array数组的内容改变后,DMA发送的数据还是数组第一次的值,而且这个“第一次的值”也与数组中的字符串有些不同。高手帮解下什么原因??

    下面是整个MAIN.c:

#include <string.h>
#include "..\INC\config.h"
//#define  SEND_DATA   (*(volatile unsigned char *) 0x30200000)
//#define  SEND_ADDR    ((unsigned char *) 0x30200000)

char s_array;        //定义DMA源数据区,要为全局变量

int stringchange(char sdata)
                {
                int i,j;
char *s=s_array;
               
                *s='\n';
                s++;
                *s++='\r';
                for(i=0;i<11;i++)
                        *s++=sdata;
                *s++='\n';
                *s++='\r';
                for(j=0;j<3;j++)
                        {
                        *s++=sdata;
                        for(i=0;i<9;i++)
                                *s++=' ';
                        *s++=sdata;
                        *s++='\n';
                        *s++='\r';
                        }
                for(i=0;i<11;i++)
                        *s++=sdata;
                *s++='\n';
                *s++='\r';
                *s++='\n';
                *s++='\r';
                *s++='\n';
                *s++='\r';
                for (i=0;s_array。i。;i++);
                return i;
                }
               
void DMA_init(void)
    {
            /*Uart设置成DMA形式*/
    rUCON0 = rUCON0 & 0xff3 | 0x8;
   
    /****** DMA0 Initialize *****/

    rDISRC0 = (U32)(s_array);
    rDISRCC0 = (0<<1)|(0<<0); //Src=AHB,Increment
   
    rDIDST0 = (U32)UTXH0;  // Tx FIFO address
    rDIDSTC0 = (1<<1)|(1<<0); //Dst=APB,Fixed;
   
    rDCON0 = (0<<31)|(0<<30)|(1<<29)|(0<<2|(0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (0 << 20) | (0);
            //handshake,Sync=APB,IntEn,   unit,   single,     dst=UART0,  HwReqMode,  NoAutoReload,Halfword,
//    rDMASKTRIG0 = (1<<1);        //DMA0En
    }            
   
void DMA_start(int num)
    {
    Uart_Printf("And sending ...\n\r\n\r";
     rDCON0 |=num;                //The number of sending.
    rDMASKTRIG0 = (1<<1);        //DMA0En
     }
     
void Main(void)
{
        char data=0,i;
               
        Target_Init();
        DMA_init();
        //memset(s_array,0,100);
        for(i=0;i<100;i++)
        s_array=0;
        
        while(1)
        {
        Uart_Printf("\n\r\n\r\n\r\n\rPlease insert character ...\n\r";
        while(!data)
                {
                data = Uart_GetKey();
                }
        Uart_Printf("\n\r\n\rReseived . It is %c.\n\r",data);
        DMA_start(stringchange(s_array,data));
        data=0;
        }
}

///////////////////
以s_array开始的地址的字符串的内容有改变,而发送的数据没有变

fengchen2008 发表于 2009-12-25 12:06

自己顶下!!

readkernel 发表于 2009-12-25 15:34

void Main(void)
{
      char data=0,i;
               
      Target_Init();
      DMA_init();
      //memset(s_array,0,100);
      for(i=0;i<100;i++)
      s_array=0;
      
      while(1)
      {
      Uart_Printf("\n\r\n\r\n\r\n\rPlease insert character ...\n\r";
      while(!data)
                {
                data = Uart_GetKey();
                }
      Uart_Printf("\n\r\n\rReseived . It is %c.\n\r",data);
      DMA_start(stringchange(s_array,data));
      data=0;
      }
}
int stringchange(char sdata)


:em17:

fengchen2008 发表于 2009-12-27 16:46

问题不能是在楼上的说的那儿,MAIN是下面这样


#include <string.h>
#include "..\INC\config.h"
//#define  SEND_DATA   (*(volatile unsigned char *) 0x30200000)
//#define  SEND_ADDR    ((unsigned char *) 0x30200000)

char s_array;        //定义DMA源数据区,要为全局变量

int stringchange(char sdata)
                {
                int i,j;
                char *s=s_array;
               
                *s='\n';
                s++;
                *s++='\r';
                for(i=0;i<11;i++)
                        *s++=sdata;
                *s++='\n';
                *s++='\r';
                for(j=0;j<3;j++)
                        {
                        *s++=sdata;
                        for(i=0;i<9;i++)
                                *s++=' ';
                        *s++=sdata;
                        *s++='\n';
                        *s++='\r';
                        }
                for(i=0;i<11;i++)
                        *s++=sdata;
                *s++='\n';
                *s++='\r';
                *s++='\n';
                *s++='\r';
                *s++='\n';
                *s++='\r';
                for (i=0;s_array(i);i++);  //中括号显示不出来,用(i)代替。
                return i;
                }
               
void DMA_init(void)
    {
            /*Uart设置成DMA形式*/
    rUCON0 = rUCON0 & 0xff3 | 0x8;
   
    /****** DMA0 Initialize *****/

    rDISRC0 = (U32)(s_array);
    rDISRCC0 = (0<<1)|(0<<0); //Src=AHB,Increment
   
    rDIDST0 = (U32)UTXH0;  // Tx FIFO address
    rDIDSTC0 = (1<<1)|(1<<0); //Dst=APB,Fixed;
   
    rDCON0 = (0<<31)|(0<<30)|(1<<29)|(0<<2|(0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (0 << 20) | (0);
            //handshake,Sync=APB,IntEn,   unit,   single,     dst=UART0,  HwReqMode,  NoAutoReload,Halfword,
//    rDMASKTRIG0 = (1<<1);        //DMA0En
    }            
   
void DMA_start(int num)
    {
    Uart_Printf("And sending ...\n\r\n\r";
     rDCON0 |=num;                //The number of sending.
    rDMASKTRIG0 = (1<<1);        //DMA0En
     }
     
void Main(void)
{
        char data=0,i;
               
        Target_Init();
        DMA_init();
        //memset(s_array,0,100);
        for(i=0;i<100;i++)
        s_array(i)=0;//中括号显示不出来,用(i)代替。
        
        while(1)
        {
        Uart_Printf("\n\r\n\r\n\r\n\rPlease insert character ...\n\r";
        while(!data)
                {
                data = Uart_GetKey();
                }
        Uart_Printf("\n\r\n\rReseived . It is %c.\n\r",data);
        DMA_start(stringchange(data));
        data=0;
        }
}

fengchen2008 发表于 2009-12-29 18:37

自己顶起来
页: [1]
查看完整版本: ads1.2 dma s3c2410问题