2013-05-20 32 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寄存器)。