📄 uart1.c
字号:
/****************************************Copyright (c)**************************************************
**
**
**
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: Uart1.c
**创 建 人: 李功周
**最后修改日期: 2008年10月31日
**描 述: Uart API 函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 李功周
** 版 本: v1.0
** 日 期: 2008年10月31日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
*/
#include <LPC2103.H>
#include "../confing/config.h"
#include "../SPK/SPK.h"
#define OutTime 1 //读数据时的等待时间
#define ReadBuffLen 64 //接收缓冲长度
volatile unsigned char Uart1Sending = 0 ;
volatile int Uart1ReaddataLen = 0 ; //数据长度
volatile unsigned char Uart1Readdata[ReadBuffLen]; //接收缓冲
volatile int Uart1InAddr = 0 ; //接收地址
volatile int Uart1OutAddr = 0 ; //读地址
volatile unsigned char Uart1OverData; //益出数据
volatile unsigned char Uart1BuffOver = 0; //益出标志
/****************************************************************************
* 名称:UART1_Exception()
* 功能:UART1中断服务程序。
* 入口参数:无
* 出口参数:无
* 说明:
****************************************************************************/
void __irq UART1_Exception(void)
{
unsigned char IIR;
while(((IIR=U1IIR) & 0x01) == 0)
{
switch (IIR & 0x0e)
{
case 0x00: // Modem状态变化中断
break;
case 0x02://发送中断
Uart1Sending = 0 ;
break;
case 0x04: // 接收数据可用
// SpkOnTime(0);
if(Uart1BuffOver)
{
Uart1OverData = U1RBR ;
}
else
{
Uart1Readdata[Uart1InAddr++] = U1RBR;
Uart1ReaddataLen++;
if(Uart1InAddr == ReadBuffLen)
{
Uart1InAddr = 0;
}
if(Uart1InAddr == Uart1OutAddr)
{
Uart1BuffOver = 1;
}
}
break;
case 0x06: // 接收线状态
//SpkOnTime(100);
IIR = U1LSR;
case 0x0c:
//SpkOnTime(100); // 字符超时指示
IIR=U0RBR; // 禁止接收及字符超时中断
break;
default : IIR=U0RBR;
//SpkOnTime(100);
break;
}
}
VICVectAddr = 0; // 通知中断控制器中断结束
}
/****************************************************************************
* 名 称:Uart1_SendByte
* 功 能:Uart0发送一个字节。
* 入口参数:Data 发送的数据
* 出口参数:无
*****************************************************************************/
void Uart1_SendByte(unsigned char Data)
{
while(Uart1Sending);
U1THR=Data;
Uart1Sending = 1 ;
}
/****************************************************************************
* 名 称:Uart1_SendStr
* 功 能:Uart0发送一个字符串。
* 入口参数:Data 发送的数据,
len 发送的长度
* 出口参数:无
*****************************************************************************/
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
* 功 能:接收字符串。
* 入口参数:Data 接收到的数据
overtime 超时时间 0 直接返回 负数一直等待
* 出口参数:1 有数据, 0 没有数据
*****************************************************************************/
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
* 功 能:接收一个字节。
* 入口参数:Data 接收到的数据
len 要接收的数据长度
overtime 超时时间 0 直接返回 负数一直等待
* 出口参数:返回数据长度
*****************************************************************************/
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的状态。
* 入口参数:无
* 出口参数:返回数据长度
*****************************************************************************/
unsigned int Uart1_CheckBuff(void)
{
return Uart1ReaddataLen;
}
/****************************************************************************
* 名 称:ClearBuff()
* 功 能:清除buff数据。
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void Uart1_ClearBuff(void)
{
Uart1ReaddataLen = 0;
Uart1InAddr = 0 ;
Uart1OutAddr = 0 ;
Uart1BuffOver = 0 ;
}
/****************************************************************************
* 名 称:Uart1_Init
* 功 能:Uart0初始化。
* 入口参数:irq_enable =1 使用中断
uart_bps 波特率
Parity="NMS" 效验方式
* 出口参数:无
****************************************************************************/
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); //开UART中断
}
PINSEL0 = PINSEL0&(0xfff0ffff);
PINSEL0 = PINSEL0|(0x00050000);
U1LCR = 0x80; // 允许访问分频因子寄存器
Fdiv = (Fpclk / 16) / uart_bps; // 设置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
bak = 0;
bak = 3; //8位数据位 0->5 1->6 2->7 3->8
bak |= 0x00; //0->1位停止位 4->2
if(Parity=='N')
{
bak|=0x00; //0->无校验 8->有校验
bak|=0x00; //0->奇 0x10->偶 0x20->M 0x30->S
}
else if(Parity=='M')
{
bak|=0x08; //0->无校验 8->有校验
bak|=0x20; //0->奇 0x10->偶 0x20->M 0x30->S
}
else if(Parity=='S')
{
bak|=0x08; //0->无校验 8->有校验
bak|=0x30; //0->奇 0x10->偶 0x20->M 0x30->S
}
else
{
return 2;
}
U1LCR = bak; // 禁止访问分频因子寄存器
// 且设置为8,1,n
U1FCR = 0x07; // 使能FIFO,并设置触发点为1字节
bak=0;
bak|=0x01; // 允许RBR中断,即接收中断
bak|=0x02; // 允许THRE中断,即发送中断
U1IER = bak;
// 初始化FIFO
U1MCR = 0x00;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -