| 
 
| 使用了smart2300的例程UART2_FDR,main.c里增加了以下测试代码:<br /><br />#define        UARTBAUD    115200                // 预期得到的波特率<br />#define        FDR            0                    // 若该宏为0则不会启用小数分频器<br /><br />uint32 delaycnt=2000;<br />uint32 rccnt=0;<br /><br />int main(void)<br />{<br />......<br />    UART2_SendStr(str);                        // 向串口发送字符串<br /><br />    while (1)    //while里增加了查询接收,接收一个字节然后返回该字节<br />    {<br />        if((U2LSR&1)!=0)<br />        {<br />            for(mul=delaycnt;mul!=0;mul--); //等待<br />            while((U2LSR&1)!=0)<br />            {<br />                div=U2RBR;<br />                rccnt++;<br />            }<br />            <br />            U2THR=(uint8)div;<br />            while((U2LSR&0x60)!=0x60);<br />        }<br />    }<br /><br />    return (0);<br />}<br /><br />其它未改变,即fifo是禁用的,接收深度1个字节,mcu为LPC2368。<br /><br />delaycnt的延时如果太小(比如2000),那么mcu发送的数据是错误的或没有发送,但增大到4100以上,就正常了。上位机发送是手动方式(5秒1次左右),mcu的rccnt计数表明,不论delaycnt延时大小,接收次数与pc的发送次数是一致的。<br />如果程序改为,只有mcu循环发送数据给pc,那么数据都是正确的。<br />即UART2接收数据可用时,必须延时一定时间后,对发送保持寄存器的写入才是有效的,否则发送丢失。<br />延时时间与波特率有关,当115200时,需要330us以上,而2400时,可能是100us多。<br />该现象与fifo是否禁用无关。<br />如果使用中断方式接收,读出U2IIR后,也必须延时(时间和查询下基本一样)后才能写U2THR(无论发送写入否在中断里)。<br />如果开启fifo,接收深度1字节,在接收中断里,如果在延时不够下连续写入3个字节,那么发送fifo空中断可发生3次,但数据可能并未正确发送出去。(fifo不会溢出,因为pc是手动发送,非常慢)<br /><br />不知道是否是芯片问题? | 
 |