?? uart.c
字號:
#include "uart.h"
/***************************************************************************/
/* ======== UART_rset ======== */
/* Set a UART register,設置寄存器 */
/***************************************************************************/
void UART_rset(Int16 regnum,Int16 regval)
{
Int16 regindex, lcr;
/* Register index is determined by lower 3 bits and the target UART */
//regindex = regnum & 0x7;
// if (hUart == 1)
// regindex += 8;
/*是否為高位的寄存器*/
/* If regnum between 0x08 and 0x0F, set bit 7 of LCR to access register */
//if ((regnum & 0x18) == 0x8)
if((regnum >= 0x10) && (regnum <= 0x1e))
{
lcr = rget(TL_UART_LCR);
waitusec(1);
rset(TL_UART_LCR, lcr | 0x80);
waitusec(1);
rset(regnum, regval);
waitusec(1);
rset(TL_UART_LCR, lcr);
waitusec(1);
}
else
{
rset(regnum, regval);
waitusec(1);
}
}
/**********************************************************************/
/* ======== UART_rget ======== */
/* Get the value of a UART register,讀出寄存器的值 */
/**********************************************************************/
Int16 UART_rget(Int16 regnum)
{
Int16 regindex, returnval, lcr;
/* Register index is determined by lower 3 bits and the target UART */
//regindex = regnum & 0x7;
// if (hUart == 1)
// regindex += 8;
/* If regnum between 0x08 and 0x0F, set bit 7 of LCR to access register */
//if ((regnum & 0x18) == 0x8)
if((regnum >= 0x10) && (regnum <= 0x1e))
{
lcr = rget(TL_UART_LCR);
rset(TL_UART_LCR, lcr | 0x80);
returnval = rget(regnum);
rset(TL_UART_LCR, lcr);
}
else
{
returnval = rget(regnum);
}
return returnval;
}
/**************************************************************************/
/* ======== UART_open ======== */
/* Initialize UART and return handle */
/* 描述:打開相應的串口,并進行相應的配置 */
/* 輸入參數: */
/* devid: 選擇UART的通路 */
/* baudrate: 選擇正確的波待率 */
/* config: 其它配置其它的參數組 */
/**************************************************************************/
void UART_open(Int16 baudrate,UART_Config *config)
{
// UART_Handle hUart;
//Int16 dl;
Int8 dl,test;
/* Assign handle */
// hUart = devid;
/* Set registers based on config structure */
/*設置MCR*/
UART_rset(TL_UART_MCR,config -> regs[3]);
//test = UART_rget(TL_UART_MCR);
/*將EFR寄存器的第4位關閉*/
dl = UART_rget(TL_UART_EFR);
UART_rset(TL_UART_EFR, dl & 0xEF);
//test = UART_rget(TL_UART_EFR);
/*設置串口的MCR*/
UART_rset(TL_UART_MCR, config -> regs[3]);
//test = UART_rget(TL_UART_MCR);
/*設置串口的IER*/
UART_rset(TL_UART_IER, config -> regs[0]);
//test = UART_rget(TL_UART_IER);
/*設置串口的FCR*/
UART_rset(TL_UART_FCR, config -> regs[1]);
//test = UART_rget(TL_UART_FCR);
/*設置串口的LCR*/
UART_rset(TL_UART_LCR, config -> regs[2]);
//test = UART_rget(TL_UART_LCR);
/* Set up baud divisor clock,設置波待率 */
dl = UART_rget(TL_UART_MCR);
if((dl & 0x80)==0x80)
{
baudrate = (baudrate/4);
}
//UART_rset(TL_UART_DLL, baudrate & 0xff);
UART_rset(TL_UART_DLL, 0x50);
dl = UART_rget(TL_UART_DLL);
//UART_rset(TL_UART_DLH, (baudrate >> 8) & 0xff);
UART_rset(TL_UART_DLH, 0x00);
dl = UART_rget(TL_UART_DLH);
/* Clear any outstanding receive characters,清空接收寄存器 */
UART_rget(TL_UART_RBR);
// return hUart;
}
/*********************************************************************/
/* ======== UART_getChar ======== */
/* Get one character of data from the UART,讀取數據 */
/*********************************************************************/
Int16 UART_getChar(void)
{
Int16 status;
while(1)
{
status = UART_rget(TL_UART_LSR);
if ((status & 1) != 0) // DR
break;
}
return
UART_rget(TL_UART_RBR);
}
/*********************************************************************/
/* ======== UART_putChar ======== */
/* Send one character of data to the UART,發送一個數據 */
/*********************************************************************/
void UART_putChar(Uint16 data)
{
Int16 status;
while(1)
{
status = UART_rget(TL_UART_LSR);
if ((status & 0x20) != 0) // THRE
break;
}
// SEEDDM642_waitusec(3);
UART_rset(TL_UART_THR, data);
}
void UART_puts(const char *s)
{
while (*s) {
UART_putChar(*s++);
}
}
/* Spin in a delay loop for delay iterations */
void wait(Uint32 delay)
{
volatile Uint32 i, n;
n = 0;
for (i = 0; i < delay; i++)
{
n = n + 1;
}
}
/* Spin in a delay loop for delay microseconds */
void waitusec(Uint32 delay)
{
wait(delay * 21);
}
Uint8 rget(Int16 regnum)
{
Uint8 *pdata;
/* Return lower 8 bits of register */
pdata = (Uint8 *)(UART_BASE + regnum);
return (*pdata & 0xff);
}
void rset(Int16 regnum, Uint8 regval)
{
Uint8 *pdata;
/* Write lower 8 bits of register */
pdata = (Uint8 *)(UART_BASE + regnum);
*pdata = (regval & 0xff);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -