好的,据我所知,在轮询模式下,我需要不断检查UART寄存器以接收和发送字符。我有这个工作,下一步是处理FIFO。 我启用它并且没有机会进行读/写操作,一切仍然按照以前的方式工作。
目前我没有使用中断。
为了专门利用FIFO模式而不仅仅是探测TX和RX寄存器,我还需要做些什么吗?
在我看来,在轮询中,FIFO或没有FIFO几乎没有区别,至少在波特率为1200时。
答案 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寄存器)。