📄 st2552.c
字号:
#include "..\inc\include.h"
void Init16c2552a(void)
{
INT8U byTemp;
sio_16c2552a.line_control = 0x80; /*set latch for baud rate*/
sio_16c2552a.DLL = BAUD_REG; /*set baud rate*/
sio_16c2552a.DLM = BAUD_REG >> 8; /*set baud rate*/
sio_16c2552a.line_control = 0x1b; /*8 bit data,even parity,1 bit stop*/
sio_16c2552a.FCR = 0xc1; /*fifo enable and clear, one byte fifo interupt*/
sio_16c2552a.modem_control = 0x02; /*while bit2=1 rts=0 receive status*/
byTemp = sio_16c2552a.line_status; /*read to clear any false*/
byTemp = sio_16c2552a.modem_status; /*read to clear any false*/
byTemp = sio_16c2552a.Interrupt_Id; /*read to clear any false*/
DISABLE16C2552ATX /*处于接收状态*/
PTX16C2552A = &BYTX16C2552ABUFF[0];
PRX16C2552A = &BYRX16C2552ABUFF[0];
PTX16C2552ANOW = &BYTX16C2552ABUFF[0];
}
void Init16c2552b(void)
{
INT8U byTemp;
sio_16c2552b.line_control = 0x80; /*set latch for baud rate*/
sio_16c2552b.DLL = BAUD_REG; /*set baud rate*/
sio_16c2552b.DLM = BAUD_REG >> 8; /*set baud rate*/
sio_16c2552b.line_control = 0x1b; /*8 bit data,even parity,1 bit stop*/
sio_16c2552b.FCR = 0xc1; /*fifo enable and clear, one byte fifo interupt*/
sio_16c2552b.modem_control = 0x02; /*while bit2=1 rts=0 receive status*/
byTemp = sio_16c2552b.line_status; /*read to clear any false*/
byTemp = sio_16c2552b.modem_status; /*read to clear any false*/
byTemp = sio_16c2552b.Interrupt_Id; /*read to clear any false*/
DISABLE16C2552BTX /*处于接收状态*/
PTX16C2552B= &BYTX16C2552BBUFF[0];
PRX16C2552B= &BYRX16C2552BBUFF[0];
PTX16C2552BNOW = &BYTX16C2552BBUFF[0];
}
#pragma interrupt()
void IntIRQ2() /*A口中断*/
{
INT8U byFlag;
asm(" OR.W #$700,SR"); /*禁止中断*/
byFlag = sio_16c2552a.Interrupt_Id & 0xf;
if((byFlag == 0x4) || (byFlag == 0xc)) /*接收中断*/
{
while(sio_16c2552a.line_status & 0x01)
{
if((INT32U)PRX16C2552A < (INT32U)(&BYRX16C2552ABUFF[0]) + RX16C2552_LENGTH)
*PRX16C2552A++ = sio_16c2552a.data_io;
else
UARTERRFLAG |= UARTAREFULL;
}
}
else if(byFlag == 0x02) /*发送中断*/
{
while(((INT32U)PTX16C2552ANOW < (INT32U)PTX16C2552A) && (sio_16c2552a.line_status & 0x20)) /*有发送数据且THR为空*/
sio_16c2552a.data_io = *(PTX16C2552ANOW++);
if(((INT32U)PTX16C2552ANOW >= (INT32U)PTX16C2552A) && (sio_16c2552a.line_status & 0x40)) /*THR和TSR为空,发送完成*/
{
DISABLE16C2552ATX /*禁止发送中断,并处于接收状态*/
PTX16C2552A = &BYTX16C2552ABUFF[0];
}
}
}
#pragma interrupt()
void IntIRQ3() /*B口中断*/
{
INT8U byFlag;
asm(" OR.W #$700,SR"); /*禁止中断*/
byFlag= sio_16c2552b.Interrupt_Id & 0xf;
if((byFlag == 0x4) || (byFlag == 0xc)) /*接收中断*/
{
while(sio_16c2552b.line_status & 0x01)
{
if((INT32U)PRX16C2552B < (INT32U)(&BYRX16C2552BBUFF[0]) + RX16C2552_LENGTH)
*PRX16C2552B++ = sio_16c2552b.data_io;
else
UARTERRFLAG |= UARTBREFULL;
}
}
else if(byFlag == 0x02) /*发送中断*/
{
while(((INT32U)PTX16C2552BNOW < (INT32U)PTX16C2552B) && (sio_16c2552b.line_status & 0x20)) /*有发送数据且THR为空*/
sio_16c2552b.data_io = *(PTX16C2552ANOW++);
if(((INT32U)PTX16C2552BNOW >= (INT32U)PTX16C2552B) && (sio_16c2552b.line_status & 0x40)) /*THR和TSR为空,发送完成*/
{
DISABLE16C2552BTX /*禁止发送中断,并处于接收状态*/
PTX16C2552B = &BYTX16C2552BBUFF[0];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -