⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart2.c

📁 MEGA128 串口驱动程序 两个串口都有,包括H文件和C文件
💻 C
字号:
/**********************************************************************
* System Name		DOOR
* Source Name		uart2.c
* Function			dip sw状态输入
* Version	Date		Editor		Modification
* 1.0		2007/05/10	周斌		做成
**********************************************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "uart2.h"
#include "spi_to_uart.h"
#include "timer0.h"


#define UART2_RX 	0
#define UART2_TX 	1
#define UART2_FREE 	2
UCHAR uart2_stat = UART2_FREE;




//uart 0 缓存大小配置
#define uart2_RX_BUF_SIZE 128
#define uart2_TX_BUF_SIZE 128



//uart 0 缓存区
volatile UCHAR uart2_rx_buf_data[uart2_RX_BUF_SIZE];	//接收缓存
volatile UCHAR uart2_rx_buf_head;	//头指针
volatile UCHAR uart2_rx_buf_tail;	//尾指针
volatile UCHAR uart2_rx_buf_len;	//长度
//
volatile UCHAR uart2_tx_buf_data[uart2_TX_BUF_SIZE];	//发送缓存
volatile UCHAR uart2_tx_buf_head;	//头指针
volatile UCHAR uart2_tx_buf_tail;	//尾指针
volatile UCHAR uart2_tx_buf_len;	//长度


extern volatile UCHAR MAX3100_T_FLAG;


UCHAR TX_INT_FLAG;
UCHAR RX_INT_FLAG;












/**********************************************************************
* Function Name		uart2_init
* Function Desc		串口0初始化
* Return Value		无
* Parameter         
			t_ubbr:波特率配置选择
* Version	Date		Editor		Modification
* 1.0		2007/05/09	周斌		做成
**********************************************************************/
void uart2_init(void)
{

	max3100_init();
	//
	uart2_rx_buf_head = 0;
	uart2_rx_buf_tail = 0;
	uart2_rx_buf_len  = 0;
	//
	uart2_tx_buf_head = 0;
	uart2_tx_buf_head = 0;
	uart2_tx_buf_len  = 0;


	PORTD |= 0x01;
	sei();
}




/**********************************************************************
* Function Name		uart2_put_byte
* Function Desc		通过串口0发送一个字节
* Return Value		无
* Parameter         
			t_char	要发送的字符
* Version	Date		Editor		Modification
* 1.0		2007/05/09	周斌		做成
**********************************************************************/
UCHAR uart2_put_byte(UCHAR t_char) 
{ 
	//暂停中断,以免数据比较时出错
	cli(); 
	if(uart2_tx_buf_len < uart2_TX_BUF_SIZE)
	{
		uart2_tx_buf_data[uart2_tx_buf_tail] = t_char;
		uart2_tx_buf_tail++;
		//指针到了底部回顶部
		if (uart2_tx_buf_tail >= uart2_TX_BUF_SIZE)
		{
			uart2_tx_buf_tail = 0;
		}
		uart2_tx_buf_len++;
		return TRUE;
	}
	else
	{
		error_code = ERROR_UART2_TX;
		return FALSE;
	}
	sei();
} 




/**********************************************************************
* Function Name		uart2_get_byte
* Function Desc		从串口2的缓存中取一个字节
* Return Value		
*		SUCESS:	取字节成功
*		FAIL:	取字节失败
* Parameter         
			*t_char	取字节地址
* Version	Date		Editor		Modification
* 1.0		2007/05/10   史玮		做成
**********************************************************************/

UCHAR uart2_get_byte(UCHAR * t_char)
{
	if(uart2_rx_buf_len>0)
	{
		cli();
		*t_char = uart2_rx_buf_data[uart2_rx_buf_head];
		uart2_rx_buf_head++;
		//指针到末尾后回到开始
		if(uart2_rx_buf_head>=uart2_RX_BUF_SIZE)
		{
			uart2_rx_buf_head=0;
		}
		uart2_rx_buf_len--;
		sei();
		return SUCESS;
	}
	else
	{
		return FAIL;
	}	
}



/**********************************************************************
* Function Name		uart2_put_bytes
* Function Desc		通过串口0发送len个字节
* Return Value		无
* Parameter         
			pBytes	要发送的数据的首地址   
			len     数据长度
* Version	Date		Editor		Modification
* 1.0		2007/05/09	史玮		做成
**********************************************************************/

void uart2_put_bytes(UCHAR * pBytes,UCHAR len) 
{
	UCHAR i;
	for(i=0;i<len;i++)
	{
		uart2_put_byte(*(pBytes+i));
	}
}



/**********************************************************************
* Function Name		uart2_get_buffer_len()
* Function Desc		获取缓冲区数据长度
* Return Value		缓冲区数据长度
* Parameter         
			
* Version	Date		Editor		Modification
* 1.0		2007/05/09	史玮		做成
**********************************************************************/

UCHAR uart2_get_buffer_len()
{
	return uart2_rx_buf_len;
}


/**********************************************************************
* Function Name		uart2_clear_buffer()
* Function Desc		清缓冲区
* Return Value		
* Parameter         
			
* Version	Date		Editor		Modification
* 1.0		2007/05/09	史玮		做成
**********************************************************************/

void uart2_clear_buffer()
{
	uart2_rx_buf_tail = uart2_rx_buf_head	;
	uart2_rx_buf_len = 0;	//长度=0
	
}



//串口2中断
/**********************************************************************
* Function Name		uart2中断

* Parameter         
			*t_char	取字节地址
* Version	Date		Editor		Modification
* 1.0		2007/05/10   史玮		做成
**********************************************************************/
/*
#ifdef    int_test1
#define
SIGNAL(SIG_INTERRUPT0)
{


//	volatile UCHAR RX_DATA[2];
		cli();
		//temp[0] = RX_DATA[0];
		//temp[1] = RX_DATA[1];
			max3100_read_data(temp);                      //分析中断类型
			if(temp[0] & 0x80)//有数据到来
			{
				RX_INT_FLAG = 1;				
			}
			if(MAX3100_T_FLAG == 1 && (temp[0] &0x40))
			{//发送完成中断
				//max3100_read_data(RX_DATA);
				TX_INT_FLAG = 1;
			}

		sei();
}


void uart2_int_process(void)
{
	extern UINT N;
	if(RX_INT_FLAG == 1)
	{
		
		do
		{
			if(uart2_rx_buf_len < uart2_RX_BUF_SIZE)
			{
				uart2_rx_buf_data[uart2_rx_buf_tail] = temp[1];
				uart2_rx_buf_tail++;
				//指针到末尾后回到开始
				if(uart2_rx_buf_tail >= uart2_RX_BUF_SIZE)
				{	
					uart2_rx_buf_tail = 0;
				}
				uart2_rx_buf_len++;
				N++;
			}
			cli();
			max3100_read_data(temp);
			sei();
		}while(temp[0] & 0x80);			
			RX_INT_FLAG = 0;

	}
	if(TX_INT_FLAG == 1)
	{
		MAX3100_T_FLAG = 0;
		if (uart2_tx_buf_len>0)	//如果发送缓存中有数据
		{
			max3100_write_data(uart2_tx_buf_data[uart2_tx_buf_head]);
			uart2_tx_buf_head++;
			//指针到了底部回顶部
			if (uart2_tx_buf_head >= uart2_TX_BUF_SIZE)
			{
				uart2_tx_buf_head = 0;
			}
			uart2_tx_buf_len--;	//缓存长度--
		}
		//	P++;
		//max3100_read_data(temp);//清楚IRQ	
		TX_INT_FLAG = 0;
		//P++;
	}
}
*/


SIGNAL(SIG_INTERRUPT0)
{
	EIMSK &= ~(1<<INT0);	//DISABLE INT0
	uart2_stat = UART2_RX;
}



/**********************************************************************
* Function Name		uart2_rx_process
* Function Desc		把数据从3100接收缓冲搬移到uart2接收缓存
* Return Value		无
* Parameter         无
* Version	Date		Editor		Modification
* 1.0		2007/05/14	周斌		做成
**********************************************************************/
void uart2_rx_process(void)
{
	volatile UCHAR temp[2];
//	UCHAR t_int[1];
//	UCHAR inter0;
//	UCHAR count = 0;
	UCHAR data_exist = TRUE;

	if(uart2_stat == UART2_RX)
	{
		while(data_exist == TRUE)
		{
			
			max3100_read_data(temp);                      //分析中断类型
			if(temp[0] & 0x80)//有数据到来
			{
				//
				data_exist = TRUE;
				//
				if(uart2_rx_buf_len < uart2_RX_BUF_SIZE)
				{
					uart2_rx_buf_data[uart2_rx_buf_tail] = temp[1];
					uart2_rx_buf_tail++;
					//指针到末尾后回到开始
					if(uart2_rx_buf_tail >= uart2_RX_BUF_SIZE)
					{	
						uart2_rx_buf_tail = 0;
					}
					uart2_rx_buf_len++;
					//N++;
					timer0_task_uart2pack_stat = TIMER0_TASK_UART2PACK_NEW;
				}
			}
			else
			{
				data_exist = FALSE;
				uart2_stat = UART2_FREE;
				EIMSK |= (1<<INT0);	//ENABLE INT0
			}
		}
	}
}



/**********************************************************************
* Function Name		uart2_put_byte_process
* Function Desc		把数据从uart2发送缓存发送到发送3100缓冲
* Return Value		无
* Parameter         无
* Version	Date		Editor		Modification
* 1.0		2007/05/14	周斌		做成
**********************************************************************/
void uart2_put_byte_process(void)
{
	UCHAR temp[2];
	UCHAR stat_return;	//发送数据的同时返回的状态
	if(uart2_stat == UART2_FREE)
	{
		if(uart2_tx_buf_len > 0)	//如果缓存有数据
		{
		
			max3100_read_config(temp);	//查询发送缓冲是否为空
			if  (temp[0] & 0x40) 	//如果发送缓冲为空
			{
				stat_return = max3100_write_data(uart2_tx_buf_data[uart2_tx_buf_head]);	//直接发送数据
				//
				if( (stat_return & 0x80 )==0x80)
				{
					uart2_stat = UART2_RX;
				}
				cli();
				uart2_tx_buf_head++;
				if (uart2_tx_buf_head >= uart2_TX_BUF_SIZE)
				{
					uart2_tx_buf_head = 0;
				}
				//
				uart2_tx_buf_len--;
				sei();

			}
		}
	}
}









/**********************************************************************
* Function Name		uart2_put_string
* Function Desc		通过串口1发送一个字符串
* Return Value		无
* Parameter         
*				*p_str	字符串首指针
* Version	Date		Editor		Modification
* 1.0		2007/05/09	周斌		做成
**********************************************************************/
void uart2_put_string(char * p_str)
{
	for(;*p_str!=0;p_str++)   //遇到停止符0结束 
	{
		uart2_put_byte(*p_str); 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -