板子是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);
}
}