?? uart1.c
字號(hào):
/****************************************Copyright (c)**************************************************
**
**
**
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: Uart1.c
**創(chuàng) 建 人: 李功周
**最后修改日期: 2008年10月31日
**描 述: Uart API 函數(shù)
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 李功周
** 版 本: v1.0
** 日 期: 2008年10月31日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
*/
#include <LPC2103.H>
#include "../confing/config.h"
#include "../SPK/SPK.h"
#define OutTime 1 //讀數(shù)據(jù)時(shí)的等待時(shí)間
#define ReadBuffLen 64 //接收緩沖長(zhǎng)度
volatile unsigned char Uart1Sending = 0 ;
volatile int Uart1ReaddataLen = 0 ; //數(shù)據(jù)長(zhǎng)度
volatile unsigned char Uart1Readdata[ReadBuffLen]; //接收緩沖
volatile int Uart1InAddr = 0 ; //接收地址
volatile int Uart1OutAddr = 0 ; //讀地址
volatile unsigned char Uart1OverData; //益出數(shù)據(jù)
volatile unsigned char Uart1BuffOver = 0; //益出標(biāo)志
/****************************************************************************
* 名稱:UART1_Exception()
* 功能:UART1中斷服務(wù)程序。
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō)明:
****************************************************************************/
void __irq UART1_Exception(void)
{
unsigned char IIR;
while(((IIR=U1IIR) & 0x01) == 0)
{
switch (IIR & 0x0e)
{
case 0x00: // Modem狀態(tài)變化中斷
break;
case 0x02://發(fā)送中斷
Uart1Sending = 0 ;
break;
case 0x04: // 接收數(shù)據(jù)可用
// SpkOnTime(0);
if(Uart1BuffOver)
{
Uart1OverData = U1RBR ;
}
else
{
Uart1Readdata[Uart1InAddr++] = U1RBR;
Uart1ReaddataLen++;
if(Uart1InAddr == ReadBuffLen)
{
Uart1InAddr = 0;
}
if(Uart1InAddr == Uart1OutAddr)
{
Uart1BuffOver = 1;
}
}
break;
case 0x06: // 接收線狀態(tài)
//SpkOnTime(100);
IIR = U1LSR;
case 0x0c:
//SpkOnTime(100); // 字符超時(shí)指示
IIR=U0RBR; // 禁止接收及字符超時(shí)中斷
break;
default : IIR=U0RBR;
//SpkOnTime(100);
break;
}
}
VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束
}
/****************************************************************************
* 名 稱:Uart1_SendByte
* 功 能:Uart0發(fā)送一個(gè)字節(jié)。
* 入口參數(shù):Data 發(fā)送的數(shù)據(jù)
* 出口參數(shù):無(wú)
*****************************************************************************/
void Uart1_SendByte(unsigned char Data)
{
while(Uart1Sending);
U1THR=Data;
Uart1Sending = 1 ;
}
/****************************************************************************
* 名 稱:Uart1_SendStr
* 功 能:Uart0發(fā)送一個(gè)字符串。
* 入口參數(shù):Data 發(fā)送的數(shù)據(jù),
len 發(fā)送的長(zhǎng)度
* 出口參數(shù):無(wú)
*****************************************************************************/
void Uart1_SendStr(unsigned char *Data,int len)
{
int i = 0;
for( i = 0 ; i < len ; i++ )
{
while(Uart1Sending);
U1THR=Data[i];
Uart1Sending = 1 ;
}
}
/****************************************************************************
* 名 稱:Uart1_ReadByte
* 功 能:接收字符串。
* 入口參數(shù):Data 接收到的數(shù)據(jù)
overtime 超時(shí)時(shí)間 0 直接返回 負(fù)數(shù)一直等待
* 出口參數(shù):1 有數(shù)據(jù), 0 沒(méi)有數(shù)據(jù)
*****************************************************************************/
unsigned char Uart1_ReadByte(unsigned char * Data,int overtime)
{
int i = 0;
int j = 0;
if(overtime==0)
{
if(Uart1ReaddataLen!=0)
{
goto Uart1_ReadByte1;
}
else
{
return 0;
}
}
if(overtime > 0)
{
i = 0;
while( i < overtime )
{
for( j = 0 ; j < 1010 ; j++ );
if(Uart1ReaddataLen!=0)
{
goto Uart1_ReadByte1;
}
i++;
}
if(i>=OutTime)
{
return 0;
}
}
else
{
while(Uart1ReaddataLen==0);
}
Uart1_ReadByte1:
*Data = Uart1Readdata[Uart1OutAddr++];
if(Uart1OutAddr>=ReadBuffLen)
{
Uart1OutAddr = 0;
}
Uart1BuffOver = 0 ;
Uart1ReaddataLen--;
return 1;
}
/****************************************************************************
* 名 稱:Uart1_ReadStr
* 功 能:接收一個(gè)字節(jié)。
* 入口參數(shù):Data 接收到的數(shù)據(jù)
len 要接收的數(shù)據(jù)長(zhǎng)度
overtime 超時(shí)時(shí)間 0 直接返回 負(fù)數(shù)一直等待
* 出口參數(shù):返回?cái)?shù)據(jù)長(zhǎng)度
*****************************************************************************/
int Uart1_ReadStr(unsigned char *Data,int len,int overtime)
{
int i;
i = 0 ;
while( i < len )
{
if(Uart1_ReadByte(&Data[i],overtime))
{
i++;
if(i==len)
{
return i ;
}
}
else
{
return i ;
}
}
return i;
}
/****************************************************************************
* 名 稱:CheckBuff
* 功 能:查詢buff的狀態(tài)。
* 入口參數(shù):無(wú)
* 出口參數(shù):返回?cái)?shù)據(jù)長(zhǎng)度
*****************************************************************************/
unsigned int Uart1_CheckBuff(void)
{
return Uart1ReaddataLen;
}
/****************************************************************************
* 名 稱:ClearBuff()
* 功 能:清除buff數(shù)據(jù)。
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
*****************************************************************************/
void Uart1_ClearBuff(void)
{
Uart1ReaddataLen = 0;
Uart1InAddr = 0 ;
Uart1OutAddr = 0 ;
Uart1BuffOver = 0 ;
}
/****************************************************************************
* 名 稱:Uart1_Init
* 功 能:Uart0初始化。
* 入口參數(shù):irq_enable =1 使用中斷
uart_bps 波特率
Parity="NMS" 效驗(yàn)方式
* 出口參數(shù):無(wú)
****************************************************************************/
int Uart1_Init(unsigned int irq_enable,unsigned int uart_bps,unsigned char Parity)
{
unsigned short Fdiv;
unsigned char bak;
if( (0==uart_bps)||(uart_bps>115200) )
{
return 1;
}
if(irq_enable)
{
VICIntSelect &= ~(1<<7); //uart1為IRQ中斷
VICVectCntl9 = 0x20|7; //uart1使用slot9
VICVectAddr9 = (unsigned int) UART1_Exception; //中斷入口程序
VICIntEnable |= (0x1<<7); //開(kāi)UART中斷
}
PINSEL0 = PINSEL0&(0xfff0ffff);
PINSEL0 = PINSEL0|(0x00050000);
U1LCR = 0x80; // 允許訪問(wèn)分頻因子寄存器
Fdiv = (Fpclk / 16) / uart_bps; // 設(shè)置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
bak = 0;
bak = 3; //8位數(shù)據(jù)位 0->5 1->6 2->7 3->8
bak |= 0x00; //0->1位停止位 4->2
if(Parity=='N')
{
bak|=0x00; //0->無(wú)校驗(yàn) 8->有校驗(yàn)
bak|=0x00; //0->奇 0x10->偶 0x20->M 0x30->S
}
else if(Parity=='M')
{
bak|=0x08; //0->無(wú)校驗(yàn) 8->有校驗(yàn)
bak|=0x20; //0->奇 0x10->偶 0x20->M 0x30->S
}
else if(Parity=='S')
{
bak|=0x08; //0->無(wú)校驗(yàn) 8->有校驗(yàn)
bak|=0x30; //0->奇 0x10->偶 0x20->M 0x30->S
}
else
{
return 2;
}
U1LCR = bak; // 禁止訪問(wèn)分頻因子寄存器
// 且設(shè)置為8,1,n
U1FCR = 0x07; // 使能FIFO,并設(shè)置觸發(fā)點(diǎn)為1字節(jié)
bak=0;
bak|=0x01; // 允許RBR中斷,即接收中斷
bak|=0x02; // 允許THRE中斷,即發(fā)送中斷
U1IER = bak;
// 初始化FIFO
U1MCR = 0x00;
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -