📄 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 "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Queue.h"
static int RX_Err_counter = 0;
static int RX_counter = 0;
unsigned int RX_Data_Buffer[16];
unsigned int TX_Data_Buffer[16];
unsigned int RX_Data_a[10];
FIFO_QUEUE UART_RX_Buffer =
{
RX_Data_Buffer,
RX_Data_Buffer + sizeof(RX_Data_Buffer) - 1,
RX_Data_Buffer,
RX_Data_Buffer
};
GEN_REG_DEF UART_flag;
#define RX_flag_head UART_flag.B.bit0
#define RX_Work_complete UART_flag.B.bit1
#define TX_Work_complete UART_flag.B.bit2
#define UART_Err_flag UART_flag.B.bit3
#define OK 0x00ff
unsigned int RX_XOR_check(unsigned int *Data,int Num);
unsigned int TX_XOR_create(unsigned int *Data,int Num);
void Daly_Time(int Time);
//****************************************************************************************************
// UART_IRQ中断服务 UART_IRQ
// 设计者: 牟联树
// 描 述: 串行通信中断服务
// 日 期: 2003.11.22
// 版本号: 1.0
//****************************************************************************************************
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
// if(((*P_UART_Command2 & 0x0080) == 0x0080)&&(TX_Work_complete == 1)) //判断是接收还是发关中断
{ //接收中断
if(RX_flag_head)
{
if(RX_counter < 13)
{
FIFO_Push_Queue(&UART_RX_Buffer,(P_UART_Data->W)&0x00ff);
RX_counter ++;
}
if(RX_counter > 12)
{
if(RX_XOR_check(RX_Data_Buffer,11) == OK)
{ //校验正确
if(RX_Data_Buffer[0] == 0x00fb)
{
RX_Data_a[0] = (RX_Data_Buffer[1] << 8) + RX_Data_Buffer[2];
RX_Data_a[1] = (RX_Data_Buffer[3] << 8) + RX_Data_Buffer[4]; //将数据送到指定的数据单元.
RX_Data_a[2] = (RX_Data_Buffer[5] << 8) + RX_Data_Buffer[6];
RX_Data_a[3] = (RX_Data_Buffer[7] << 8) + RX_Data_Buffer[8];
RX_Data_a[4] = (RX_Data_Buffer[9] << 8) + RX_Data_Buffer[10];
}
if(RX_Data_Buffer[0] == 0x00fa)
{
RX_Data_a[5] = (RX_Data_Buffer[1] << 8) + RX_Data_Buffer[2];
RX_Data_a[6] = (RX_Data_Buffer[3] << 8) + RX_Data_Buffer[4]; //将数据送到指定的数据单元.
RX_Data_a[7] = (RX_Data_Buffer[5] << 8) + RX_Data_Buffer[6];
RX_Data_a[8] = (RX_Data_Buffer[7] << 8) + RX_Data_Buffer[8];
RX_Data_a[9] = (RX_Data_Buffer[9] << 8) + RX_Data_Buffer[10];
}
//RX_Data_Buffer[9],RX_Data_Buffer[10]是室外机的状态标志
//读标志设置
RX_Work_complete = 1;
RX_Err_counter = 0;
RX_flag_head = 0;
UART_Err_flag = 0;
}
else
{
RX_flag_head = 0;
RX_Work_complete = 0;
RX_Err_counter ++;
if(RX_Err_counter > 3)
UART_Err_flag = 1;
}
}
}
else if((P_UART_Data->W&0x00ff) == 0xaa)
{
RX_flag_head = 1;
RX_counter = 0;
FIFO_Reset_Queue(&UART_RX_Buffer);
}
}
}
//=============================================================
// ----Function: void UART_putchar(int NUM);
// -Description: 系统定时服务的分中断处理函数
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
void UART_putchar(int NUM)
{
int i;
TX_Work_complete = 0;
// *P_UART_Command1 = 0;
P_IOB_Buffer->W |= 0x0003;//切换为发送方式
Daly_Time(20);
// while((*P_UART_Command2 & 0x0040) == 0);
for(i=0;i<NUM;i++)
{
P_UART_Data->W = TX_Data_Buffer[i];
// while((*P_UART_Command2 & 0x0040) == 0);
}
Daly_Time(10);
P_IOB_Buffer->W &= 0xfffc; //切换回接收方式
TX_Work_complete = 1;
// *P_UART_Command1 = 0x80;
}
//=============================================================
// ----Function: void Sys_TXD_Work(void);
// -Description:
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
void Sys_TXD_Work(unsigned int Data)
{ //系统信息发送
TX_Data_Buffer[0] = 0xaa;
TX_Data_Buffer[1] = Data;
TX_Data_Buffer[2] = 0;
TX_Data_Buffer[3] = 0;
TX_Data_Buffer[4] = 0;
TX_Data_Buffer[5] = 0;
TX_Data_Buffer[6] = 0;
TX_Data_Buffer[7] = 0;
TX_Data_Buffer[8] = 0;
TX_Data_Buffer[9] = 0;
TX_Data_Buffer[10] = 0;
TX_Data_Buffer[11] = 0;
TX_Data_Buffer[12] = TX_XOR_create(TX_Data_Buffer,11);
TX_Data_Buffer[13] = 0xcc;
UART_putchar(14);//发送数据
}
//=============================================================
// ----Function: void UART_Init(void);
// -Description: 系统定时服务的分中断处理函数
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
void UART_Init(void)
{
unsigned int Temp;
P_IOB_Attrib->W |= 0x0483;
P_IOB_Dir->W &= 0xff7f;
P_IOB_Dir->W |= 0x0403;
P_IOB_Buffer->W |= 0x0480;
P_IOB_Buffer->W &= 0xfffc;
// *P_UART_BaudScalarLow = 0xff;
// *P_UART_BaudScalarHigh = 0x1f;
// *P_UART_Command1 = 0x80;
// *P_UART_Command2 = 0xc0;
Temp = P_UART_Data->W;
TX_Work_complete = 1;
}
//=============================================================
// ----Function: unsigned int RX_CRC_check(unsigned int *Data,int Num);
// -Description:
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
unsigned int RX_XOR_check(unsigned int *Data,int Num)
{
int i;
unsigned int Temp;
Temp = Data[0];
for(i = 1;i < Num;i ++ )
Temp ^= Data[i];
if((Temp == Data[i])&&(Data[i+1] == 0xcc))
Temp = OK;
else Temp = 0;
return(Temp);
}
//=============================================================
// ----Function: unsigned int TX_CRC_create(unsigned int *Data,int Num);
// -Description:
// --Parameters: None
// -----Returns: None
// -------Notes:
//=============================================================
unsigned int TX_XOR_create(unsigned int *Data,int Num)
{
int i;
unsigned int Temp;
Temp = Data[1];
for(i = 2;i < (Num + 1);i ++ )
Temp ^= Data[i];
return(Temp);
}
//=============================================================
// ----Function: void Daly_Time(int Time);
// -Description: 延时程序
// --Parameters: Time 延时时间的大小
// -----Returns: None
// -------Notes:
//=============================================================
void Daly_Time(int Time)
{
int i;
while(--Time > 0)
{
for(i = 0;i < 1000;i++)
{ ;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -