?? tcuart.c
字號:
/** @file tcuart.c
* @brief LPC2200 UARTn驅動程序
* @Notice 采用中斷方式, 如有問題請聯系作者
* @Author Mars.zhu@hotmail.com 2007-7-6 17:03
*/
#include "option.h"
#include "tcuart.h"
#include "Sermem.h"
/** @func UART0_Handle
* @brief 串口0中斷服務程序
*/
static void
UART0_Handle(void)
{
uint8 i, dat;
uint8 bak;
bak = U0IIR;
switch (bak) {
case 0xC1:
case 0x01: { // 無中斷
for (i=0; i<1; i++) {
if (UartGetc(0, &dat) == 0) U0THR = dat;
else break;
}
break;
}
case 0x00: { // MSR, UART0無
break;
}
case 0x06: { // LSR
i = U0LSR;
break;
}
case 0xC4:
case 0x04: // 接收準備好
case 0xCC:
case 0x0C: { // 接收超時
while (U0LSR & UnLSR_RDR) {
dat = U0RBR;
UartPutc(0, dat);
}
break;
}
case 0x02:
case 0xC2: { // 發送寄存器空
if ((U0LSR & UnLSR_THE) == 0)
break;
for (i=0; i<16; i++) {
if (UartGetc(0, &dat) == 0) U0THR = dat;
else break;
}
break;
}
default:
break;
}
VICSoftIntClr = 1 << UART0_NO;
}
/** @func UART1_Handle
* @brief 串口1中斷服務程序
*/
static void
UART1_Handle(void)
{
uint8 i, dat;
uint8 bak;
bak = U1IIR;
switch (bak) {
case 0xC1:
case 0x01: { // 無中斷
for (i=0; i<1; i++) {
if (UartGetc(1, &dat) == 0) U1THR = dat;
else break;
}
break;
}
case 0x00: { // MSR, UART0無
i = U1MSR;
break;
}
case 0x06: { // LSR
i = U1LSR;
break;
}
case 0xC4:
case 0x04: // 接收準備好
case 0xCC:
case 0x0C: { // 接收超時
while (U1LSR & UnLSR_RDR) {
dat = U1RBR;
UartPutc(1, dat);
}
break;
}
case 0x02:
case 0xC2: { // 發送寄存器空
if ((U1LSR & UnLSR_THE) == 0)
break;
for (i=0; i<16; i++) {
if (UartGetc(1, &dat) == 0) U1THR = dat;
else break;
}
break;
}
default:
break;
}
VICSoftIntClr = 1 << UART1_NO;
}
/** @func UARTn_Init()
* @brief 實現串口初始化
* @param fd 串口號
* termios 串口數據結構
* @Retval D_OK 成功
* D_ERR 錯誤
*/
D_Result
UARTn_Init(uint8 fd, S_Termios* tios_p)
{
uint8 bak;
uint16 baud;
switch (tios_p->c_cflag & CS_MASK) { // 設置字長
case CS5: bak = 0; break;
case CS6: bak = 1; break;
case CS7: bak = 2; break;
case CS8: bak = 3; break;
default: return D_ERR;
}
if (tios_p->c_cflag & CSTOPB) // 判斷是否為2位停止位
bak |= 0x04;
if (tios_p->c_cflag & PARENB) { // 使能校驗位
bak |= 0x08;
if (tios_p->c_cflag & PARODD)
bak |= 0 << 4; // 奇校驗
else
bak |= 1 << 4; // 偶校驗
}
baud = ((Fpclk>>4)/tios_p->c_baud);
switch (fd) {
case 0: {
/** Set UART0 Pin*/
PINSEL0 = (PINSEL0 & P000_CLR_BITS & P001_CLR_BITS) | P000_FOR_TXD0 | P001_FOR_RXD0;
/** Set baud*/
U0LCR = 0x80;
U0DLM = baud >> 8;
U0DLL = baud & 0xFF;
/** Set mode*/
U0LCR = bak;
U0IER = UnIER_RINT_EN | UnIER_TINT_EN;
switch (tios_p->c_FIFO_data) {
case 1: {
U0FCR |= 7 | (0x00 << 6);
break;
}
case 4: {
U0FCR |= 7 | (0x01 << 6);
break;
}
case 8: {
U0FCR |= 7 | (0x02 << 6);
break;
}
case 14: {
U0FCR |= 7 | (0x03 << 6);
break;
}
default:
break;
}
pISR_UART0 = (unsigned)UART0_Handle;
VicEnable(UART0_NO);
return D_OK;
}
case 1: {
/** Set UART1 Pin*/
PINSEL0 = (PINSEL0 & P008_CLR_BITS & P009_CLR_BITS) | P008_FOR_TXD1 | P009_FOR_RXD1;
/** Set baud*/
U1LCR = 0x80;
U1DLM = baud >> 8;
U1DLL = baud & 0xFF;
/** Set mode*/
U1LCR = bak;
U1IER = UnIER_RINT_EN | UnIER_TINT_EN;
switch (tios_p->c_FIFO_data) {
case 1: {
U1FCR |= 7 | (0x00 << 6);
break;
}
case 4: {
U1FCR |= 7 | (0x01 << 6);
break;
}
case 8: {
U1FCR |= 7 | (0x02 << 6);
break;
}
case 14: {
U1FCR |= 7 | (0x03 << 6);
break;
}
default:
break;
}
pISR_UART1 = (unsigned)UART1_Handle;
VicEnable(UART1_NO);
return D_OK;
}
default:
return D_ERR;
}
}
/** @func __UART_Flush
* @brief 手動激活發送中斷, 內部函數
*/
void
__UART_Flush(uint8 fd)
{
switch (fd) {
case 0:
VICSoftInt = 1 << UART0_NO;
return;
case 1:
VICSoftInt = 1 << UART1_NO;
return;
default:
return;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -