[ZLG-ARM] LPC2368的UART接受数据可用时,必须延时后才能写发送寄存器

[复制链接]
3882|2
 楼主| yyccaa 发表于 2008-5-13 15:08 | 显示全部楼层 |阅读模式
使用了smart2300的例程UART2_FDR,main.c里增加了以下测试代码:<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UARTBAUD&nbsp;&nbsp;&nbsp;&nbsp;115200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;预期得到的波特率<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;若该宏为0则不会启用小数分频器<br /><br />uint32&nbsp;delaycnt=2000;<br />uint32&nbsp;rccnt=0;<br /><br />int&nbsp;main(void)<br />{<br />......<br />&nbsp;&nbsp;&nbsp;&nbsp;UART2_SendStr(str);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;向串口发送字符串<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//while里增加了查询接收,接收一个字节然后返回该字节<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((U2LSR&1)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(mul=delaycnt;mul!=0;mul--);&nbsp;//等待<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U2LSR&1)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div=U2RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rccnt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U2THR=(uint8)div;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U2LSR&0x60)!=0x60);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(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 />不知道是否是芯片问题?
sunshine98 发表于 2008-5-14 13:12 | 显示全部楼层

我早就怀疑有问题了,呵呵

建议楼主不要超过19200,否则就不是很正常。hehe
lhzw2001 发表于 2008-6-6 21:37 | 显示全部楼层

他都有库给你了,为什么不用?

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

41

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部