📄 16c554.c
字号:
/**********************************************************
*此程序是一个测试程序,实际上GPRS是在通道A,此程序改在通道B
*16C554的驱动程序
*16C554是一个4串口的芯片
*B口分配为调试以及客流采集器
*C口分配给LED屏
**********************************************************/
#include "w77e532.h"
#include "16c554.h"
#include "uart.h"
#include "mcuInit.h"
#include "string.h"
unsigned char volatile xdata uartInt _at_ (INT_BASE);
/*通道A的寄存器定义*/
unsigned char volatile xdata chALcr _at_ (CHA_BASE+LCR_ADD);
unsigned char volatile xdata chAMcr _at_ (CHA_BASE+MCR_ADD);
unsigned char volatile xdata chAIer _at_ (CHA_BASE+IER_ADD);
unsigned char volatile xdata chAIir _at_ (CHA_BASE+IIR_ADD);
unsigned char volatile xdata chALsr _at_ (CHA_BASE+LSR_ADD);
unsigned char volatile xdata chAMsr _at_ (CHA_BASE+MSR_ADD);
unsigned char volatile xdata chARxd _at_ (CHA_BASE+RBR_ADD);
unsigned char volatile xdata chAScr _at_ (CHA_BASE+SCR_ADD);
#define chATxd chARxd
#define chADll chARxd
#define chADlm chAIer
#define chAFcr chAIir
/*通道B的寄存器定义*/
unsigned char volatile xdata chBLcr _at_ (CHB_BASE+LCR_ADD);
unsigned char volatile xdata chBMcr _at_ (CHB_BASE+MCR_ADD);
unsigned char volatile xdata chBIer _at_ (CHB_BASE+IER_ADD);
unsigned char volatile xdata chBIir _at_ (CHB_BASE+IIR_ADD);
unsigned char volatile xdata chBLsr _at_ (CHB_BASE+LSR_ADD);
unsigned char volatile xdata chBMsr _at_ (CHB_BASE+MSR_ADD);
unsigned char volatile xdata chBRxd _at_ (CHB_BASE+RBR_ADD);
unsigned char volatile xdata chBScr _at_ (CHB_BASE+SCR_ADD);
#define chBTxd chBRxd
#define chBDll chBRxd
#define chBDlm chBIer
#define chBFcr chBIir
/*通道C的寄存器定义*/
unsigned char volatile xdata chCLcr _at_ (CHC_BASE+LCR_ADD);
unsigned char volatile xdata chCMcr _at_ (CHC_BASE+MCR_ADD);
unsigned char volatile xdata chCIer _at_ (CHC_BASE+IER_ADD);
unsigned char volatile xdata chCIir _at_ (CHC_BASE+IIR_ADD);
unsigned char volatile xdata chCLsr _at_ (CHC_BASE+LSR_ADD);
unsigned char volatile xdata chCMsr _at_ (CHC_BASE+MSR_ADD);
unsigned char volatile xdata chCRxd _at_ (CHC_BASE+RBR_ADD);
unsigned char volatile xdata chCScr _at_ (CHC_BASE+SCR_ADD);
#define chCTxd chCRxd
#define chCDll chCRxd
#define chCDlm chCIer
#define chCFcr chCIir
/*通道D的寄存器定义*/
unsigned char volatile xdata chDLcr _at_ (CHD_BASE+LCR_ADD);
unsigned char volatile xdata chDMcr _at_ (CHD_BASE+MCR_ADD);
unsigned char volatile xdata chDIer _at_ (CHD_BASE+IER_ADD);
unsigned char volatile xdata chDIir _at_ (CHD_BASE+IIR_ADD);
unsigned char volatile xdata chDLsr _at_ (CHD_BASE+LSR_ADD);
unsigned char volatile xdata chDMsr _at_ (CHD_BASE+MSR_ADD);
unsigned char volatile xdata chDRxd _at_ (CHD_BASE+RBR_ADD);
unsigned char volatile xdata chDScr _at_ (CHD_BASE+SCR_ADD);
#define chDTxd chDRxd
#define chDDll chDRxd
#define chDDlm chDIer
#define chDFcr chDIir
/*与GPRS相连的串口数据结构*/
struct
{
unsigned char txState; /*发送状态标志*/
unsigned char rxState; /*接收状态标志*/
unsigned char txTimer; /*发送数据包间隔控制定时器*/
unsigned char rxTimer;
unsigned int txLen; /*发送数据长度*/
unsigned int rxLen; /*接收数据长度*/
unsigned char *txPtr; /*当前发送指针*/
unsigned char xdata *rxHeadPtr;
unsigned char xdata *rxCurPtr; /*当前接收指针*/
} atInfo,siobInfo, siocInfo, siodInfo;
/*最大发送字节减1须为全1.即须是64,128,256,512,1024,2048等*/
#define AT_MAX_SEND_BYTE 1024 - 1
char xdata rxTmpBuffer[350] _at_ 0x0;
static void chA_init()
{
//chAIer = 0x00; /*禁止中断*/
//return;
/*通道A的初始化*/
chALcr = 0x80; /*准备设置波特率*/
chADlm = TI16C554_38400 >> 8;//9600 >> 8;
chADll = TI16C554_38400;//9600;
chALcr = 0x03; /*设置为8,1,N*/
chAMcr = 0x03; /*设置RTS,DTR有效,也可以控制环回*/
chAFcr = 0x00; /*采用16C450模式*/
chAIer = 0x03; /*允许发送和接收中断*/
}
static void chB_init()
{
//chBIer = 0x00; /*禁止中断*/
//return;
/*通道B的初始化*/
chBLcr = 0x80; /*准备设置波特率*/
chBDlm = TI16C554_19200 >> 8;
chBDll = TI16C554_19200;
chBLcr = 0x03; /*设置为8,1,N*/
chBMcr = 0x03; /*设置RTS,DTR有效,也可以控制环回*/
chBFcr = 0x00; /*采用16C450模式*/
chBIer = 0x03; /*允许发送和接收中断*/
}
static void chC_init()
{
// chCIer = 0x00; /*禁止中断*/
chCLcr = 0x80; /*准备设置波特率*/
chCDlm = TI16C554_19200 >> 8;
chCDll = TI16C554_19200;
chCLcr = 0x03; /*设置为8,1,N*/
chCMcr = 0x03; /*设置RTS,DTR有效,也可以控制环回*/
chCFcr = 0x00; /*采用16C450模式*/
chCIer = 0x03; /*允许发送和接收中断*/
}
static void chD_init()
{
chDIer = 0x00; /*禁止中断*/
/*通道D的初始化*/
// chDLcr = 0x80; /*准备设置波特率*/
// chDDlm = TI16C554_38400 >> 8;//9600 >> 8;
// chDDll = TI16C554_38400;//9600;
// chDLcr = 0x03; /*设置为8,1,N*/
// chDMcr = 0x03; /*设置RTS,DTR有效,也可以控制环回*/
// chDFcr = 0x00; /*采用16C450模式*/
// chDIer = 0x03; /*允许发送和接收中断*/
}
/**************************中断服务程序************************/
char intPend;
char bdata intSource;
sbit intChA = intSource ^ 0;//4; /*通道A中断*/
sbit intChB = intSource ^ 1;//5; /*通道B中断*/
sbit intChC = intSource ^ 2;//6; /*通道C中断*/
sbit intChD = intSource ^ 3;//7; /*通道D中断*/
void ISRExtInt1(void) interrupt 2 using 2
{
intSource = uartInt & 0x0f;
while(intSource != 0)
{
/*通道A*/
if( intChA )
{
intPend = chAIir;
if( intPend == 0x04 )
{/*接收数据中断*/
*atInfo.rxCurPtr = chARxd;
atInfo.rxCurPtr ++;
if( atInfo.rxCurPtr == (char xdata *)0x100 )
atInfo.rxCurPtr = (char xdata *)0;
if( atInfo.rxHeadPtr == atInfo.rxCurPtr )
atInfo.rxCurPtr --;
}
else if( intPend == 0x02 )
{/*发送数据中断*/
if( atInfo.txLen == 0 )
{
atInfo.txState = 0;
}
else
{
chATxd = *atInfo.txPtr;
atInfo.txPtr ++;
atInfo.txLen --;
}
}
}
/*通道B*/
if( intChB )
{
intPend = chBIir;
if( intPend == 0x04 )
{/*接收数据中断*/
*siobInfo.rxCurPtr = chBRxd;
siobInfo.rxTimer = 10;
siobInfo.rxState = 1;
if( siobInfo.rxLen < 0xFFFF )
{
siobInfo.rxLen ++;
siobInfo.rxCurPtr ++;
}
}
else if( intPend == 0x02 )
{/*发送数据中断*/
if( siobInfo.txLen == 0 )
{
siobInfo.txState = 0;
}
else
{
chBTxd = *siobInfo.txPtr;
siobInfo.txPtr ++;
siobInfo.txLen --;
}
}
}
/*通道C*/
if( intChC )
{
intPend = chCIir;
if( intPend == 0x04 )
{/*接收数据中断*/
*siocInfo.rxCurPtr = chCRxd;
siocInfo.rxTimer = 10;
siocInfo.rxState = 1;
if( siocInfo.rxLen < 0xFF )
{
siocInfo.rxLen ++;
siocInfo.rxCurPtr ++;
}
}
else if( intPend == 0x02 )
{/*发送数据中断*/
if( siocInfo.txLen == 0 )
{
siocInfo.txState = 0;
}
else
{
chCTxd = *siocInfo.txPtr;
siocInfo.txPtr ++;
siocInfo.txLen --;
}
}
}
intSource = uartInt & 0xF0;
}
}
char at_serial_send(char *ptr, unsigned int len)
{
if( atInfo.txState )
return -1;
else
{
atInfo.txPtr = ptr;
atInfo.txLen = len & AT_MAX_SEND_BYTE;
chATxd = *atInfo.txPtr ++;
atInfo.txLen --;
return 0;
}
}
/***************************************************
*从GPRS模块接收数据的函数
*要求发送的数据长度不能大于AT_MAX_SEND_BYTE,否则将有部分数据不发送
*入口:接收数据存放指针
*返回值:返回接收到的字节数
****************************************************/
unsigned int at_serial_receive(char **ptr)
{
char *tmpPtr;
unsigned int byteCount;
byteCount = 0;
tmpPtr = *ptr;
while( atInfo.rxHeadPtr != atInfo.rxCurPtr )
{
byteCount ++;
*tmpPtr ++ = *atInfo.rxHeadPtr++;
if( atInfo.rxHeadPtr == (char xdata *)0x100 )
atInfo.rxHeadPtr = (char xdata *)0;
}
*ptr = tmpPtr;
return(byteCount);
}
/************************通道B*************************************************/
char xdata siobRxBuffer[520];
char siob_send(char *ptr, unsigned int len)
{
if( siobInfo.txState )
return -1;
else
{
siobInfo.txState=1;
siobInfo.txPtr = ptr;
siobInfo.txLen = len;
chBTxd = *siobInfo.txPtr ++;
siobInfo.txLen --;
while(siobInfo.txState==1);
return 0;
}
}
void siob_start_receive(void)
{
siobInfo.txTimer = 0;
siobInfo.rxState = 0;
siobInfo.rxLen = 0;
siobInfo.rxCurPtr = siobRxBuffer;
}
unsigned int siob_receive(char **ptr)
{
*ptr = siobRxBuffer;
if( siobInfo.rxState == 5 )
return siobInfo.rxLen;
else
return 0;
}
void siob_timeout(void)
{
if( siobInfo.rxState == 1)
{
siobInfo.rxTimer --;
if( !siobInfo.rxTimer )
{
siobInfo.rxState = 5;
siobInfo.rxTimer = 0;
}
}
else if( siobInfo.rxState != 5 )
{
siobInfo.rxState = 0;
siobInfo.rxLen = 0;
}
}
/************************通道C*************************************************/
char xdata siocRxBuffer[256];
char sioc_send(char *ptr, unsigned int len)
{
if( siocInfo.txState )
return -1;
else
{
siocInfo.txState = 1;
siocInfo.txPtr = ptr;
siocInfo.txLen = len;
chCTxd = *siocInfo.txPtr ++;
siocInfo.txLen --;
return 0;
}
}
void sioc_start_receive(void)
{
siocInfo.txTimer = 0;
siocInfo.rxState = 0;
siocInfo.rxLen = 0;
siocInfo.rxCurPtr = siocRxBuffer;
}
char sioc_receive(char **ptr)
{
*ptr = siocRxBuffer;
if( siocInfo.rxState == 5 )
return siocInfo.rxLen;
else
return 0;
}
void sioc_timeout(void)
{
if( siocInfo.rxState == 1)
{
siocInfo.rxTimer --;
if( !siocInfo.rxTimer )
{
siocInfo.rxState = 5;
siocInfo.rxTimer = 0;
}
}
else if( siocInfo.rxState != 5 )
{
siocInfo.rxState = 0;
siocInfo.rxLen = 0;
}
}
/*****************************其它文件使用的函数**********************************/
void tl16c554_init()
{
/**/
atInfo.rxState = 0;
atInfo.txState = 0;
atInfo.rxLen = 0;
atInfo.txLen = 0;
atInfo.txTimer = 0;
atInfo.rxHeadPtr = rxTmpBuffer;
atInfo.rxCurPtr = atInfo.rxHeadPtr;
memset(rxTmpBuffer, 0, sizeof(rxTmpBuffer));
memset(&siobInfo, 0, sizeof(siobInfo) );
memset(siobRxBuffer, 0, sizeof(siobRxBuffer) );
siob_start_receive();
siobInfo.txTimer = 10;
memset(&siocInfo, 0, sizeof(siocInfo) );
memset(siocRxBuffer, 0, sizeof(siocRxBuffer) );
sioc_start_receive();
siocInfo.txTimer = 10;
/**/
chA_init();
chB_init();
chC_init();
chD_init();
/*初始化中断1*/
IT1 = 0; /*为电平触发方式*/
EX1 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -