UART

UART編程


  UART傳輸結構UART:Universal Asynchronous Receiver/Transmitter,通用異步接收/發送裝置,UART是一個並行輸入成爲串行輸出的芯片,一般集成在主板上,多數是16550AFN芯片。
UART由於計算機內部採用並行數據,不能直接把數據發到Modem,必須通過UART整理才能進行異步傳輸,其過程爲:CPU先把準備寫入串行設備的數據放到UART的寄存器(臨時內存塊)中,再經過FIFO(First Input First Output,先入先出隊列)傳送到串行設備,如果沒有FIFO,信息將變得雜亂無章,不可能傳送到Modem。
它是用於控制計算機與串行設備的芯片。有一點要注意的是,它提供了RS-232C數據終端設備接口,這樣計算機就能夠和調制解調器或其它使用RS-232C接口的串行設備通訊了。做爲接口的一部分,UART還提供如下功能:將由計算機內部傳送過來的並行數據轉換爲輸出的串行數據流。將計算機外部來的串行數據轉換爲字節,供計算機內部並行數據的器件使用。在輸出的串行數據流中加入奇偶校驗位,並對從外部接收的數據流進行奇偶校驗。在輸出數據流中加入啓停標記,並從接收數據流中刪除啓停標記。處理由鍵盤或鼠標發出的中斷信號(鍵盤和鼠標也是串行設備)。能夠處理計算機與外部串行設備的同步管理問題。有一些比較高檔的UART還提供輸入輸出數據的緩衝區,如今比較新的UART是16550,它能夠在計算機須要處理數據前在其緩衝區內存儲16字節數據,而一般的UART是8250。如今若是您購買一個內置的調制解調器,此調制解調器內部一般就會有16550 UART。
定義UART是一種通用串行數據總線,用於異步通訊。該總線雙向通訊,能夠實現全雙工傳輸和接收。在嵌入式設計中,UART用來主機與輔助設備通訊,如汽車音響與外接AP之間的通訊,與PC機通訊包括與監控調試器和其它器件,如EEPROM通訊。
通訊UART首先將接收到的並行數據轉換成串行數據來傳輸。消息幀從一個低位起始位開始,後面是5~8個數據位,一個可用的奇偶位和一個或幾個高位中止位。接收器發現開始位時它就知道數據準備發送,並嘗試與發送器時鐘頻率同步。若是選擇了奇偶,UART就在數據位後面加上奇偶位。奇偶位可用來幫助錯誤校驗。
在接收過程當中,UART從消息幀中去掉起始位和結束位,對進來的字節進行奇偶校驗,並將數據字節從串行轉換成並行。UART也產生額外的信號來指示發送和接收的狀態。例如,若是產生一個奇偶錯誤,UART就置位奇偶標誌。
通訊速度數據傳輸能夠首先從最低有效位(LSB)開始。然而,有些UART容許靈活選擇先發送最低有效位或最高有效位(MSB)。
微控制器中的UART傳送數據的速度範圍爲每秒幾百位到1.5Mb。例如,嵌入在ElanSC520微控制器中的高速UART通訊的速度能夠高達1.152Mbps。UART波特率還受發送和接收線對距離(線長度)的影響。
目前,市場上有隻支持異步通訊和同時支持異步與同步通訊的兩種硬件可用於UART。前者就是UART名字自己的含義,在摩托羅拉微控制器中被稱爲串行通訊接口(SCI);Microchip微控制器中的通用同步異步收發器(USART)和在富士通微控制器中的UART是後者的兩個典型例子。
計算機UART是計算機中串行通訊端口的關鍵部分。在計算機中,UART相連於產生兼容RS232規範信號的電路。RS232標準定義邏輯「1」信號相對於地爲-3到-15伏,而邏輯「0」相對於地爲+3到+15伏。因此,當一個微控制器中的UART相連於PC時,它須要一個RS232驅動器來轉換電平。
Uart這裏指的是TTL電平的串口;RS232指的是RS232電平的串口。
TTL電平是5V的,而RS232是負邏輯電平,它定義+5~+12V爲低電平,而-12~-5V爲高電平。
Uart串口的RXD、TXD等通常直接與處理器芯片的引腳相連,而RS232串口的RXD、TXD等通常須要通過電平轉換(一般由Max232等芯片進行電平轉換)才能接處處理器芯片的引腳上,不然這麼高的電壓極可能會把芯片燒壞。
咱們平時所用的電腦的串口就是RS232的,當咱們在作電路工做時,應該注意下外設的串口是Uart類型的仍是RS232類型的,若是不匹配,應當找個轉換線(一般這根轉換線內有塊相似於Max232的芯片作電平轉換工做的),可不能盲目地將兩串口相連。
Uart協議UART做爲異步串口通訊協議的一種,工做原理是將傳輸數據的每一個字符一位接一位地傳輸。
其中各位的意義以下:
起始位:先發出一個邏輯」0」的信號,表示傳輸字符的開始。
資料位:緊接着起始位以後。資料位的個數能夠是四、五、六、七、8等,構成一個字符。一般採用ASCII碼。從最低位開始傳送,靠時鐘定位。
奇偶校驗位:資料位加上這一位後,使得「1」的位數應爲偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。
中止位:它是一個字符數據的結束標誌。能夠是1位、1.5位、2位的高電平。 因爲數據是在傳輸線上定時的,而且每個設備有其本身的時鐘,極可能在通訊中兩臺設備間出現了小小的不一樣步。所以中止位不只僅是表示傳輸的結束,而且提供計算機校訂時鐘同步的機會。適用於中止位的位數越多,不一樣時鐘同步的容忍程度越大,可是數據傳輸率同時也越慢。
空閒位:處於邏輯「1」狀態,表示當前線路上沒有資料傳送。
波特率:是衡量資料傳送速率的指標。表示每秒鐘傳送的二進制位數。例如資料傳送速率爲120字符/秒,而每個字符爲10位,則其傳送的波特率爲10×120=1200位/秒=1200波特。
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/八、 1/四、1/二、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 爲紅外接收管。
UART的基本結構及端口介紹
⑴輸出緩衝寄存器,它接收CPU從數據總線上送來的並行數據,並加以保存。
⑵ 輸出移位寄存器,它接收從輸出緩衝器送來的並行數據,以發送時鐘的速率把數據逐位移出,即將並行數據轉換爲串行數據輸出。
⑶ 輸入移位寄存器,它以接收時鐘的速率把出如今串行數據輸入線上的數據逐位移入,當數據裝滿後,並行送往輸入緩衝寄存器,即將串行數據轉換成並行數據。
⑷ 輸入緩衝寄存器,它從輸入移位寄存器中接收並行數據,而後由CPU取走。
⑸控制寄存器,它接收CPU送來的控制字,由控制字的內容,決定通訊時的傳輸方式以及數據格式等。例如採用異步方式仍是同步方式,數據字符的位數,有無奇偶校驗,是奇校驗仍是偶校驗,中止位的位數等參數。
⑹狀態寄存器。狀態寄存器中存放着接口的各類狀態信息,例如輸出緩衝區是否空,輸入字符是否準備好等。在通訊過程當中,當符合某種狀態時,接口中的狀態檢測邏輯將狀態寄存器的相應位置「1」,以便讓CPU查詢。
編輯本段設計思想數據發送的思想是,當啓動字節發送時,經過TxD先發起始位,而後發數據位和奇偶數效驗位,最後再發中止位,發送過程由發送狀態機控制,每次中斷只發送1個位,通過若干個定時中斷完成1個字節幀的發送。
數據接收的思想是,當不在字節幀接收過程時,每次定時中斷以3倍的波特率監視RxD的狀態,當其連續3次採樣電平依次爲一、0、0時,就認爲檢測到了起始位,則開始啓動一次字節幀接收,字節幀接收過程由接收狀態機控制,每次中斷只接收1個位,通過若干個定時中斷完成1個字節幀的接收。
爲了提升串口的性能,在發送和接收上都實現了FIFO功能,提升通訊的實時性。FIFO的長度能夠進行自由定義,適應用戶的不一樣須要。
波特率的計算按照計算公式進行,在設置最高波特率時必定要考慮模擬串口程序代碼的執行時間,該定時時間必須大於模擬串口的程序的規定時間。單片機的執行速度越快,則能夠實現更高的串口通信速度。數組