UART即為Universal Asynchronous Receiver/Transmitter,譯�通用異步收發(fā)�。UART是設(shè)備間�(jìn)行異步通信的關(guān)鍵模�,用于控制計(jì)算機(jī)與串行設(shè)備的芯片。它提供了RS-232C�(shù)�(jù)終端�(shè)備接口,這樣�(jì)算機(jī)就可以和�(diào)�解調(diào)�或其它使用RS-232C接口的串行設(shè)備通信��
�(jì)算機(jī)與外部設(shè)備的連接,基本上使用了兩類接口:串行接口與并行接�。并行接口是指數(shù)�(jù)的各�(gè)位同�(shí)�(jìn)行傳送,其特�(diǎn)是傳輸速度�,但�(dāng)傳輸距離�(yuǎn)、位�(shù)又多�(shí),通信線路變復(fù)雜且成本提高。串行通信是指�(shù)�(jù)一位位地順序傳送,其特�(diǎn)是適合于�(yuǎn)距離通信,通信線路簡單,只要一對傳輸線就可以實(shí)�(xiàn)雙向通信,從而大大降低了成本�
串行通信又分為異步與同步兩類。UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器)正是�(shè)備間�(jìn)行異步通信的關(guān)鍵模�。它的重要作用如下所示:
處理�(shù)�(jù)總路線和串行口之間的�/并、并/串轉(zhuǎn)��
通信雙方只要采用相同的幀格式和波特率,就能在未共享時(shí)鐘信號的情況�,僅用兩根信號線(Rx 和Tx)就可以完成通信過程�
采用異步方式,數(shù)�(jù)收發(fā)完畢后,可通過中斷或置位標(biāo)志位的方式通知微控制器�(jìn)行處�,大大提高微控制器的工作效率�
若加入一�(gè)合適的電平轉(zhuǎn)換器,如SP3232E、SP3485,UART 還能用于RS-232、RS-485 通信,或與計(jì)算機(jī)的端口連接。UART �(yīng)用非常廣�,手�(jī)、工�(yè)控制、PC 等應(yīng)用中都要用到UART�
1� �(fā)�/接收邏輯
�(fā)送邏輯對從發(fā)送FIFO 讀取的�(shù)�(jù)�(zhí)行“并→串”轉(zhuǎn)�??刂七壿嬢敵銎鹗嘉辉谙鹊拇形涣鳎⑶腋�?jù)控制寄存器中已編程的配置,會面緊跟著�(shù)�(jù)位(注意:位 LSB 先輸出)、奇偶校�(yàn)位和停止位�
在檢測到一�(gè)有效的起始脈沖后,接收邏輯對接收到的位流�(zhí)行“串→并”轉(zhuǎn)換。此外還會對溢出�(cuò)�、奇偶校�(yàn)�(cuò)�、幀�(cuò)誤和線中止(line-break)錯(cuò)誤�(jìn)行檢測,并將檢測到的狀�(tài)附加到被寫入接收FIFO 的數(shù)�(jù)��
2� 波特率的�(chǎn)�
波特率除�(shù)(baud-rate divisor)是一�(gè)22 位數(shù),它�16 位整�(shù)�6 位小�(shù)組成。波特率�(fā)生器使用這兩�(gè)值組成的�(shù)字來決定位周�。通過帶有小數(shù)波特率的除法�,在足夠高的系統(tǒng)�(shí)鐘速率�,UART 可以�(chǎn)生所有標(biāo)�(zhǔn)的波特率,而誤差很��
3� �(shù)�(jù)收發(fā)
�(fā)送時(shí),數(shù)�(jù)被寫入發(fā)送FIFO。如果UART 被使�,則會按照預(yù)先設(shè)置好的參�(shù)(波特率、數(shù)�(jù)�、停止位、校�(yàn)位等)開始發(fā)送數(shù)�(jù),一直到�(fā)送FIFO 中沒有數(shù)�(jù)。一旦向�(fā)送FIFO 寫數(shù)�(jù)(如果FIFO 未空),UART 的忙�(biāo)志位BUSY 就有�,并且在�(fā)送數(shù)�(jù)期間一直保持有效。BUSY 位僅在發(fā)送FIFO 為空,且已從移位寄存器發(fā)送一�(gè)字符,包括停止位�(shí)才變無效。即 UART 不再使能,它也可以指示忙狀�(tài)。BUSY 位的相關(guān)庫函�(shù)是UARTBusy( )
在UART 接收器空閑時(shí),如果數(shù)�(jù)輸入變成“低電平�,即接收到了起始位,則接收計(jì)�(shù)器開始運(yùn)�,并且數(shù)�(jù)在Baud16 的第8 �(gè)周期被采�。如果Rx 在Baud16 的第8 周期仍然為低電平,則起始位有�,否則會被認(rèn)為是�(cuò)誤的起始位并將其忽略�
如果起始位有�,則根據(jù)�(shù)�(jù)字符被編程的長度,在 Baud16 的每� 16 �(gè)周期對連續(xù)的數(shù)�(jù)位(即一�(gè)位周期之后)�(jìn)行采�。如果奇偶校�(yàn)?zāi)J绞�?,則還會檢測奇偶校驗(yàn)��
,如果Rx 為高電平,則有效的停止位被確�(rèn),否則發(fā)生幀�(cuò)�。當(dāng)接收到一�(gè)完整的字符時(shí),將�(shù)�(jù)存放在接收FIFO ��
4� 中斷控制
出現(xiàn)以下情況�(shí),可使UART �(chǎn)生中斷:
FIFO 溢出�(cuò)�
線中止錯(cuò)誤(line-break,即Rx 信號一直為0 的狀�(tài),包括校�(yàn)位和停止位在�(nèi)�
奇偶校驗(yàn)�(cuò)�
幀�(cuò)誤(停止位不�1�
接收超時(shí)(接收FIFO 已有�(shù)�(jù)但未�,而后�(xù)�(shù)�(jù)長時(shí)間不來)
�(fā)�
接收
由于所有中斷事件在�(fā)送到中斷控制器之前會一起�(jìn)行“或�(yùn)算”操�,所以任意時(shí)� UART 只能向中斷產(chǎn)生一�(gè)中斷請求。通過查詢中斷狀�(tài)函數(shù)UARTIntStatus( ),軟件可以在同一�(gè)中斷服務(wù)函數(shù)里處理多�(gè)中斷事件(多�(gè)并列的if 語句)�
5� FIFO 操作 FIFO 是“First-In First-Out”的縮寫,意為“先�(jìn)先出�,是一種常見的�(duì)列操�� Stellaris 系列ARM 的UART 模塊包含�2 �(gè)16 字節(jié)的FIFO:一�(gè)用于�(fā)�,另一�(gè)用于接收??梢詫蓚€(gè)FIFO 分別配置為以不同深度觸發(fā)中斷??晒┻x擇的配置包括�1/8� 1/4�1/2�3/4 �7/8 深度。例�,如果接收FIFO 選擇1/4,則在UART 接收�4 �(gè)�(shù)�(jù)�(shí)�(chǎn)生接收中��
�(fā)送FIFO的基本工作過程: 只要有數(shù)�(jù)填充到發(fā)送FIFO 里,就會立即啟動�(fā)送過�。由于發(fā)送本身是�(gè)相對緩慢的過程,因此在發(fā)送的同時(shí)其它需要發(fā)送的�(shù)�(jù)還可以繼�(xù)填充到發(fā)� FIFO �。當(dāng)�(fā)� FIFO 被填滿時(shí)就不能再繼續(xù)填充了,否則會造成�(shù)�(jù)丟失,此�(shí)只能等待。這�(gè)等待并不會很�,以9600 的波特率為例,等待出�(xiàn)一�(gè)空位的時(shí)間在1ms 上下。發(fā)� FIFO 會按照填入數(shù)�(jù)的先后順序把�(shù)�(jù)一�(gè)�(gè)�(fā)送出�,直到發(fā)� FIFO 全空�(shí)為止。已�(fā)送完畢的�(shù)�(jù)會被自動清除,在�(fā)送FIFO 里同�(shí)會多出一�(gè)空位�
接收FIFO的基本工作過程: �(dāng)硬件邏輯接收到數(shù)�(jù)�(shí),就會往接收FIFO 里填充接收到的數(shù)�(jù)。程序應(yīng)�(dāng)及時(shí)取走這些�(shù)�(jù),數(shù)�(jù)被取走也是在接收FIFO 里被自動刪除的過�,因此在接收 FIFO 里同�(shí)會多出一�(gè)空位。如果在接收 FIFO 里的�(shù)�(jù)未被及時(shí)取走而造成接收FIFO 已滿,則以后再接收到�(shù)�(jù)�(shí)因無空位可以填充而造成�(shù)�(jù)丟失�
收發(fā)FIFO 主要是為了解決UART 收發(fā)中斷過于頻繁而導(dǎo)致CPU 效率不高的問題而引入的。在�(jìn)� UART 通信�(shí),中斷方式比輪詢方式要簡便且效率�。但�,如果沒有收�(fā) FIFO,則每收�(fā)一�(gè)�(shù)�(jù)都要中斷處理一�,效率仍然不夠高。如果有了收�(fā)FIFO,則可以在連續(xù)收發(fā)若干�(gè)�(shù)�(jù)(可多至14 �(gè))后才產(chǎn)生一次中斷然后一并處�,這就大大提高了收�(fā)效率�
完全不必要擔(dān)心FIFO �(jī)制可能帶來的�(shù)�(jù)丟失或得不到及時(shí)處理的問�,因?yàn)樗呀?jīng)幫你想到了收�(fā)過程中存在的任何問題,只要在初始化配置UART �,就可以放心收發(fā)了, FIFO 和中斷例程會自動搞定一��
6� 回環(huán)操作
UART 可以�(jìn)入一�(gè)�(nèi)部回�(huán)(Loopback)模�,用于診斷或�(diào)�。在回環(huán)模式�,從Tx 上發(fā)送的�(shù)�(jù)將被Rx 輸入端接��
7� 串行紅外�(xié)�
在某� Stellaris 系列 ARM 芯片�,UART 還包含一�(gè) IrDA 串行紅外(SIR)編碼器/ 解碼器模�。IrDA SIR 模塊的功能是在異步UART �(shù)�(jù)流和半雙工串行SIR 接口之間�(jìn)行轉(zhuǎn)�。片上不會執(zhí)行任何模擬處理操�。SIR 模塊的任�(wù)就是要給UART 提供一�(gè)�(shù)字編碼輸出和一�(gè)解碼輸入。UART 信號管腳可以與一�(gè)紅外收發(fā)器連接以實(shí)�(xiàn)IrDA SIR 物理層連接�
如圖所�,為UART 的IrDA SIR 模塊基本�(yīng)用電�。D1 為紅外發(fā)射管,Q2 為紅外接收管�
⑴輸出緩沖寄存器,它接收CPU從數(shù)�(jù)總線上送來的并行數(shù)�(jù),并加以保存�
?�?輸出移位寄存�,它接收從輸出緩沖器送來的并行數(shù)�(jù),以�(fā)送時(shí)鐘的速率把數(shù)�(jù)逐位移出,即將并行數(shù)�(jù)�(zhuǎn)換為串行�(shù)�(jù)輸出�
?�?輸入移位寄存器,它以接收�(shí)鐘的速率把出�(xiàn)在串行數(shù)�(jù)輸入線上的數(shù)�(jù)逐位移入,當(dāng)�(shù)�(jù)裝滿�,并行送往輸入緩沖寄存�,即將串行數(shù)�(jù)�(zhuǎn)換成并行�(shù)�(jù)�
?�?輸入緩沖寄存器,它從輸入移位寄存器中接收并行�(shù)�(jù),然后由CPU取走�
� 控制寄存�,它接收CPU送來的控制字,由控制字的�(nèi)�,決定通信�(shí)的傳輸方式以及數(shù)�(jù)格式�。例如采用異步方式還是同步方式,�(shù)�(jù)字符的位�(shù),有無奇偶校�(yàn),是奇校�(yàn)還是偶校�(yàn),停止位的位�(shù)等參�(shù)�
⑹狀�(tài)寄存�。狀�(tài)寄存器中存放著接口的各種狀�(tài)信息,例如輸出緩沖區(qū)是否�,輸入字符是否準(zhǔn)備好�。在通信過程�,當(dāng)符合某種狀�(tài)�(shí),接口中的狀�(tài)檢測邏輯將狀�(tài)寄存器的相應(yīng)位置�1�,以便讓CPU查詢�
?�?起始位:先發(fā)出一�(gè)邏輯�0”信號,表示傳輸字符的開��
� �(shù)�(jù)位:緊接著起始位之后。數(shù)�(jù)位的�(gè)�(shù)可以�4�5�6�7�8等,�(gòu)成一�(gè)字符。通常采用ASCII碼。從位開始傳�,靠�(shí)鐘定位�
?�?奇偶校驗(yàn)位:�(shù)�(jù)位加上這一位后,使得�1� 的位�(shù)�(yīng)為偶�(shù)(偶校�(yàn))或奇�(shù)(奇校�(yàn)),以此來校驗(yàn)�(shù)�(jù)傳送的正確��
� 停止位:它是一�(gè)字符�(shù)�(jù)的結(jié)束標(biāo)�??梢�?��1.5位�2位的高電��
⑤空閑位:處于邏輯�1”狀�(tài),表示當(dāng)前線路上沒有�(shù)�(jù)傳��