📄 uart.c
字号:
//========================================================================
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================================
//========================================================================
// Filename: UART.c
// Author: Lianshu Mou (email: Lianshu@sunnorth.com.cn)
// Date: 2004/08/05
// Description:
//
// Reference:
// Revision:
// 2004/08/05 First version
//========================================================================
#include "Spmc70_regs.h"
#include "mcMACRO.h"
#include "Queue.h"
unsigned int RXD_Buffer[50];
FIFO_QUEUE RXD_Data_Buffer =
{
RXD_Buffer,
RXD_Buffer + sizeof(RXD_Buffer) - 1,
RXD_Buffer,
RXD_Buffer
};
unsigned int Data_Buffer[6];
int RXD_Head = 0;
int NEW_BMP_flag = 0;
int NEW_TXT_flag = 0;
void Daly_Time(int Time);
//****************************************************************************************************
// UART_IRQ中断服务 UART_IRQ
// 设计者: 牟联树
// 描 述: 串行通信中断服务
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
unsigned int Temp,Data_Temp;
int i;
if(P_UART_Status->B.UARTRIF) //判断是接收还是发关中断
{ //接收中断
P_UART_Status->B.UARTRIF = 1;
Temp = P_UART_RxBuf->W;
Data_Temp = Data_Buffer[0]; //数据队列,指令缓冲区
for(i=0;i<5;i++)
Data_Buffer[i] = Data_Buffer[i+1];
Data_Buffer[5] = Temp;
switch(RXD_Head)
{
case 0: if((Data_Buffer[0] == '$')&&(Data_Buffer[1] == 'B')&&(Data_Buffer[2] == 'M')\
&&(Data_Buffer[3] == 'P')&&(Data_Buffer[4] == 0xd)&&(Data_Buffer[5] == 0xa))
{ //图形数据开始,图形数据接收初始化
NEW_BMP_flag = 1;
RXD_Head = 2;
FIFO_Reset_Queue(&RXD_Data_Buffer);
}
else if((Data_Buffer[0] == '$')&&(Data_Buffer[1] == 'T')&&(Data_Buffer[2] == 'X')\
&&(Data_Buffer[3] == 'T')&&(Data_Buffer[4] == 0xd)&&(Data_Buffer[5] == 0xa))
{ //文本文件开始,文本数据接收初始化
NEW_TXT_flag = 1;
RXD_Head = 1;
for(i=0;i<6;i++)
Data_Buffer[i] = 0;
Data_Temp = 0;
FIFO_Reset_Queue(&RXD_Data_Buffer);
}
break;
case 1: if(NEW_TXT_flag > 0)
{ //接收字符串数据(字符串)
if(Data_Temp >= ' ') FIFO_Push_Queue(&RXD_Data_Buffer,Data_Temp);
else if((Data_Temp == 0xd)&&(Data_Buffer[0] == 0xa))
FIFO_Push_Queue(&RXD_Data_Buffer,0xff); //换行符
}
break;
case 2: if((Data_Temp == '0')&&(Data_Buffer[0] == 'x'))
{ //接收BMP图档数据(字符串)
if(Data_Buffer[1] >= 'A') Temp = Data_Buffer[1] - '7';
else Temp = Data_Buffer[1] - '0';
Temp = (Temp << 4)&0xf0;
if(Data_Buffer[2] >= 'A') Temp |= Data_Buffer[2] - '7';
else Temp |= Data_Buffer[2] - '0';
FIFO_Push_Queue(&RXD_Data_Buffer,Temp);
}
break;
default: break;
}
if((Data_Buffer[0] == '$')&&(Data_Buffer[1] == 'E')&&(Data_Buffer[2] == 'N')\
&&(Data_Buffer[3] == 'D')&&(Data_Buffer[4] == 0xd)&&(Data_Buffer[5] == 0xa))
{ //传输结束命令
NEW_BMP_flag = 0;
NEW_TXT_flag = 0;
RXD_Head = 0;
}
}
}
//=============================================================
// ----Function: void UART_Init(void);
// -Description: 系统定时服务的分中断处理函数
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
void UART_Init(void)
{
P_IOA_Dir->B.bit12 = 0;
P_IOA_Attrib->B.bit12 = 1;
P_UART_Ctrl->W = 0;
P_UART_Ctrl->B.UARTREN = 1;
P_UART_Ctrl->B.UARTRIEN = 1;
P_UART_BaudRateH->W = 0xff;
P_UART_BaudRateL->W = 0xe6;
FIFO_Reset_Queue(&RXD_Data_Buffer);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -