基礎(chǔ)知識之UART異步串行通信
一個通用的異步接收/發(fā)射器,簡稱為UART /?ju?ɑ?rt/, 是一種計算機硬件設(shè)備,它在計算機中的字符(通常是字節(jié))之間轉(zhuǎn)換數(shù)據(jù),以及在起始位和停止位之間封裝這些字符的異步串行通信格式, 其中數(shù)據(jù)格式和傳輸速度是可配置的。UART通常與通信標(biāo)準(zhǔn)結(jié)合使用,例如TIA(以前稱為EIA)RS-232,RS-422或RS-485。 通用名稱表示數(shù)據(jù)格式和傳輸速度是可配置的。 電信號電平和方法(例如差分信號等)由UART外部的驅(qū)動電路處理。
本文引用地址:http://m.butianyuan.cn/article/202404/457292.htmUART通常是用于通過計算機或外圍設(shè)備串行端口進行串行通信的單獨(或部分)集成電路(IC)。 UART現(xiàn)在通常包含在微控制器中。 雙UART或DUART將兩個UART組合成一個芯片。 八進制UART或OCTART將八個UART組合成一個封裝,例如Exar XR16L788或NXP SCC2698。 相關(guān)設(shè)備,通用同步/異步接收器/發(fā)送器(USART)也支持同步操作。
UART采用字節(jié)數(shù)據(jù)并以順序方式發(fā)送各個位。在目的地,第二個UART將這些位重新組合成完整的字節(jié)。每個UART都包含一個移位寄存器,它是串行和并行形式之間轉(zhuǎn)換的基本方法。通過單線或其他介質(zhì)的數(shù)字信息(比特)的串行傳輸比通過多條線的并行傳輸更便宜。
UART通常不直接生成或接收不同設(shè)備之間使用的外部信號。獨立的接口設(shè)備用于將UART的邏輯電平信號轉(zhuǎn)換為外部信號電平和從外部信號電平轉(zhuǎn)換。外部信號可以有許多不同的形式。電壓信號標(biāo)準(zhǔn)的示例是來自EIA的RS-232,RS-422和RS-485。歷史上,電流電路中使用電流(電流環(huán)路)。一些信令方案不使用電線。其示例是其串行端口配置文件(SPP)中的光纖,IrDA(紅外線)和(無線)藍牙。一些信令方案使用載波信號的調(diào)制(有或沒有線路)。例如,使用電話線調(diào)制解調(diào)器調(diào)制音頻信號,使用數(shù)據(jù)無線電調(diào)制RF調(diào)制,以及使用DC-LIN進行電力線通信。
通信可以是單工的(僅在一個方向上,沒有規(guī)定接收設(shè)備將信息發(fā)送回發(fā)送設(shè)備),全雙工(兩個設(shè)備同時發(fā)送和接收)或半雙工(設(shè)備輪流發(fā)送和接收) )。
UART的工作原理
UART(Universal Asynchronous Receiver/Transmitter,翻譯過來叫通用異步收發(fā)) 其實不是像SPI和I2C這樣的通信協(xié)議,而是MCU(微控制器)中的物理電路或獨立的IC,它的主要用途是發(fā)送和接收串行數(shù)據(jù)。
在UART通信中,兩個UART可以直接相互通信。 發(fā)送UART將來自CPU等控制設(shè)備的并行數(shù)據(jù)轉(zhuǎn)換為串行格式,并將其串行發(fā)送到接收端的UART,接收UART將串行數(shù)據(jù)轉(zhuǎn)換回接收設(shè)備的并行數(shù)據(jù)。 在兩個UART之間傳輸數(shù)據(jù)只需要兩根線, 數(shù)據(jù)流從發(fā)送UART的Tx引腳到接收UART的Rx引腳:
超簡化的UART接口,左側(cè)為并行,右側(cè)為串行
通用異步接收器/發(fā)送器(UART)是負(fù)責(zé)實現(xiàn)串行通信的電路塊。 本質(zhì)上,UART充當(dāng)并行和串行接口之間的中介。 UART的一端是八條左右數(shù)據(jù)線(加上一些控制引腳),另一條是兩條串行線 - RX和TX。
兩個設(shè)備可以發(fā)送和接收數(shù)據(jù)的串行接口是全雙工或半雙工。 全雙工意味著兩個設(shè)備可以同時發(fā)送和接收。 半雙工通信意味著串行設(shè)備必須輪流發(fā)送和接收。
UART以異步方式發(fā)送數(shù)據(jù),也就是說沒有時鐘信號將發(fā)送UART的位輸出與接收UART的位采樣進行同步。 發(fā)送UART將“起始”和“停止”位添加到正在傳輸?shù)臄?shù)據(jù)包中, 這些位定義了數(shù)據(jù)包的開始和結(jié)束,接收UART基于這些位的信息知道何時開始讀取輸入的串行數(shù)據(jù)。
當(dāng)接收UART檢測到起始位時,它以特定的頻率(也就是“波特率”)讀取輸入的串行數(shù)據(jù)。波特率是數(shù)據(jù)傳輸速度的度量,單位-每秒位數(shù)(bps)。 兩個UART必須以相同的波特率運行。發(fā)送和接收UART之間的波特率相差不能超過10%,偏差太遠(yuǎn)就無法對數(shù)據(jù)進行正確的解讀。
當(dāng)然兩個UART還必須配置為發(fā)送和接收相同的數(shù)據(jù)包結(jié)構(gòu)。
異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。兩個相鄰位間的時間間隔與UART通信的波特率有關(guān),波特率用來表征UART通信中數(shù)據(jù)傳輸?shù)乃俾?,即每秒鐘傳送的二進制位數(shù)。例如數(shù)據(jù)傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數(shù)據(jù)位,1個校驗位,1個結(jié)束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。
我們在調(diào)試種最比較常見的波特率是9600bps,其它的“標(biāo)準(zhǔn)”波特還有1200、2400、4800、19200、38400、57600和115200。
以9600bps傳輸為例,將每個位高或低保持的時間為1 /(9600 bps)或每位104μs,對于發(fā)送的每個數(shù)據(jù)字節(jié),實際上發(fā)送了10位:起始位,8個數(shù)據(jù)位和一個停止位。 因此,在9600bps時,我們實際上每秒發(fā)送9600位或每秒960(9600/10)字節(jié)。
波特率越高,發(fā)送/接收的數(shù)據(jù)越快,但數(shù)據(jù)傳輸?shù)乃俣扔邢?。您通常不會看到超過115200的速度 - 這對于大多數(shù)微控制器來說都很快。太高了,你會開始看到接收端的錯誤,因為時鐘和采樣周期無法跟上。
數(shù)據(jù)幀構(gòu)成
發(fā)送的每個數(shù)據(jù)塊(通常是一個字節(jié))實際上是以比特或比特幀發(fā)送的。通過將同步和奇偶校驗位附加到數(shù)據(jù)來創(chuàng)建幀。
下面我們詳細(xì)介紹一下每一部分。
數(shù)據(jù)塊
每個串行數(shù)據(jù)包的真正有營養(yǎng)的是它攜帶的數(shù)據(jù),我們且稱之為“數(shù)據(jù)塊”,它沒有具體的大小限制。 每個數(shù)據(jù)包中的數(shù)據(jù)量可以設(shè)置為5到9位。 標(biāo)準(zhǔn)數(shù)據(jù)的大小一般是最基本的8位字節(jié),但其它大小也有其用途,有時候7位數(shù)據(jù)能比8位更高效,比如只是用來傳輸7位ASCII字符。
在統(tǒng)一了字符長度后,兩個串行設(shè)備也必須就其數(shù)據(jù)的字節(jié)順序達成一致。 數(shù)據(jù)是最高位(msb)還是最低位先發(fā)送? 缺省設(shè)定為首先傳輸最低有效位(lsb)。
同步位
同步位是每個數(shù)據(jù)塊傳輸?shù)膬蓚€或三個特殊位。 它們是起始位和停止位,顧名思義,這些位標(biāo)記了數(shù)據(jù)包的開頭和結(jié)尾。 始終只有一個起始位,但停止位的數(shù)量可配置為一個或兩個(通常情況下保留為一個)。
起始位始終是由從1到0的空閑數(shù)據(jù)線來指示,而停止位則將通過將該信號線保持為1而轉(zhuǎn)換回空閑狀態(tài)。
奇偶校驗位
奇偶校驗是一種非常簡單的低級錯誤檢查方式,它分為兩種方式:奇數(shù)或偶數(shù)。 為了產(chǎn)生奇偶校驗位,數(shù)據(jù)字節(jié)的所有5-9位相加,并且求和的奇偶性決定該位是否置位。 例如,假設(shè)奇偶校驗設(shè)置為偶數(shù)并且正被添加到數(shù)字字節(jié)(如0b01011101,這串?dāng)?shù)中有奇數(shù)(5)個1,奇偶校驗位將被設(shè)置為1。相反,如果奇偶校驗?zāi)J皆O(shè)置為奇數(shù) ,奇偶校驗位則為0。
同步和采樣
下面我們來看看沒有時鐘信號的數(shù)據(jù)在接收端是如何被正確解讀的。
沒有時鐘對數(shù)據(jù)做判決,這些數(shù)據(jù)毫無意義。 下圖顯示了原因:
同一串?dāng)?shù)據(jù)可以有不同的解讀
典型的數(shù)據(jù)信號只是在邏輯低和邏輯高之間轉(zhuǎn)換的電壓。 只有當(dāng)接收器知道何時采樣信號時,接收器才能正確地將這些邏輯狀態(tài)轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù)。
這可以使用單獨的時鐘信號輕松完成 - 例如,發(fā)送器在時鐘的每個上升沿更新數(shù)據(jù)信號,然后接收器在每個下降沿采樣數(shù)據(jù)。但UART接口沒有時鐘信號來同步Tx和Rx器件,接收端如何知道何時采樣發(fā)射端送來的數(shù)據(jù)信號呢?
發(fā)送端根據(jù)其時鐘信號生成比特流,然后接收端的目標(biāo)是使用其內(nèi)部時鐘信號在每個比特周期的中間對輸入的數(shù)據(jù)流進行采樣。雖然在比特周期的中間進行采樣不是必要的但卻是最佳的,因為接近比特周期的開始或結(jié)束的采樣使得系統(tǒng)對接收端和發(fā)射端之間的時鐘頻率差異的魯棒性較差。
接收端序列從起始位的下降沿開始,這是關(guān)鍵同步過程發(fā)生的時間。接收端的內(nèi)部時鐘完全獨立于發(fā)送端的內(nèi)部時鐘 - 換句話說,第一個下降沿可以對應(yīng)于接收端時鐘周期中的任何點:
為了確保接收端時鐘的有效邊沿能夠在比特周期的中間附近發(fā)生,發(fā)送到接收端模塊的波特率時鐘的頻率要比實際波特率高得多(比8或16或甚至32倍)。
假設(shè)一個比特周期對應(yīng)于16個接收端時鐘周期。 在這種情況下,同步和采樣可以按如下方式進行:
UART的優(yōu)點和缺點
沒有任何一種通信方式和協(xié)議是完美的,因此沒中方式都有其優(yōu)點,也有其缺點,我們來看看UART的主要優(yōu)缺點。
UART的優(yōu)點:
UART的缺點:
實際應(yīng)用中的信號傳輸方式 將兩個UART的設(shè)備進行連接有多種方式,取決于具體的應(yīng)用場景,在這里我們僅看兩種:TTL UART和RS-232。
TTL UART 當(dāng)微控制器和其它器件進行串行通信時,通常以TTL電平進行通信。 TTL串行信號存在于微控制器的電源電壓范圍內(nèi) - 通常為0V至3.3V或5V。 VCC電平(3.3V,5V等)的信號表示空閑線,值1或停止位。 0V(GND)信號表示起始位或值為0的數(shù)據(jù)位。
RS-232 UART
RS-232(推薦標(biāo)準(zhǔn)232)是連接數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)的串行二進制數(shù)據(jù)信號的標(biāo)準(zhǔn)。 它通常用于計算機的老式串口。 TTL電平UART和RS-232的主要區(qū)別就是電壓電平。 RS-232中的數(shù)字信號為±3至 - ±15V,無論如何都不會檢測到接近0V的信號。
RS-232,可以在一些更古老的計算機和外圍設(shè)備上找到,就像TTL串口翻轉(zhuǎn)一樣。 RS-232信號通常介于-13V和13V之間,但規(guī)格允許從+/- 3V到+/- 25V。 在這些信號上,低電壓(-5V,-13V等)表示空閑線,停止位或值為1的數(shù)據(jù)位。一個高的RS-232信號表示起始位或0- 值數(shù)據(jù)位。 這與TTL系列相反。
Logic-1 (High) | Logic-0 (Low) |
+3 to +15v | -3 to -15v |
RS-232比TTL的UART有更多的引腳,用于PC和調(diào)制解調(diào)器之間的通信。 我們常用的DB-9的引腳排列及其功能如下所示。
最撲街的RS-232收發(fā)芯片 - MAX232
在兩個串行信號標(biāo)準(zhǔn)之間,TTL更容易實現(xiàn)到嵌入式電路中。 然而,低電壓電平更容易受到長傳輸線路的損耗的影響。 RS-232或更復(fù)雜的標(biāo)準(zhǔn)(如RS-485)更適合遠(yuǎn)程串行傳輸。當(dāng)您將兩個串行設(shè)備連接在一起時,確保其信號電壓匹配是非常重要的。
PC和微控制器的連接
實際的項目中可以有多種方式來連接PC和MCU,最方便的是下面列出的幾種方式中的最后一種。
TTL-UART到RS-232串口(古老的通用方式)
TTL-UART 到 RS-232串口 到 USB
USB-TTL 轉(zhuǎn)換模塊
全球創(chuàng)客界最火的WiFi模塊ESP8266只需要UART接口和AT指令集進行操作
物美價廉的USB到TTL UART接口轉(zhuǎn)換芯片CP2102(來自SiLabs),通過計算機的USB端口仿真UART通信
使用UART最容易碰到的問題:
RX-To-TX & TX-To-RX
工程師經(jīng)常犯的錯誤就是將RX和TX線錯誤連接,因此在遇到連接不通的時候一定要先檢查確定一下是否存在這方面的問題。
波特率失配
如果數(shù)據(jù)以9600bps的波特率傳輸,并以19200bps的速率接收。 收到的數(shù)據(jù)將是一團垃圾! 波特率必須在發(fā)送端和接收端匹配,這是UART串行通信的經(jīng)驗法則,波特率的最大允許偏移趨于介于(1-2%)之間。 因此嘗試在兩端生成完全相同的波特率,以避免錯配錯誤。
UART總線長度 vs 波特率
UART串行總線可以傳輸很長的距離,但傳輸?shù)木嚯x以及最高能夠達到的波特率都取決于傳輸?shù)迷竭h(yuǎn),波特率也就會降低,它還取決于UART協(xié)議本身的硬件實現(xiàn)(物理層)。我們只提到TTL-UART和RS-232標(biāo)準(zhǔn)。
RS-232
RS-232的最大電纜長度為50英尺。 但實際上它取決于波特率、電纜的等效電容和環(huán)境噪聲。 下表是TI多年前通過實驗總結(jié)的一些經(jīng)驗法則。
TTL-UART
TTL電平的UART僅支持5V的電壓擺幅,因此信號傳輸?shù)木嚯x以及能夠支持到的波特率取決于下面的3個元素:
UART的構(gòu)成
一個UART一般包含了如下的一些組成部分:
評論