好的,據我所知,在輪詢模式下,我需要不斷檢查UART寄存器以接收和發送字符。我有這個工作,下一步是處理FIFO。 我啓用它,並沒有機會讀/寫操作,一切仍然以過去的方式工作。UART - 在輪詢模式下使用FIFO
現在我不使用中斷。
爲了專門利用FIFO模式而不是僅僅探測TX和RX寄存器,我需要做什麼?
在我看來,在輪詢,FIFO或沒有FIFO差別不大,至少在波特率爲1200
好的,據我所知,在輪詢模式下,我需要不斷檢查UART寄存器以接收和發送字符。我有這個工作,下一步是處理FIFO。 我啓用它,並沒有機會讀/寫操作,一切仍然以過去的方式工作。UART - 在輪詢模式下使用FIFO
現在我不使用中斷。
爲了專門利用FIFO模式而不是僅僅探測TX和RX寄存器,我需要做什麼?
在我看來,在輪詢,FIFO或沒有FIFO差別不大,至少在波特率爲1200
輪詢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。
正確的,對於輪詢,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寄存器)。