2013-05-20 31 views
0

好的,据我所知,在轮询模式下,我需要不断检查UART寄存器以接收和发送字符。我有这个工作,下一步是处理FIFO。 我启用它,并没有机会读/写操作,一切仍然以过去的方式工作。UART - 在轮询模式下使用FIFO

现在我不使用中断。

为了专门利用FIFO模式而不是仅仅探测TX和RX寄存器,我需要做什么?

在我看来,在轮询,FIFO或没有FIFO差别不大,至少在波特率为1200

回答

0

轮询FIFO VS轮询非FIFO的想法:

1)对于这两种输入&输出,您可能有一个IsXmitFull()和IsRcvNotEmpty()例程。小心使用否定这些功能。

// Say you want to test is all the data is transmitted 
if (!IsXmitFull()) { // This is OK in non-FIFO poling, but not in FIFO polling. 
// You need a new `ISXmitEmpty()` function. This function not only tests if the shift register is empty but also the FIFO. 

2)如果你正在做的RS-485(共享发射/接收线路),则需要以观察更大的延迟你改变总线的方向之前,FIFO引起。

3)当你收到一个错误,你的纠正措施(重新设置PIC的UART)往往会影响到更多的数据 - 就像失去了得罪字节,未来1,2或3

4)如果您进入低功耗/时钟速度模式,观察FIFO的延迟。 (确保所有数据在放慢时钟之前都已经出来)

5)如果您使用XON/XOFF手抖动,请再次注意FIFO增加延迟问题。

6)可能还有一些其他的奥术问题,但TTFN。

0

正确的,对于轮询,FIFO或非FIFO没有区别。位5或LSR寄存器指示THR寄存器是否为空。在FIFO模式下,该位只是告诉FIFO是否为空(LSR的第6位也是如此,但这也表示tx传输是否完成)。 通过轮询,不可能知道什么是tx FIFO的当前深度。

在一些UART中,有一个特殊的THRE(发送保持寄存器为空)中断模式,如果使能,它将切换LSR [5]的功能以指示tx FIFO是否已满。这是有用的,因为我们可以连续写入tx FIFO直到该位变为1.

对于数据接收,无论是否处于FIFO模式,LSR [0]指示数据是否可用于读取(不论是否为或来自FIFO或RBR寄存器)。