📄 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_UART_rset(hUart, SEEDDM642_UART_LCR, lcr | 0x80);
SEEDDM642_rset(regindex, regval);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr);
}
else
{
SEEDDM642_rset(regindex, regval);
}
}
/**********************************************************************/
/* ======== 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;
/* Assign handle */
hUart = devid;
/* Set registers based on config structure */
/*设置串口的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]);
/*设置串口的MCR*/
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_MCR, config -> regs[3]);
/* Set up baud divisor clock,设置波待率 */
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_DLL, baudrate & 0xff);
SEEDDM642_UART_rset(hUart, SEEDDM642_UART_DLH, (baudrate >> 8) & 0xff);
/* 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_UART_rset(hUart, SEEDDM642_UART_THR, data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -