Chinaunix首页 | 论坛 | 博客
  • 博客访问: 367870
  • 博文数量: 53
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1143
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-14 11:53
文章分类

全部博文(53)

文章存档

2011年(1)

2008年(52)

我的朋友

分类: C/C++

2008-08-26 12:39:33

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");
}
阅读(4587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~