📄 uart_554.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 + -