file xxUart.h
#ifndef INCUART
#define INCUART
#include
#include
#include "stdio.h"
#define REG_DELT 1 /* 基本地址偏移值 */
#define UART_BASE_ADRS (0x10000000) /* poe模块串口的基本地址 */
#define UART_FREQ_MHZ 1.8432
#define BAUD_RATE 19200
#define UART_DIVISOR (unsigned int)(UART_FREQ_MHZ*1000000/16/BAUD_RATE) /* 分频系 */
#define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*0) /* 数据接受寄存器 */
#define UART_THR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*0) /* 数据发送寄存器 */
#define UART_DLL *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*0) /* 时钟高位寄存器 */
#define UART_DLM *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*1) /* 时钟低位寄存器 */
#define UART_IER *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*1) /* 中断使能寄存器 */
#define UART_ISR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*2) /* 中断状态寄存器 */
#define UART_FCR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*2) /* FIFO控制寄存器 */
#define UART_LCR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*3) /* 线控制寄存器 */
#define UART_MCR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*4) /* modem控制寄存器 */
#define UART_LSR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*5) /* 线状态寄存器 */
#define UART_MSR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*6) /* modem状态寄存器 */
#define UART_SPR *(volatile unsigned char *)(UART_BASE_ADRS + REG_DELT*7) /* Scratchpad寄存器 */
/* Register offsets from base address */
#define RBR 0x00 /* Receive Holding Register (R/O) */
#define THR 0x00 /* Transmit Holding Register (W/O)*/
#define DLL 0x00 /* Divisor Latch Low */
#define IER 0x01 /* Interrupt Enable Register */
#define DLM 0x01 /* Divisor Latch Middle */
#define IIR 0x02 /* Interupt identification Register (R/O) */
#define FCR 0x02 /* FIFO Control register (W/O) */
#define LCR 0x03 /* Line Control Register */
#define MCR 0x04 /* Modem Control Register */
#define LSR 0x05 /* Line Status register */
#define MSR 0x06 /* Modem Status Register */
#define SCR 0x07 /* Scratchpad Register */
//#define BAUD_LO(baud) ((XTAL/(16*baud)) & 0xFF)
//#define BAUD_HI(baud) (((XTAL/(16*baud)) & 0xFF00) >> 8)
/* Line Control Register values */
#define CHAR_LEN_5 0x00
#define CHAR_LEN_6 0x01
#define CHAR_LEN_7 0x02
#define CHAR_LEN_8 0x03
#define LCR_STB 0x04 /* Stop bit control */
#define ONE_STOP 0x00 /* One stop bit! */
#define LCR_PEN 0x08 /* Parity Enable */
#define PARITY_NONE 0x00
#define LCR_EPS 0x10 /* Even Parity Select */
#define LCR_SP 0x20 /* Force Parity */
#define LCR_SBRK 0x40 /* Start Break */
#define LCR_DLAB 0x80 /* Divisor Latch Access Bit */
#define DLAB LCR_DLAB
/* Line Status Register */
#define LSR_DR 0x01 /* Data Ready */
#define RxCHAR_AVAIL LSR_DR
#define LSR_OE 0x02 /* Overrun Error */
#define LSR_PE 0x04 /* Parity Error */
#define LSR_FE 0x08 /* Framing Error */
#define LSR_BI 0x10 /* Received Break Signal */
#define LSR_THRE 0x20 /* Transmit Holding Register Empty */
#define LSR_TEMT 0x40 /* THR and FIFO empty */
#define LSR_FERR 0x80 /* Parity, Framing error or break in FIFO */
/* Interrupt Identification Register */
#define IIR_IP 0x01 /* Interrupt Pending */
#define IIR_ID 0x0E /* Interrupt source mask */
#define IIR_RLS 0x06 /* Rx Line Status Int */
#define Rx_INT IIR_RLS
#define IIR_RDA 0x04 /* Rx Data Available */
#define RxFIFO_INT IIR_RDA
#define IIR_THRE 0x02 /* THR Empty */
#define TxFIFO_INT IIR_THRE
#define IIR_MSTAT 0x00 /* Modem Status Register Int */
#define IIR_TIMEOUT 0x0C /* Rx Data Timeout */
/* Interrupt Enable Register */
#define IER_ERDAI 0x01 /* Enable Rx Data Available Int */
#define RxFIFO_BIT IER_ERDAI
#define IER_ETHREI 0x02 /* Enable THR Empty Int */
#define TxFIFO_BIT IER_ETHREI
#define IER_ELSI 0x04 /* Enable Line Status Int */
#define Rx_BIT IER_ELSI
#define IER_EMSI 0x08 /* Enable Modem Status Int */
/* Modem Control Register */
#define MCR_DTR 0x01 /* state of DTR output */
#define DTR MCR_DTR
#define MCR_RTS 0x02 /* state of RTS output */
#define MCR_OUT1 0x04 /* UNUSED in ST16552 */
#define MCR_INT 0x08 /* Int Mode */
#define MCR_LOOP 0x10 /* Enable Loopback mode */
/* Modem Status Register */
#define MSR_DCTS 0x01 /* change in CTS */
#define MSR_DDSR 0x02 /* change in DSR */
#define MSR_TERI 0x04 /* change in RI */
#define MSR_DDCD 0x08 /* change in DCD */
#define MSR_CTS 0x10 /* state of CTS input */
#define MSR_DSR 0x20 /* state of DSR input */
#define MSR_RI 0x40 /* state of RI input */
#define MSR_DCD 0x80 /* state of DCD input */
/* FIFO Control Register */
#define FCR_EN 0x01 /* FIFO Enable */
#define FIFO_ENABLE FCR_EN
#define FCR_RXCLR 0x02 /* Rx FIFO Clear */
#define RxCLEAR FCR_RXCLR
#define FCR_TXCLR 0x04 /* Tx FIFO Clear */
#define TxCLEAR FCR_TXCLR
#define FCR_DMA 0x08 /* FIFO Mode Control */
#define FCR_RXTRIG_L 0x40 /* FIFO Trigger level Low */
#define FCR_RXTRIG_H 0x80 /* FIFO Trigger level High */
/* poe接口函数*/
void uart_init(void);
void uart_send(unsigned char *str, int num);
void uart_send_byte(unsigned char *str, int num);
int uart_read(unsigned char *str, int num);
int uart_read_byte(unsigned char *str, int num);
#endif
/*****************************************************************************/
file xxUart.c
#include "xxUart.h"
/*****************************************************************************
函 数 名 : uart_init
功能描述 : 初始化poe模块的uart接口
输入参数 : 无
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2008年8月4日
作 者 : huangxb
修改内容 : 新生成函数
*****************************************************************************/
void uart_init(void)
{
UART_LCR = CHAR_LEN_8 | ONE_STOP | PARITY_NONE; /* 设置 8位数据位,1位停止位,无校验位 */
UART_LCR |= LCR_DLAB; /* 时钟分频器锁存使能 */
UART_DLL = UART_DIVISOR & 0xff; /* 设置分频器的低8位 */
UART_DLM = UART_DIVISOR >> 8; /* 设置分频器的高8位 */
UART_LCR &= ~(LCR_DLAB); /* 禁止时钟分频器锁存 */
UART_FCR = RxCLEAR | TxCLEAR | FIFO_ENABLE; /* 清收发数据,FIFO使能 */
UART_MCR = 0x00; /* 禁止modem相关 */
UART_IER = 0x00; /* 禁止中断 */
}
/*****************************************************************************
函 数 名 : uart_send_byte
功能描述 : uart接口发送数据,一个字节一个的发
输入参数 : 无
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2008年8月4日
作 者 : huangxb
修改内容 : 新生成函数
*****************************************************************************/
void uart_send_byte(unsigned char *str, int num)
{
int ix = 0;
unsigned char *pTx = str;
while (txNum < num)
{
/* 等待发送为空 */
while (!(UART_LSR & LSR_TEMT))
;
UART_THR = *(pTx + txNum); /* 发送数据 */
printf("send data %02x\n", *(pTx + txNum));
txNum++;
}
}
/*****************************************************************************
函 数 名 : uart_read_byte
功能描述 : uart接口接收数据,一个字节一个的收
输入参数 : 无
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2008年8月4日
作 者 : huangxb
修改内容 : 新生成函数
*****************************************************************************/
int uart_read_byte(unsigned char *str, int num)
{
int rxNum = 0;
unsigned char *pRx = str;
while (rxNum < num)
{
/* 数据不就续则持续等待 */
while (!(UART_LSR & LSR_DR))
;
*(pRx + rxNum) = UART_RHR; /* 接收数据 */
printf("read data %02x\n", *(pRx + rxNum));
rxNum++;
}
return rxNum;
}
/*****************************************************************************
函 数 名 : uart_send
功能描述 : uart接口发送数据
输入参数 : 无
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2008年8月4日
作 者 : huangxb
修改内容 : 新生成函数
*****************************************************************************/
void uart_send(unsigned char *str, int num)
{
int ix = 0;
unsigned char *pTx = str;
/* 等待发送为空 */
while (!(UART_LSR & LSR_TEMT))
;
while (txNum < num)
{
UART_THR = *(pTx + txNum); /* 发送数据 */
printf("send data %02x\n", *(pTx + txNum));
txNum++;
}
}
/*****************************************************************************
函 数 名 : uart_read
功能描述 : uart接口接收数据
输入参数 : 无
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2008年8月4日
作 者 : huangxb
修改内容 : 新生成函数
*****************************************************************************/
int uart_read(unsigned char *str, int num)
{
int rxNum = 0;
unsigned char *pRx = str;
/* 数据不就续则持续等待 */
while (!(UART_LSR & LSR_DR))
;
while (rxNum < num)
{
*(pRx + rxNum) = UART_RHR; /* 接收数据 */
printf("read data %02x\n", *(pRx + rxNum));
rxNum++;
}
return rxNum;
}
/*****************************************************************************
函 数 名 : poeUartTest
功能描述 :
输入参数 : 无
输出参数 : 无
返 回 值 :
修改历史 :
1.日 期 : 2008年8月13日
作 者 : huangxb
修改内容 : 新生成函数
*****************************************************************************/
void poeUartTest (void)
{
unsigned char tx_buf[15];
unsigned char rx_buf[15];
/* 填充buf中的数据 */
tx_buf[0] = 0x02;
tx_buf[1] = 0x02;
tx_buf[2] = 0x07;
tx_buf[3] = 0x3D;
tx_buf[4] = 0x00;
tx_buf[5] = 0x00;
tx_buf[6] = 0x00;
tx_buf[7] = 0x00;
tx_buf[8] = 0x00;
tx_buf[8] = 0x00;
tx_buf[10] = 0x00;
tx_buf[11] = 0x00;
tx_buf[12] = 0x00;
tx_buf[13] = 0x00;
tx_buf[14] = 0x48;
printf("Uart Test begin\n");
uart_init();
printf("begin send char \n");
uart_send(tx_buf, 15);
printf("end send char \n");
printf("begin read char \n");
uart_read(rx_buf, 15);
printf("end read char \n");
printf("Uart Test end\n");
}