0

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

现在我没有使用中断。

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

在我看来,在轮询中,FIFO 或无 FIFO 差别不大,至少在波特率为 1200 时是如此。

4

2 回答 2

0

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

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

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

于 2013-06-17T08:25:10.803 回答
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。

于 2013-05-24T23:25:18.470 回答