[ZLG-ARM] LPC2132关于UART0的FIFO问题

[复制链接]
 楼主| xiaoIIhei 发表于 2007-11-6 15:09 | 显示全部楼层 |阅读模式
我现在做一个用LPC2132做RS485通讯的板子,我想问的是如何知道发送FIFO里的数据都己经发送完了。因为发送完成,我要把RS485的设置为接收模式。因为处理器太快,我把数据都送的UART0上后,不能立刻把RS485置为接收,这样的话,发送的数据还没有发送完,只能送出部分数据。<br /><br />有没有哪位做过这方面的朋友,给点建议。<br /><br />先谢谢了!
zlgarm 发表于 2007-11-6 17:17 | 显示全部楼层

re

您可以通过UART的状态寄存器U0LSR来判断UART是否发送完毕。具体那一位用来表示FIFO为空,请用户参考资料。实在是记不住。
 楼主| xiaoIIhei 发表于 2007-11-7 09:18 | 显示全部楼层

还是不行

这个我看过,没有查看发送FIFO为空的,只有“发送保持器空”和“发送器空”这两个标志位,还有就是查看U0RBR这个接收的是否为空的了,周工不知有没有别的办法查一下输出FIFO?<br /><br />
 楼主| xiaoIIhei 发表于 2007-11-7 09:29 | 显示全部楼层

己经解决

我现在改成没有FIFO的形式,就可以了,就是在发送程序中加入查询发送器是否为空的语句,这样虽占用资源但,数据发送更为可靠,说实话这个FIFO有点太小了,只用16个字节,要是多点就好了。下面列出我的程序,供有类型情况的朋友参考一下。<br />void&nbsp;UART0_SendByte(uint8&nbsp;dat)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&0x40)==0);//等待发送器为空<br />&nbsp;&nbsp;&nbsp;&nbsp;U0THR=dat;<br />}
andrew.xu 发表于 2007-11-7 13:59 | 显示全部楼层

这个问题我也碰到了

并且因为我的有校验位,像你这样也不行。即使发送器已经空了,但校验位还没发送完,所以如果立马切换就会把校验位丢了,现在是强制延时,挺郁闷的。
wgwwgw 发表于 2007-11-7 15:16 | 显示全部楼层

发送器为空时,就说明数据都己经发送完了

  
ARM_08 发表于 2007-11-10 13:19 | 显示全部楼层

FIFO为空不代表发送完毕

发送FIFO为空不表示数据发送完毕,因为可能发送移位寄存器的数据还没有发送完成,只有移位寄存器的数据发送出去才代表数据发送完成
andrew.xu 发表于 2007-11-10 13:25 | 显示全部楼层

楼上说的没错

它有U0THR和U0TSR,U0TSR就是移位寄存器,然而它就是全空了,还有个校验位和结束位没发,这才是问题所在
zhp521464 发表于 2007-11-14 16:20 | 显示全部楼层

就是哪个发送保持器空

THRE置为1时,除了表示发送保持器中没有数据外,也表示FIFO中也没有数据(前提使能FIFO),可以用中断多字节发.
luogs 发表于 2007-11-14 17:34 | 显示全部楼层

up

void&nbsp;UART1_SendBuf(const&nbsp;UINT8&nbsp;*buf,&nbsp;UINT32&nbsp;len)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U1IER&nbsp;&=&nbsp;(UINT8)(~0x02);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;关闭发送中断<br />&nbsp;&nbsp;&nbsp;&nbsp;UART1_Dir(UART_TX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltlen;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_SendByte(buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(U1LSR&0x20)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(U1LSR&0x40)==0&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_Dir(UART_RX);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;倒方向<br />}
汽车电子 发表于 2007-11-15 21:40 | 显示全部楼层

用中断,然后判断状态

  
MicroMMU 发表于 2007-11-16 12:58 | 显示全部楼层

“发送保持器空”和“发送器空”

两者容易产生误区&nbsp;
gumanzhou 发表于 2007-11-16 19:51 | 显示全部楼层

支持楼上

12楼:&nbsp;“发送保持器空”和“发送器空”<br /><br />使用时候是应该注意的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

47

帖子

1

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

16

主题

47

帖子

1

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