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