UART串口通信的簡介
計算機和外部設備的連接,基本上使用了兩類接口:串行接口和並行接口。並行接口是指數據的各個位同時進行傳送,其特點是傳輸速度塊,但當傳輸距離遠、位數又多時,通信線路變複雜且成本提高。串行通信是指數據一位位地順序傳送,其特點是適合於遠距離通信,通信線路簡單,只要一對傳輸線就可以實現雙向通信,從而大大降低了成本。
串行通信又分爲異步和同步兩類。UART(Universal Asynchronous Receiver/Transmitter,通用異步收發器)正是設備間進行異步通信的關鍵模塊。它的重要作用如下所示:
處理數據總路線和串行口之間的串/並、並/串轉換;
通信雙方只要採用相同的幀格式和波特率,就能在未共享時鐘信號的情況下,僅用兩根信號線(Rx 和Tx)就可以完成通信過程;
採用異步方式,數據收發完畢後,可通過中斷或置位標誌位的方式通知微控制器進行處理,大大提高微控制器的工作效率。
若加入一個合適的電平轉換器,如SP3232E、SP3485,UART 還能用於RS-232、RS-485 通信,或和計算機的端口連接。UART 應用非常廣泛,手機、工業控制、PC 等應用中都要用到UART。
1. 發送/接收邏輯
發送邏輯對從發送FIFO 讀取的數據執行“並→串”轉換。控制邏輯輸出起始位在先的串行位流,並且根據控制寄存器中已編程的配置,會面緊跟着數據位(注意:最低位 LSB 先輸出)、奇偶校驗位和停止位。
在檢測到一個有效的起始脈衝後,接收邏輯對接收到的位流執行“串→並”轉換。此外還會對溢出錯誤、奇偶校驗錯誤、幀錯誤和線中止(line-break)錯誤進行檢測,並將檢測到的狀態附加到被寫入接收FIFO 的數據中。
2. 波特率的產生
波特率除數(baud-rate divisor)是一個22 位數,它由16 位整數和6 位小數組成。波特率發生器使用這兩個值組成的數字來決定位週期。通過帶有小數波特率的除法器,在足夠高的系統時鐘速率下,UART 可以產生所有標準的波特率,而誤差很小。
3. 數據收發
發送時,數據被寫入發送FIFO。如果UART 被使能,則會按照預先設置好的參數(波特率、數據位、停止位、校驗位等)開始發送數據,一直到發送FIFO 中沒有數據。一旦向發送FIFO 寫數據(如果FIFO 未空),UART 的忙標誌位BUSY 就有效,並且在發送數據期間一直保持有效。BUSY 位僅在發送FIFO 爲空,且已從移位寄存器發送最後一個字符,包括停止位時才變無效。即 UART 不再使能,它也可以指示忙狀態。BUSY 位的相關庫函數是UARTBusy( )
在UART 接收器空閒時,如果數據輸入變成“低電平”,即接收到了起始位,則接收計數器開始運行,並且數據在Baud16 的第8 個週期被採樣。如果Rx 在Baud16 的第8 週期仍然爲低電平,則起始位有效,否則會被認爲是錯誤的起始位並將其忽略。
如果起始位有效,則根據數據字符被編程的長度,在 Baud16 的每第 16 個週期對連續的數據位(即一個位週期之後)進行採樣。如果奇偶校驗模式使能,則還會檢測奇偶校驗位。
最後,如果Rx 爲高電平,則有效的停止位被確認,否則發生幀錯誤。當接收到一個完整的字符時,將數據存放在接收FIFO 中。
4. 中斷控制
出現以下情況時,可使UART 產生中斷:
FIFO 溢出錯誤
線中止錯誤(line-break,即Rx 信號一直爲0 的狀態,包括校驗位和停止位在內)
奇偶校驗錯誤
幀錯誤(停止位不爲1)
接收超時(接收FIFO 已有數據但未滿,而後續數據長時間不來)
發送
接收
由於所有中斷事件在發送到中斷控制器之前會一起進行“或運算”操作,所以任意時刻 UART 只能向中斷產生一箇中斷請求。通過查詢中斷狀態函數UARTIntStatus( ),軟件可以在同一個中斷服務函數裏處理多箇中斷事件(多個並列的if 語句)。
5. FIFO 操作 FIFO 是“First-In First-Out”的縮寫,意爲“先進先出”,是一種常見的隊列操作。 Stellaris 系列ARM 的UART 模塊包含有2 個16 字節的FIFO:一個用於發送,另一個用於接收。可以將兩個FIFO 分別配置爲以不同深度觸發中斷。可供選擇的配置包括:1/8、 1/4、1/2、3/4 和7/8 深度。例如,如果接收FIFO 選擇1/4,則在UART 接收到4 個數據時產生接收中斷。
發送FIFO的基本工作過程: 只要有數據填充到發送FIFO 裏,就會立即啓動發送過程。由於發送本身是個相對緩慢的過程,因此在發送的同時其它需要發送的數據還可以繼續填充到發送 FIFO 裏。當發送 FIFO 被填滿時就不能再繼續填充了,否則會造成數據丟失,此時只能等待。這個等待並不會很久,以9600 的波特率爲例,等待出現一個空位的時間在1ms 上下。發送 FIFO 會按照填入數據的先後順序把數據一個個發送出去,直到發送 FIFO 全空時爲止。已發送完畢的數據會被自動清除,在發送FIFO 裏同時會多出一個空位。
接收FIFO的基本工作過程: 當硬件邏輯接收到數據時,就會往接收FIFO 裏填充接收到的數據。程序應當及時取走這些數據,數據被取走也是在接收FIFO 裏被自動刪除的過程,因此在接收 FIFO 裏同時會多出一個空位。如果在接收 FIFO 裏的數據未被及時取走而造成接收FIFO 已滿,則以後再接收到數據時因無空位可以填充而造成數據丟失。
收發FIFO 主要是爲了解決UART 收發中斷過於頻繁而導致CPU 效率不高的問題而引入的。在進行 UART 通信時,中斷方式比輪詢方式要簡便且效率高。但是,如果沒有收發 FIFO,則每收發一個數據都要中斷處理一次,效率仍然不夠高。如果有了收發FIFO,則可以在連續收發若干個數據(可多至14 個)後才產生一次中斷然後一併處理,這就大大提高了收發效率。
完全不必要擔心FIFO 機制可能帶來的數據丟失或得不到及時處理的問題,因爲它已經幫你想到了收發過程中存在的任何問題,只要在初始化配置UART 後,就可以放心收發了, FIFO 和中斷例程會自動搞定一切。
6. 迴環操作
UART 可以進入一個內部迴環(Loopback)模式,用於診斷或調試。在迴環模式下,從Tx 上發送的數據將被Rx 輸入端接收。
7. 串行紅外協議
在某些 Stellaris 系列 ARM 芯片裏,UART 還包含一個 IrDA 串行紅外(SIR)編碼器/ 解碼器模塊。IrDA SIR 模塊的作用是在異步UART 數據流和半雙工串行SIR 接口之間進行轉換。片上不會執行任何模擬處理操作。SIR 模塊的任務就是要給UART 提供一個數字編碼輸出和一個解碼輸入。UART 信號管腳可以和一個紅外收發器連接以實現IrDA SIR 物理層連接。
如圖所示,爲UART 的IrDA SIR 模塊基本應用電路。D1 爲紅外發射管,Q2 爲紅外接收管。
⑴輸出緩衝寄存器,它接收CPU從數據總線上送來的並行數據,並加以保存。
⑵ 輸出移位寄存器,它接收從輸出緩衝器送來的並行數據,以發送時鐘的速率把數據逐位移出,即將並行數據轉換爲串行數據輸出。
⑶ 輸入移位寄存器,它以接收時鐘的速率把出現在串行數據輸入線上的數據逐位移入,當數據裝滿後,並行送往輸入緩衝寄存器,即將串行數據轉換成並行數據。
⑷ 輸入緩衝寄存器,它從輸入移位寄存器中接收並行數據,然後由CPU取走。
⑸ 控制寄存器,它接收CPU送來的控制字,由控制字的內容,決定通信時的傳輸方式以及數據格式等。例如採用異步方式還是同步方式,數據字符的位數,有無奇偶校驗,是奇校驗還是偶校驗,停止位的位數等參數。
⑹狀態寄存器。狀態寄存器中存放着接口的各種狀態信息,例如輸出緩衝區是否空,輸入字符是否準備好等。在通信過程中,當符合某種狀態時,接口中的狀態檢測邏輯將狀態寄存器的相應位置“1”,以便讓CPU查詢。
① 起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。
② 數據位:緊接着起始位之後。數據位的個數可以是4、5、6、7、8等,構成一個字符。通常採用ASCII碼。從最低位開始傳送,靠時鐘定位。
③ 奇偶校驗位:數據位加上這一位後,使得“1” 的位數應爲偶數(偶校驗)或奇數(奇校驗),以此來校驗數據傳送的正確性。
④ 停止位:它是一個字符數據的結束標誌。可以是1位、1.5位、2位的高電平。
⑤空閒位:處於邏輯“1”狀態,表示當前線路上沒有數據傳送。
————————————————————轉自電子發燒友網