您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]使用DMA模式的UART问题求助
本帖共有595个阅读者
发表帖子 发表投票 回复主题
[求助]使用DMA模式的UART问题求助
洲洲(论坛新手)
洲洲
头衔:社区公民
帮派:无帮无派
帖数:17
金钱:269
积分:27
注册时间:2012/12/11
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]使用DMA模式的UART问题求助

板子是548的,现在想用DMA模式向UART口发送数据,将UART和DMA初始化后使能为什么利用串口调试助手收不到数据,求大侠帮忙。附程序:

#define CORE_CLK_IN  25 * 1000000
#define BUFSIZE 1024
#define WR 1
unsigned char t_buffer[50]={"\n哈哈哈\r\n\n"};
typedef struct _rs485_fifo{
unsigned char buffer[BUFSIZE];  /* Circular buffer */
unsigned int w_idx;             /* Index of write */
unsigned int r_idx;             /* Index of read */
}rs485_fifo;

rs485_fifo g_rs485_priv;
EX_INTERRUPT_HANDLER(UART1_RX_ISR);
/**************************************************************************

*延迟函数

**************************************************************************/
void delay(unsigned int tem)
{
int i;
for(i=0;i<tem;i++)
  asm("nop;");
}
/*****************************************************************************

* uart1初始化

******************************************************************************/
void Init_UART1(void)
{
*pPORTH_FER |= Px0;
*pUART1_LCR = 0x03;
*pUART1_GCTL |= UCEN;
  
}

/********************************************************************************

* 获取时钟

*********************************************************************************/
int get_sys_clk(void)
{
unsigned int PLLCTL;
unsigned int pSSEL;
unsigned int SYSCLK;
unsigned int pMSEL;

PLLCTL = *pPLL_CTL;

//get MSEL, SSEL
pMSEL = ((PLLCTL & 0x7E00) >> 9);
pSSEL = *pPLL_DIV;

SYSCLK  = pMSEL * CORE_CLK_IN/pSSEL;

return  SYSCLK;
}

/**********************************************************************************

* 设置传输波特率

***********************************************************************************/
int set_baudrate (int baudrate)
{
int SYSCLK;
int DIV;
SYSCLK = (int)get_sys_clk();
DIV = (int)(SYSCLK/16/baudrate);
*pUART1_DLL = DIV;
*pUART1_DLH = (DIV >> 8);
return 0;
}

/***********************************************************************************

*发送数据函数

***************************************************************************************/
int uart_send(char *buf, int len)
{
int i=1;
delay(50);
for(i=0;i<len;i++)
{  
  *pUART1_THR = buf[i];  
  while(!(*pUART1_LSR&0x20));
}
return i;

}
/******************************************************************************

*缓存

*******************************************************************************/
int fifoctl(rs485_fifo * priv, unsigned char *data , const unsigned char flag)
{
    if (flag == WR) {
  priv->w_idx = (priv->w_idx + 1) % BUFSIZE;
        /* Save it to buffer */
        if (priv->w_idx == priv->r_idx){
            /* Adjust read index since buffer is full */
            /* Keep the latest one and drop the oldest one */
            priv->r_idx = (priv->r_idx + 1) % BUFSIZE;
   //   printf("debug : write buffer, is full...\n");
        }
        
  priv->buffer[priv->w_idx] = *data;
}
else{
        if ((priv->r_idx == priv->w_idx))
   // printf("debug : read buffer, is empty...\n");
   return 0;
        else{
   priv->r_idx = (priv->r_idx + 1) % BUFSIZE;
            *data= priv->buffer[priv->r_idx];
  }
}
return priv->w_idx-priv->r_idx + 1;
}

/****************************************************************************

*初始化DMA

***************************************************************************/
void InitUART1_TXDMA(void)
{
*pDMA9_START_ADDR =  t_buffer;
*pDMA9_X_COUNT = 50;
*pDMA9_X_MODIFY = 0x1;
*pDMA9_CONFIG = WNR |DI_EN |WDSIZE_8  | SYNC  |FLOW;
ssync();
}

/***************************************************************************

*使能DMA

***************************************************************************/
void ENDMA (void)
{
*pDMA9_CONFIG |=0x1;
ssync();
}

/********************************************************************************

*中断函数

*********************************************************************************/
void InitInterrupts(void)
{
ssync();
*pUART1_IER_SET = 0x01;
*pSIC_IMASK1 = 0x200;
ssync();
register_handler(ik_ivg10, UART1_RX_ISR);
ssync();

}
/**********************************************************************************

*中断初始化

************************************************************************************/
EX_INTERRUPT_HANDLER(UART1_RX_ISR)
{
while(*pUART1_LSR&0x1)
{
  unsigned char tmp = *pUART1_RBR;
  fifoctl(&g_rs485_priv, &tmp, WR);
}
}


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/5/13 11:18:32
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你通过VDSP上的寄存器菜单,找到你当前使用的DMA,看一下当DMA使能后,他的状态是否为DONE,如果没有,说明DMA没有完成数据搬运,或者没有搬运,你的串口就收不到数据。也可以测量一下接口是否有数据的波形。若没有,仔细看一下代码哪配错了


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/5/14 23:34:43
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159204 Call, 1 Queries, Processed in 0.015625 second(s),