N76E003 UART发送1Byte数据用时比接收用时长带来的误码问题
问题描述:使用单片机型号为N76E003AT20;
main函数
{
1、修改晶振为16.6MHz
2、uart0 初始化波特率115200
InitialUART0_Timer1(115200);
set_ES;
set_EA;
}
//中断服务函数
void SerialPort0_ISR(void) interrupt 4
{
u8 res;
if (RI)
{
SBUF_1 = SBUF;
clr_RI;
}
if(TI)
{
clr_TI;
}
}
程序如上,让单片机直接回传发送过去的数据,用CP2102串口模块连接到单片机的uart0两个管脚,并插到电脑上用串口调试助手XCOM进行调试。设置波特率115200,数据位8位,停止位1位,无校验,16进制发送和接收。
现象:XCOM每次发送一个字节(16进制发送),回传正常,例如发送0xaa,回传回来也是0xaa;XCOM一个发送两个字节,就出现误码了,例如发送0xaa 0xbb,回传回来就是0xaa 0xf7了。
分析:经多次试验,发现原因很可能是N76E003芯片uart发送一个字节用的时间比接收一个字节还要长,导致连续接收两个字节时,第二个字节接收到时前一个字节还没回传完导致误码。将XCOM上发送的停止位改为2位或1.5位,就回传正常了。停止位改长意味着相临两个字节的间隔变大,N76E003有足够的时间来完成前一个字节的回传。但是我们的应用要求停止位必须为1位,请问这个问题有其它解决方案吗?
- 问题补充 : 2018/06/11 20:52
uart0初始化函数为官方函数,模式1 void InitialUART0_Timer1(UINT32 u32Baudrate) { P06_Quasi_Mode; //tx pin P07_Quasi_Mode; //rx pin SCON = 0x50; //UART0 Mode1,REN=1,TI=0, Full Duplex, Enable Receive, Clear Transmit Interrupt Flag TMOD |= 0x20; //Timer1 Mode1 set_SMOD; //UART0 Double Rate Enable set_T1M; //tim1 clock as sys clock clr_BRCK; //Serial port 0 baud rate clock source = Timer1 #ifdef FOSC_160000 TH1 = 256 - (1000000/u32Baudrate+1); /*16 MHz */ #endif #ifdef FOSC_166000 TH1 = 256 - (1037500/u32Baudrate); /*16.6 MHz */ #endif set_TR1; set_TI; }
- 问题补充 : 2018/06/11 20:57
中断服务函数里的 SBUF_1 = SBUF; 应为SBUF = SBUF; 测试时有试过将数据转发到uart1,是一样的问题。
|