?? seeddm642_uart.c
字號:
/**************************************************************************/
/* Copyright 2003 by SEED. */
/* All rights reserved. Property of SEED. */
/**************************************************************************/
/*
* ======== seeddm642_uart.c ========
* UART module for the SEEDDM642
*/
#include <csl.h>
#include "seeddm642.h"
#include "seeddm642_uart.h"
/***************************************************************************/
/* ======== SEEDDM642_UART_rset ======== */
/* Set a UART register,設置寄存器 */
/***************************************************************************/
void SEEDDM642_UART_rset(SEEDDM642_UART_Handle hUart,
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)
{
lcr = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LCR);
SEEDDM642_waitusec(1);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr | 0x80);
SEEDDM642_waitusec(1);
SEEDDM642_rset(regindex, regval);
SEEDDM642_waitusec(1);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr);
SEEDDM642_waitusec(1);
}
else
{
SEEDDM642_rset(regindex, regval);
SEEDDM642_waitusec(1);
}
}
/**********************************************************************/
/* ======== SEEDDM642_UART_rget ======== */
/* Get the value of a UART register,讀出寄存器的值 */
/**********************************************************************/
Int16 SEEDDM642_UART_rget(SEEDDM642_UART_Handle hUart,
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)
{
lcr = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LCR);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr | 0x80);
returnval = SEEDDM642_rget(regindex);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr);
}
else
{
returnval = SEEDDM642_rget(regindex);
}
return returnval;
}
/**************************************************************************/
/* ======== SEEDDM642_UART_open ======== */
/* Initialize UART and return handle */
/* 描述:打開相應的串口,并進行相應的配置 */
/* 輸入參數: */
/* devid: 選擇UART的通路 */
/* baudrate: 選擇正確的波待率 */
/* config: 其它配置其它的參數組 */
/**************************************************************************/
SEEDDM642_UART_Handle SEEDDM642_UART_open(Int16 devid,
Int16 baudrate,
SEEDDM642_UART_Config *config)
{
SEEDDM642_UART_Handle hUart;
Int16 dl;
Int16 ss;
/* Assign handle */
hUart = devid;
/* Set registers based on config structure */
/*設置MCR*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_MCR,config -> regs[3]);
ss=SEEDDM642_UART_rget(hUart, SEEDDM642_UART_MCR);
/*將EFR寄存器的第4位關閉*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_EFR, dl);
/*設置串口的MCR*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_MCR, config -> regs[3]);
/*設置串口的IER*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_IER, config -> regs[0]);
/*設置串口的FCR*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_FCR, config -> regs[1]);
/*設置串口的LCR*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, config -> regs[2]);
/* Set up baud divisor clock,設置波待率 */
dl = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_MCR);
if((dl & 0x80)==0x80)
{
baudrate = (baudrate/4);
}
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_DLL, baudrate & 0xff);
dl = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_DLL);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_DLH, (baudrate >> 8) & 0xff);
dl = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_DLH);
/* Clear any outstanding receive characters,清空接收寄存器 */
SEEDDM642_UART_rget(hUart, SEEDDM642_UART_RBR);
return hUart;
}
/*********************************************************************/
/* ======== SEEDDM642_UART_getChar ======== */
/* Get one character of data from the UART,讀取數據 */
/*********************************************************************/
Int16 SEEDDM642_UART_getChar(SEEDDM642_UART_Handle hUart)
{
Int16 status;
while(1)
{
status = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LSR);
if ((status & 1) != 0) // DR
break;
}
return SEEDDM642_UART_rget(hUart, SEEDDM642_UART_RBR);
}
/*********************************************************************/
/* ======== SEEDDM642_UART_putChar ======== */
/* Send one character of data to the UART,發送一個數據 */
/*********************************************************************/
void SEEDDM642_UART_putChar(SEEDDM642_UART_Handle hUart, Uint16 data)
{
Int16 status;
while(1)
{
status = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LSR);
if ((status & 0x20) != 0) // THRE
break;
}
// SEEDDM642_waitusec(3);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_THR, data);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -