使用了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 />不知道是否是芯片问题? |
|