UART - 在轮询模式下使用FIFO

时间:2013-05-20 17:28:55

标签: linux kernel uart

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

目前我没有使用中断。

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

在我看来,在轮询中,FIFO或没有FIFO几乎没有区别,至少在波特率为1200时。

2 个答案:

答案 0 :(得分:0)

轮询FIFO与轮询非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。

答案 1 :(得分: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寄存器)。

相关问题