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

📄 uart_554.c

📁 用AVR Atmega128驱动多串口芯片Tl164C554A的程序
💻 C
字号:
#include "Uart_554.h"

unsigned char *Tl164v554A_A_THR = (unsigned char *)(Tl164v554A_A);
unsigned char *Tl164v554A_A_DAT = (unsigned char *)(Tl164v554A_A);
unsigned char *Tl164v554A_A_IER = (unsigned char *)(Tl164v554A_A + 1);
unsigned char *Tl164v554A_A_FCR = (unsigned char *)(Tl164v554A_A + 2);
unsigned char *Tl164v554A_A_LCR = (unsigned char *)(Tl164v554A_A + 3);
unsigned char *Tl164v554A_A_MCR = (unsigned char *)(Tl164v554A_A + 4);
unsigned char *Tl164v554A_A_LSR = (unsigned char *)(Tl164v554A_A + 5);
unsigned char *Tl164v554A_A_MSR = (unsigned char *)(Tl164v554A_A + 6);
unsigned char *Tl164v554A_A_SR  = (unsigned char *)(Tl164v554A_A + 7);

unsigned char *Tl164v554A_B_THR = (unsigned char *)(Tl164v554A_B);
unsigned char *Tl164v554A_B_DAT = (unsigned char *)(Tl164v554A_B);
unsigned char *Tl164v554A_B_IER = (unsigned char *)(Tl164v554A_B + 1);
unsigned char *Tl164v554A_B_FCR = (unsigned char *)(Tl164v554A_B + 2);
unsigned char *Tl164v554A_B_LCR = (unsigned char *)(Tl164v554A_B + 3);
unsigned char *Tl164v554A_B_MCR = (unsigned char *)(Tl164v554A_B + 4);
unsigned char *Tl164v554A_B_LSR = (unsigned char *)(Tl164v554A_B + 5);
unsigned char *Tl164v554A_B_MSR = (unsigned char *)(Tl164v554A_B + 6);
unsigned char *Tl164v554A_B_SR  = (unsigned char *)(Tl164v554A_B + 7);

unsigned char *Tl164v554A_C_THR = (unsigned char *)(Tl164v554A_C);
unsigned char *Tl164v554A_C_DAT = (unsigned char *)(Tl164v554A_C);
unsigned char *Tl164v554A_C_IER = (unsigned char *)(Tl164v554A_C + 1);
unsigned char *Tl164v554A_C_FCR = (unsigned char *)(Tl164v554A_C + 2);
unsigned char *Tl164v554A_C_LCR = (unsigned char *)(Tl164v554A_C + 3);
unsigned char *Tl164v554A_C_MCR = (unsigned char *)(Tl164v554A_C + 4);
unsigned char *Tl164v554A_C_LSR = (unsigned char *)(Tl164v554A_C + 5);
unsigned char *Tl164v554A_C_MSR = (unsigned char *)(Tl164v554A_C + 6);
unsigned char *Tl164v554A_C_SR  = (unsigned char *)(Tl164v554A_C + 7);

unsigned char *Tl164v554A_D_THR = (unsigned char *)(Tl164v554A_D);
unsigned char *Tl164v554A_D_DAT = (unsigned char *)(Tl164v554A_D);
unsigned char *Tl164v554A_D_IER = (unsigned char *)(Tl164v554A_D + 1);
unsigned char *Tl164v554A_D_FCR = (unsigned char *)(Tl164v554A_D + 2);
unsigned char *Tl164v554A_D_LCR = (unsigned char *)(Tl164v554A_D + 3);
unsigned char *Tl164v554A_D_MCR = (unsigned char *)(Tl164v554A_D + 4);
unsigned char *Tl164v554A_D_LSR = (unsigned char *)(Tl164v554A_D + 5);
unsigned char *Tl164v554A_D_MSR = (unsigned char *)(Tl164v554A_D + 6);
unsigned char *Tl164v554A_D_SR  = (unsigned char *)(Tl164v554A_D + 7);

//unsigned char *FREE_EXT_CS      = (unsigned char *)(FREE_ALL_CS);

void W_ADDRESS_DATA(unsigned char Address,unsigned char Data)
{
	DPADR |= 0xFF;
	//设置MCU接口方向

	PADR |= Address;
	//写TL16c554a中具体地址
//	NOP();

	PADR |= Data;
	//写数据
	PBDR &=~WR;
	//写信号使能,低有效
//	NOP();
	PBDR |=WR;
}

unsigned R_ADDRESS(unsigned char Address)
{
	unsigned char Data = 0;

	PADDR |= 0xFF;
	//设置MCU接口方向

	PADR |= Address;
	//写TL16c554a中具体地址

//	NOP();

	PADDR &=~ 0xFF;
	PBDR &=~RD;
//	NOP();

	Data = PADR;
	PBDR |=RD;

	return(Data);
}

void init_tl164c554a_a(void)
{
	//	*Tl164v554A_A_LCR = 0x80;
	W_ADDRESS_DATA(*Tl164v554A_A_LCR,0x80);
    //LCR7 BIT7是除数锁存访问位。该位必须被置位以便在读或写操作期间访问波特率发
    //生器的除数锁存DDL 和DLM。LCR7 必须被清零以访问接收器缓冲寄存器、发送器保持
    //寄存器或中断使能寄存器。

	//*Tl164v554A_A_THR = 0x0C;
	W_ADDRESS_DATA(*Tl164v554A_A_THR,0x0C);
	//设置波特率为9600

	//*Tl164v554A_A_IER = 0x00;
	W_ADDRESS_DATA(*Tl164v554A_A_IER,0x00);
	//BIT0为接收和发送使能,为1则允许接受发送,为0则不允许接受发送
	//禁止接收发送

	//*Tl164v554A_A_LCR = 0x03;
	W_ADDRESS_DATA(*Tl164v554A_A_LCR,0x03);
	//设置串口数据位格式:8位数据位置,一位停止位,无奇偶校验

	//*Tl164v554A_A_MCR = 0x2B;
	W_ADDRESS_DATA(*Tl164v554A_A_MCR,0x2B);
	//设置模块中断使能,模块收到数据后给出中断

	//*Tl164v554A_A_FCR = 0xC7;
	W_ADDRESS_DATA(*Tl164v554A_A_FCR,0xC7);
	//设置接收数据缓冲区为14byte

	//*Tl164v554A_A_IER = 0x01;
	W_ADDRESS_DATA(*Tl164v554A_A_IER,0x01);
	//BIT0为接收和发送使能,为1则允许接受发送,为0则不允许接受发送
	//允许接收发送
}

void init_tl164c554a_b(void)
{
//	*Tl164v554A_B_LCR = 0x80;
//	*Tl164v554A_B_THR = 0x0C;
//	*Tl164v554A_B_IER = 0x00;
//	*Tl164v554A_B_LCR = 0x03;
//	*Tl164v554A_B_MCR = 0x2B;
//	*Tl164v554A_B_FCR = 0xC7;
//	*Tl164v554A_B_IER = 0x01;

	W_ADDRESS_DATA(*Tl164v554A_B_LCR,0x80);
	W_ADDRESS_DATA(*Tl164v554A_B_THR,0x0C);
	W_ADDRESS_DATA(*Tl164v554A_B_IER,0x00);
	W_ADDRESS_DATA(*Tl164v554A_B_LCR,0x03);
	W_ADDRESS_DATA(*Tl164v554A_B_MCR,0x2B);
	W_ADDRESS_DATA(*Tl164v554A_B_FCR,0xC7);
	W_ADDRESS_DATA(*Tl164v554A_B_IER,0x01);
}

void init_tl164c554a_c(void)
{
//	*Tl164v554A_C_LCR = 0x80;
//	*Tl164v554A_C_THR = 0x0C;
//	*Tl164v554A_C_IER = 0x00;
//	*Tl164v554A_C_LCR = 0x03;
//	*Tl164v554A_C_MCR = 0x2B;
//	*Tl164v554A_C_FCR = 0xC7;
//	*Tl164v554A_C_IER = 0x01;

	W_ADDRESS_DATA(*Tl164v554A_C_LCR,0x80);
	W_ADDRESS_DATA(*Tl164v554A_C_THR,0x0C);
	W_ADDRESS_DATA(*Tl164v554A_C_IER,0x00);
	W_ADDRESS_DATA(*Tl164v554A_C_LCR,0x03);
	W_ADDRESS_DATA(*Tl164v554A_C_MCR,0x2B);
	W_ADDRESS_DATA(*Tl164v554A_C_FCR,0xC7);
	W_ADDRESS_DATA(*Tl164v554A_C_IER,0x01);
}

void init_tl164c554a_d(void)
{
//	*Tl164v554A_D_LCR = 0x80;
//	*Tl164v554A_D_THR = 0x0C;
//	*Tl164v554A_D_IER = 0x00;
//	*Tl164v554A_D_LCR = 0x03;
//	*Tl164v554A_D_MCR = 0x2B;
//	*Tl164v554A_D_FCR = 0xC7;
//	*Tl164v554A_D_IER = 0x01;

	W_ADDRESS_DATA(*Tl164v554A_D_LCR,0x80);
	W_ADDRESS_DATA(*Tl164v554A_D_THR,0x0C);
	W_ADDRESS_DATA(*Tl164v554A_D_IER,0x00);
	W_ADDRESS_DATA(*Tl164v554A_D_LCR,0x03);
	W_ADDRESS_DATA(*Tl164v554A_D_MCR,0x2B);
	W_ADDRESS_DATA(*Tl164v554A_D_FCR,0xC7);
	W_ADDRESS_DATA(*Tl164v554A_D_IER,0x01);
}

void read_tl164_date(void)
{
	unsigned char Dat_554_Temp;

	do
	{
//		Dat_554_Temp = *Tl164v554A_A_DAT;
		Dat_554_Temp = R_ADDRESS(*Tl164v554A_A_DAT);
	}
//	while( (*Tl164v554A_A_LSR & 0x01) != 0 );
	while( (R_ADDRESS(*Tl164v554A_A_LSR) & 0x01) != 0 );
	//当串口有数据接收时,LSR BIT0置位
	//CPU对接收器缓冲寄存器或FIFO中的数据的读操作将使LSR BIT0被清零


	do
	{
//		Dat_554_Temp = *Tl164v554A_B_DAT;
		Dat_554_Temp = R_ADDRESS(*Tl164v554A_B_DAT);
	}
//	while( (*Tl164v554A_B_LSR & 0x01) != 0 );
	while( (R_ADDRESS(*Tl164v554A_B_LSR) & 0x01) != 0 );

	do
	{
//		Dat_554_Temp = *Tl164v554A_C_DAT;
		Dat_554_Temp = R_ADDRESS(*Tl164v554A_C_DAT);
	}
//	while( (*Tl164v554A_C_LSR & 0x01) != 0 );
	while( (R_ADDRESS(*Tl164v554A_C_LSR) & 0x01) != 0 );

	do
	{
//		Dat_554_Temp = *Tl164v554A_D_DAT;
		Dat_554_Temp = R_ADDRESS(*Tl164v554A_D_DAT);
	}
//	while( (*Tl164v554A_D_LSR & 0x01) != 0 );
	while( (R_ADDRESS(*Tl164v554A_D_LSR) & 0x01) != 0 );
}

void init_tl164c554(void)							//初始化多串口芯片
{
//	CLI(); //disable all interrupts
	init_tl164c554a_a();							//初始化端口A
	init_tl164c554a_b();							//初始化端口B
	init_tl164c554a_c();							//初始化端口C
	init_tl164c554a_d();							//初始化端口D
	read_tl164_date();								//初始化完成之后读取554中的内容
//	*FREE_EXT_CS = 0x00;
//	SEI(); //re-enable interrupts
}

void int0_isr(void)
{
	//external interupt on INT0
	unsigned char temp_data = 0;

//	while( (*Tl164v554A_A_LSR & 0x01) != 0 )
//	while( (R_ADDRESS(*Tl164v554A_A_LSR) & 0x01) != 0 )
//	{
//		GPS_Buffer[GPS_Buffer_Point] = *Tl164v554A_A_DAT;
//		GPS_Buffer[GPS_Buffer_Point] = R_ADDRESS(*Tl164v554A_A_DAT);
//		GPS_Buffer_Point++;
//		if( GPS_Buffer_Point >= sizeof(GPS_Buffer) )
//		{
//			GPS_Buffer_Point = 0;
//		}
//		gGPS_Receive_Over = 0;
//	}
/*
	while( (*Tl164v554A_B_LSR & 0x01) != 0 )
	{
		temp_data = *Tl164v554A_B_DAT;
	}
	while( (*Tl164v554A_B_LSR & 0x01) != 0 )
	{
		temp_data = *Tl164v554A_B_DAT;
	}
	while( (*Tl164v554A_C_LSR & 0x01) != 0 )
	{
		temp_data = *Tl164v554A_C_DAT;
	}
	while( (*Tl164v554A_D_LSR & 0x01) != 0 )
	{
		temp_data = *Tl164v554A_D_DAT;
	}
*/
	while( (R_ADDRESS(*Tl164v554A_B_LSR) & 0x01) != 0 )
	{
		temp_data = R_ADDRESS(*Tl164v554A_B_DAT);
	}
	while( (R_ADDRESS(*Tl164v554A_B_LSR) & 0x01) != 0 )
	{
		temp_data = R_ADDRESS(*Tl164v554A_B_DAT);
	}
	while( (R_ADDRESS(*Tl164v554A_C_LSR) & 0x01) != 0 )
	{
		temp_data = R_ADDRESS(*Tl164v554A_C_DAT);
	}
	while( (R_ADDRESS(*Tl164v554A_D_LSR) & 0x01) != 0 )
	{
		temp_data = R_ADDRESS(*Tl164v554A_D_DAT);
	}

//	*FREE_EXT_CS = 0x00;
}

/********************************************************\
*	函数名:Send_COM2_Byte
	作用域:外部文件调用
*	参数:  Input
*	返回值:无
\********************************************************/
void Send_COM2_Byte(unsigned char Input)
{
/*
	if( (*Tl164v554A_A_LSR&0x20) != 0 )
	{
		*Tl164v554A_A_DAT = Input;
		while( (*Tl164v554A_A_LSR&0x20) == 0 );
	}
*/
	if( (R_ADDRESS(*Tl164v554A_A_LSR)&0x20) != 0 )
	{
		W_ADDRESS_DATA(*Tl164v554A_A_DAT,Input);
		while( (R_ADDRESS(*Tl164v554A_A_LSR)&0x20) == 0 );
	}
}

/********************************************************\
*	函数名:Send_COM2_String
	作用域:外部文件调用
*	参数:  *Point 字符串指针
			 Count 字符串长度
*	返回值:无
\********************************************************/
void Send_COM2_String(unsigned char *Point,unsigned int Count)
{
	while( Count > 0 )
	{
		Send_COM2_Byte(*Point);
		Point++;
		Count--;
	}
}
/********************************************************\
*	函数名:Send_COM3_Byte
	作用域:外部文件调用
*	参数:  Input
*	返回值:无
\********************************************************/
void Send_COM3_Byte(unsigned char Input)
{
	if( (R_ADDRESS(*Tl164v554A_B_LSR)&0x20) != 0 )
	{
		W_ADDRESS_DATA(*Tl164v554A_B_DAT,Input);
		while( (R_ADDRESS(*Tl164v554A_B_LSR)&0x20) == 0 );
	}
}
/********************************************************\
*	函数名:Send_COM3_String
	作用域:外部文件调用
*	参数:  *Point 字符串指针
			 Count 字符串长度
*	返回值:无
\********************************************************/
void Send_COM3_String(unsigned char *Point,unsigned int Count)
{
	while( Count > 0 )
	{
		Send_COM3_Byte(*Point);
		Point++;
		Count--;
	}
}

/********************************************************\
*	函数名:Send_COM4_Byte
	作用域:外部文件调用
*	参数:  Input
*	返回值:无
\********************************************************/
void Send_COM4_Byte(unsigned char Input)
{
	if( (R_ADDRESS(*Tl164v554A_C_LSR)&0x20) != 0 )
	{
		W_ADDRESS_DATA(*Tl164v554A_C_DAT,Input);
		while( (R_ADDRESS(*Tl164v554A_C_LSR)&0x20) == 0 );
	}
}

/********************************************************\
*	函数名:Send_COM4_String
	作用域:外部文件调用
*	参数:  *Point 字符串指针
			 Count 字符串长度
*	返回值:无
\********************************************************/
void Send_COM4_String(unsigned char *Point,unsigned int Count)
{
	while( Count > 0 )
	{
		Send_COM4_Byte(*Point);
		Point++;
		Count--;
	}
}
/********************************************************\
*	函数名:Send_COM5_Byte
	作用域:外部文件调用
*	参数:  Input
*	返回值:无
\********************************************************/
void Send_COM5_Byte(unsigned char Input)
{
	if( (R_ADDRESS(*Tl164v554A_D_LSR)&0x20) != 0 )
	{
		W_ADDRESS_DATA(*Tl164v554A_D_DAT,Input);
		while( (R_ADDRESS(*Tl164v554A_D_LSR)&0x20) == 0 );
	}
}

/********************************************************\
*	函数名:Send_COM5_String
	作用域:外部文件调用
*	参数:  *Point 字符串指针
			 Count 字符串长度
*	返回值:无
\********************************************************/
void Send_COM5_String(unsigned char *Point,unsigned int Count)
{
	while( Count > 0 )
	{
		Send_COM5_Byte(*Point);
		Point++;
		Count--;
	}
}
/********************************************************\
*	函数名:Send_COM5_String
	作用域:外部文件调用
*	参数:  *Point 字符串指针
			 Count 字符串长度
*	返回值:无
\********************************************************/
void Send_COM5_CON_Str(const unsigned char *Point,unsigned int Count)
{
	while( Count > 0 )
	{
		Send_COM5_Byte(*Point);
		Point++;
		Count--;
	}
}

⌨️ 快捷键说明

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