void Uart0_Callback(void)
{
if(RI)
{//接收到停止位进
RI = 0;
//Fill Buffer
mUART0.RxBuffer[mUART0.RxCnt++] = SBUF;
//Clear Idle Timer
mUART0.IdleTime = 0;
b_start_flag |= f_uart_rx_start;
//Clear Over Timer
mUART0.NoActTimes = 0;
mUART0.WaitAckTime = 0;
b_start_flag &=~f_wait_uart_start;
}
if(TI)
{//发送完数据的最后一位进
TI = 0;
//Fill Buffer
if(mUART0.TxCnt < mUART0.TxLen)
{
SBUF = mUART0.TxBuffer[mUART0.TxCnt++];
}
else
{
//复位发送计数器
mUART0.TxCnt = 0;
mUART0.TxLen = 0;
//开始超时计时
b_start_flag |= f_wait_uart_start;
}
}
}
void UART0_Open(void)
{
#ifdef UART0
//TX---P07---准双向
P07 = 1;
P0M1 &=~BIT7;
P0M2 &=~BIT7;
//RX---P06---准双向
P06 = 1;
P0M1 &=~BIT6;
P0M2 &=~BIT6;
SCON = 0x50; //UART0 Mode1,REN=1
TMOD |= 0x20; //Timer1 Mode2
PCON |= BIT7;
CKCON |= BIT4;
T3CON &= ~BIT5; //Serial port 0 baud rate clock source = Timer1
AUXR1 |= BIT2; //TX RX 调换位置
TH1 = 256 - (1037500/38400); /*16.6 MHz */
ES = 1; //UART0 中断使能
TR1 = 1; //打开TIMER1
#endif
//#ifdef UART1
// P02 = 1;
// P16 = 1;
// P0M1 &=~(BIT2);
// P0M2 &=~(BIT2);
// P1M1 &=~(BIT6);
// P1M2 &=~(BIT6);
//
// SCON_1 = 0X50; //UART1 Mode1,REN_1=1
// T3CON &=~BIT3;
// T3CON &=~(BIT0+BIT1+BIT2);//T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
//
// RH3 = (u8)(((65536 - (1037500/38400)) & 0XFF00)>>8); /*16.6 MHz */
// RL3 = (u8)(65536 - (1037500/38400)); /*16.6 MHz */
//
// EIE1 |= BIT0;//使能UART1中断
//
// T3CON |= BIT3;//使能定时器3
//#endif
}
static void Modify_HIRC_Value(void)//微调内部高速晶振,减少串口误码率
{
bit BIT_TMP;
unsigned char hircmap0,hircmap1;
unsigned int trimvalue16bit;
set_IAPEN;
IAPAL = 0x30;
IAPAH = 0x00;
IAPCN = 0X04;
set_IAPGO;
hircmap0 = IAPFD;
IAPAL = 0x31;
IAPAH = 0x00;
set_IAPGO;
hircmap1 = IAPFD;
clr_IAPEN;
trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01));
trimvalue16bit = trimvalue16bit - 15;
hircmap1 = trimvalue16bit&0x01;
hircmap0 = trimvalue16bit>>1;
TA=0XAA;
TA=0X55;
RCTRIM0 = hircmap0;
TA=0XAA;
TA=0X55;
RCTRIM1 = hircmap1;
}
|