UART是一種通用串行數(shù)據(jù)總線,用于異步通信。該總線雙向通信,可以實(shí)現(xiàn)全雙工傳輸和接收。在嵌入式設(shè)計(jì)中,UART用來主機(jī)與輔助設(shè)備通信,如汽車音響與外接AP之間的通信,與PC機(jī)通信包括與監(jiān)控調(diào)試器和其它器件,如EEPROM通信。
功能
計(jì)算機(jī)內(nèi)部采用并行數(shù)據(jù),不能直接把數(shù)據(jù)發(fā)到Modem,必須經(jīng)過UART整理才能進(jìn)行異步傳輸,其過程為:CPU先把準(zhǔn)備寫入串行設(shè)備的數(shù)據(jù)放到UART的寄存器(臨時(shí)內(nèi)存塊)中,再通過FIFO(First Input First Output,先入先出隊(duì)列)傳送到串行設(shè)備,若是沒有FIFO,信息將變得雜亂無章,不可能傳送到Modem。
它是用于控制計(jì)算機(jī)與串行設(shè)備的芯片。有一點(diǎn)要注意的是,它提供了RS-232C數(shù)據(jù)終端設(shè)備接口,這樣計(jì)算機(jī)就可以和調(diào)制解調(diào)器或其它使用RS-232C接口的串行設(shè)備通信了。作為接口的一部分,UART還提供以下功能:將由計(jì)算機(jī)內(nèi)部傳送過來的并行數(shù)據(jù)轉(zhuǎn)換為輸出的串行數(shù)據(jù)流。將計(jì)算機(jī)外部來的串行數(shù)據(jù)轉(zhuǎn)換為字節(jié),供計(jì)算機(jī)內(nèi)部并行數(shù)據(jù)的器件使用。在輸出的串行數(shù)據(jù)流中加入奇偶校驗(yàn)位,并對(duì)從外部接收的數(shù)據(jù)流進(jìn)行奇偶校驗(yàn)。在輸出數(shù)據(jù)流中加入啟停標(biāo)記,并從接收數(shù)據(jù)流中刪除啟停標(biāo)記。
處理由鍵盤或鼠標(biāo)發(fā)出的中斷信號(hào)(鍵盤和鼠標(biāo)也是串行設(shè)備)??梢蕴幚碛?jì)算機(jī)與外部串行設(shè)備的同步管理問題。有一些比較高檔的UART還提供輸入輸出數(shù)據(jù)的緩沖區(qū),比較新的UART是16550,它可以在計(jì)算機(jī)需要處理數(shù)據(jù)前在其緩沖區(qū)內(nèi)存儲(chǔ)16字節(jié)數(shù)據(jù),而通常的UART是8250。如果您購買一個(gè)內(nèi)置的調(diào)制解調(diào)器,此調(diào)制解調(diào)器內(nèi)部通常就會(huì)有16550 UART。
結(jié)構(gòu)
1、輸出緩沖寄存器,它接收CPU從數(shù)據(jù)總線上送來的并行數(shù)據(jù),并加以保存。
2、輸出移位寄存器,它接收從輸出緩沖器送來的并行數(shù)據(jù),以發(fā)送時(shí)鐘的速率把數(shù)據(jù)逐位移出,即將并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)輸出
3、 輸入移位寄存器,它以接收時(shí)鐘的速率把出現(xiàn)在串行數(shù)據(jù)輸入線上的數(shù)據(jù)逐位移入,當(dāng)數(shù)據(jù)裝滿后,并行送往輸入緩沖寄存器,即將串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)。
4、輸入緩沖寄存器,它從輸入移位寄存器中接收并行數(shù)據(jù),然后由CPU取走
5、控制寄存器,它接收CPU送來的控制字,由控制字的內(nèi)容,決定通信時(shí)的傳輸方式以及數(shù)據(jù)格式等。例如采用異步方式還是同步方式,數(shù)據(jù)字符的位數(shù),有無奇偶校驗(yàn),是奇校驗(yàn)還是偶校驗(yàn),停止位的位數(shù)等參數(shù)
6、狀態(tài)寄存器。狀態(tài)寄存器中存放著接口的各種狀態(tài)信息,例如輸出緩沖區(qū)是否空,輸入字符是否準(zhǔn)備好等。在通信過程中,當(dāng)符合某種狀態(tài)時(shí),接口中的狀態(tài)檢測(cè)邏輯將狀態(tài)寄存器的相應(yīng)位置“1”,以便讓CPU查詢。
計(jì)算機(jī)與UART:
因?yàn)橛?jì)算機(jī)內(nèi)部采用并行數(shù)據(jù),不能直接把數(shù)據(jù)發(fā)到Modem,必須經(jīng)過UART整理才能進(jìn)行異步傳輸,其過程 為:CPU先把準(zhǔn)備寫入串行設(shè)備的數(shù)據(jù)放到UART的寄存器(臨時(shí)內(nèi)存塊)中,再通過FIFO(First Input First Output,先入先出隊(duì)列)傳送到串行設(shè)備,若是沒有FIFO,信息將變得雜亂無章,不可能傳送到Modem。
它是用于控制計(jì)算機(jī)與串行 設(shè)備的芯片。有一點(diǎn)要注意的是,它提供了RS-232C數(shù)據(jù)終端設(shè)備接口,這樣計(jì)算機(jī)就可以和調(diào)制解調(diào)器或其它使用RS-232C接口的串行設(shè)備通信了。 作為接口的一部分,UART還提供以下功能:將由計(jì)算機(jī)內(nèi)部傳送過來的并行數(shù)據(jù)轉(zhuǎn)換為輸出的串行數(shù)據(jù)流。將計(jì)算機(jī)外部來的串行數(shù)據(jù)轉(zhuǎn)換為字節(jié),供計(jì)算機(jī)內(nèi) 部并行數(shù)據(jù)的器件使用。在輸出的串行數(shù)據(jù)流中加入奇偶校驗(yàn)位,并對(duì)從外部接收的數(shù)據(jù)流進(jìn)行奇偶校驗(yàn)。在輸出數(shù)據(jù)流中加入啟停標(biāo)記,并從接收數(shù)據(jù)流中刪除啟 停標(biāo)記。處理由鍵盤或鼠標(biāo)發(fā)出的中斷信號(hào)(鍵盤和鼠標(biāo)也是串行設(shè)備)。可以處理計(jì)算機(jī)與外部串行設(shè)備的同步管理問題。有一些比較高檔的UART還提供輸入 輸出數(shù)據(jù)的緩沖區(qū),現(xiàn)在比較新的UART是16550,它可以在計(jì)算機(jī)需要處理數(shù)據(jù)前在其緩沖區(qū)內(nèi)存儲(chǔ)16字節(jié)數(shù)據(jù),而通常的UART是8250。現(xiàn)在如 果您購買一個(gè)內(nèi)置的調(diào)制解調(diào)器,此調(diào)制解調(diào)器內(nèi)部通常就會(huì)有16550 UART。
UART是計(jì)算機(jī)中串行通 信端口的關(guān)鍵部分。在計(jì)算機(jī)中,UART相連于產(chǎn)生兼容RS232規(guī)范信號(hào)的電路。RS232標(biāo)準(zhǔn)定義邏輯“1”信號(hào)相對(duì)于地為-3到-15伏,而邏輯 “0”相對(duì)于地為+3到+15伏。所以,當(dāng)一個(gè)微控制器中的UART相連于PC時(shí),它需要一個(gè)RS232驅(qū)動(dòng)器來轉(zhuǎn)換電平。
Uart這里指的是TTL電平的串口;RS232指的是RS232電平的串口。TTL電平是5V的,而RS232是負(fù)邏輯電平,它定義+5~+12V為低電平,而-12~-5V為高電平。
Uart串口的RXD、TXD等一般直接與處理器芯片的引腳相連,而RS232串口的RXD、TXD等一般需要經(jīng)過電平轉(zhuǎn)換(通常由Max232等芯片進(jìn)行電平轉(zhuǎn)換)才能接到處理器芯片的引腳上,否則這么高的電壓很可能會(huì)把芯片燒壞。
我們平時(shí)所用的電腦的串口就是RS232的,當(dāng)我們?cè)谧鲭娐饭ぷ鲿r(shí),應(yīng)該注意下外設(shè)的串口是Uart類型的還是RS232類型的,如果不匹配,應(yīng)當(dāng)找個(gè)轉(zhuǎn)換線(通常這根轉(zhuǎn)換線內(nèi)有塊類似于Max232的芯片做電平轉(zhuǎn)換工作的),可不能盲目地將兩串口相連。
UART如何通信:
UART首先將接收到的并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)來傳輸。消息幀從一個(gè)低位起始位開始,后面是5~8個(gè)數(shù)據(jù)位,一個(gè)可用的奇偶位和一個(gè)或幾個(gè)高位停止位。接 收器發(fā)現(xiàn)開始位時(shí)它就知道數(shù)據(jù)準(zhǔn)備發(fā)送,并嘗試與發(fā)送器時(shí)鐘頻率同步。如果選擇了奇偶,UART就在數(shù)據(jù)位后面加上奇偶位。奇偶位可用來幫助錯(cuò)誤校驗(yàn)。
在接收過程中,UART從消息幀中去掉起始位和結(jié)束位,對(duì)進(jìn)來的字節(jié)進(jìn)行奇偶校驗(yàn),并將數(shù)據(jù)字節(jié)從串行轉(zhuǎn)換成并行。UART也產(chǎn)生額外的信號(hào)來指示發(fā)送和接收的狀態(tài)。例如,如果產(chǎn)生一個(gè)奇偶錯(cuò)誤,UART就置位奇偶標(biāo)志。
UART通信速率:
數(shù)據(jù)傳輸可以首先從最低有效位(LSB)開始。然而,有些UART允許靈活選擇先發(fā)送最低有效位或最高有效位(MSB)。微控制器中的UART傳送數(shù)據(jù)的 速度范圍為每秒幾百位到1.5Mb。例如,嵌入在ElanSC520微控制器中的高速UART通信的速度可以高達(dá)1.152Mbps。UART波特率還受 發(fā)送和接收線對(duì)距離(線長(zhǎng)度)的影響。
目前,市場(chǎng)上有只支持異步通信和同時(shí)支持異步與同步通信的兩種硬件可用于UART。前者就是UART名字本身的含義,在摩托羅拉微控制器中被稱為串行通信 接口(SCI);Microchip微控制器中的通用同步異步收發(fā)器(USART)和在富士通微控制器中的UART是后者的兩個(gè)典型例子。
UART通信協(xié)議:
UART作為異步串口通信協(xié)議的一種,工作原理是將傳輸數(shù)據(jù)的每個(gè)字符一位接一位地傳輸。
其中各位的意義如下:
起始位:先發(fā)出一個(gè)邏輯”0”的信號(hào),表示傳輸字符的開始。
資料位:緊接著起始位之后。資料位的個(gè)數(shù)可以是4、5、6、7、8等,構(gòu)成一個(gè)字符。通常采用ASCII碼。從最低位開始傳送,靠時(shí)鐘定位。
奇偶校驗(yàn)位:資料位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗(yàn))或奇數(shù)(奇校驗(yàn)),以此來校驗(yàn)資料傳送的正確性。
停止位:它是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志??梢允?位、1.5位、2位的高電平。 由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供 計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時(shí)也越慢。
空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路上沒有資料傳送。
波特率:是衡量資料傳送速率的指標(biāo)。表示每秒鐘傳送的二進(jìn)制位數(shù)。例如資料傳送速率為120字符/秒,而每一個(gè)字符為10位,則其傳送的波特率為10×120=1200位/秒=1200波特。
UART的作用
1. 發(fā)送/接收邏輯
發(fā)送邏輯對(duì)從發(fā)送FIFO 讀取的數(shù)據(jù)執(zhí)行“并→串”轉(zhuǎn)換??刂七壿嬢敵銎鹗嘉辉谙鹊拇形涣?,并且根據(jù)控制寄存器中已編程的配置,后面緊跟著數(shù)據(jù)位(注意:最低位 LSB 先輸出)、奇偶校驗(yàn)位和停止位。
在檢測(cè)到一個(gè)有效的起始脈沖后,接收邏輯對(duì)接收到的位流執(zhí)行“串→并”轉(zhuǎn)換。此外還會(huì)對(duì)溢出錯(cuò)誤、奇偶校驗(yàn)錯(cuò)誤、幀錯(cuò)誤和線中止(line-break)錯(cuò)誤進(jìn)行檢測(cè),并將檢測(cè)到的狀態(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 被使能,則會(huì)按照預(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 周期仍然為低電平,則起始位有效,否則會(huì)被認(rèn)為是錯(cuò)誤的起始位并將其忽略。
如果起始位有效,則根據(jù)數(shù)據(jù)字符被編程的長(zhǎng)度,在 Baud16 的每第 16 個(gè)周期對(duì)連續(xù)的數(shù)據(jù)位(即一個(gè)位周期之后)進(jìn)行采樣。如果奇偶校驗(yàn)?zāi)J绞鼓?,則還會(huì)檢測(cè)奇偶校驗(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 信號(hào)一直為0 的狀態(tài),包括校驗(yàn)位和停止位在內(nèi))
奇偶校驗(yàn)錯(cuò)誤
幀錯(cuò)誤(停止位不為1)
接收超時(shí)(接收FIFO 已有數(shù)據(jù)但未滿,而后續(xù)數(shù)據(jù)長(zhǎng)時(shí)間不來)
發(fā)送
接收
由于所有中斷事件在發(fā)送到中斷控制器之前會(huì)一起進(jìn)行“或運(yùn)算”操作,所以任意時(shí)刻 UART 只能向中斷產(chǎn)生一個(gè)中斷請(qǐng)求。通過查詢中斷狀態(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 里,就會(huì)立即啟動(dòng)發(fā)送過程。由于發(fā)送本身是個(gè)相對(duì)緩慢的過程,因此在發(fā)送的同時(shí)其它需要發(fā)送的數(shù)據(jù)還可以繼續(xù)填充到發(fā)送 FIFO 里。當(dāng)發(fā)送 FIFO 被填滿時(shí)就不能再繼續(xù)填充了,否則會(huì)造成數(shù)據(jù)丟失,此時(shí)只能等待。這個(gè)等待并不會(huì)很久,以9600 的波特率為例,等待出現(xiàn)一個(gè)空位的時(shí)間在1ms 上下。發(fā)送 FIFO 會(huì)按照填入數(shù)據(jù)的先后順序把數(shù)據(jù)一個(gè)個(gè)發(fā)送出去,直到發(fā)送 FIFO 全空時(shí)為止。已發(fā)送完畢的數(shù)據(jù)會(huì)被自動(dòng)清除,在發(fā)送FIFO 里同時(shí)會(huì)多出一個(gè)空位。
接收FIFO的基本工作過程: 當(dāng)硬件邏輯接收到數(shù)據(jù)時(shí),就會(huì)往接收FIFO 里填充接收到的數(shù)據(jù)。程序應(yīng)當(dāng)及時(shí)取走這些數(shù)據(jù),數(shù)據(jù)被取走也是在接收FIFO 里被自動(dòng)刪除的過程,因此在接收 FIFO 里同時(shí)會(huì)多出一個(gè)空位。如果在接收 FIFO 里的數(shù)據(jù)未被及時(shí)取走而造成接收FIFO 已滿,則以后再接收到數(shù)據(jù)時(shí)因無空位可以填充而造成數(shù)據(jù)丟失。
收發(fā)FIFO 主要是為了解決UART 收發(fā)中斷過于頻繁而導(dǎo)致CPU 效率不高的問題而引入的。在進(jìn)行 UART 通信時(shí),中斷方式比輪詢方式要簡(jiǎn)便且效率高。但是,如果沒有收發(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 和中斷例程會(huì)自動(dòng)搞定一切。
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)換。片上不會(huì)執(zhí)行任何模擬處理操作。SIR 模塊的任務(wù)就是要給UART 提供一個(gè)數(shù)字編碼輸出和一個(gè)解碼輸入。UART 信號(hào)管腳可以和一個(gè)紅外收發(fā)器連接以實(shí)現(xiàn)IrDA SIR物理層連接。
如圖所示,為UART 的IrDA SIR 模塊基本應(yīng)用電路。D1 為紅外發(fā)射管,Q2 為紅外接收管。
UART設(shè)計(jì)思想:
數(shù)據(jù)發(fā)送的思想是,當(dāng)啟動(dòng)字節(jié)發(fā)送時(shí),通過TxD先發(fā)起始位,然后發(fā)數(shù)據(jù)位和奇偶數(shù)效驗(yàn)位,最后再發(fā)停止位,發(fā)送過程由發(fā)送狀態(tài)機(jī)控制,每次中斷只發(fā)送1個(gè)位,經(jīng)過若干個(gè)定時(shí)中斷完成1個(gè)字節(jié)幀的發(fā)送。
數(shù)據(jù)接收的思想是,當(dāng)不在字節(jié)幀接收過程時(shí),每次定時(shí)中斷以3倍的波特率監(jiān)視RxD的狀態(tài),當(dāng)其連續(xù)3次采樣電平依 次為1、0、0時(shí),就認(rèn)為檢測(cè)到了起始位,則開始啟動(dòng)一次字節(jié)幀接收,字節(jié)幀接收過程由接收狀態(tài)機(jī)控制,每次中斷只接收1個(gè)位,經(jīng)過若干個(gè)定時(shí)中斷完成1 個(gè)字節(jié)幀的接收。
為了提高串口的性能,在發(fā)送和接收上都實(shí)現(xiàn)了FIFO功能,提高通信的實(shí)時(shí)性。FIFO的長(zhǎng)度可以進(jìn)行自由定義,適應(yīng)用戶的不同需要。
波特率的計(jì)算按照計(jì)算公式進(jìn)行,在設(shè)置最高波特率時(shí)一定要考慮模擬串口程序代碼的執(zhí)行時(shí)間,該定時(shí)時(shí)間必須大于模擬串口的程序的規(guī)定時(shí)間。單片機(jī)的執(zhí)行速度越快,則可以實(shí)現(xiàn)更高的串口通訊速度
評(píng)論
查看更多