幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

前面兩篇文章我簡單講了一下在PCB板子上用於器件之間連線的SPI和I2C匯流排的一些基本特徵以及優缺點,筒子們一眼就可以看出來這兩種匯流排都有時鐘訊號線伴隨著資料訊號線的,在SPI中有SCLK,在I2C中有SCK,這種有時鐘的傳輸方式叫同步傳輸,有時鐘做參考可以方便接收端對接受資料的判決,但同時也帶來一些限制,比如:

需要一根多餘的連線用於時鐘訊號

因為需要時鐘的邊沿對資料進行取樣判決,時鐘的頻寬至少要是資料頻寬的2倍,因此也就限制了系統的資料傳輸速率

長距離傳輸的時候資料訊號和時鐘訊號容易失去同步(即便倆人一起跑步,速度越快越不容易步調一致)

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

序列通訊(同步)

所以,傳輸要往高速走,同步序列的傳輸方式就力不從心了,雖然可以在同樣時鐘頻率的情況下靠增加資料線來提高傳輸的資料量(SD卡就這麼幹的),但訊號線越多,也就越難同步,最後搞得跟並行傳輸一樣了。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

並行通訊(PCB的佈線在高速時將變得非常困難)

因此更高速的傳輸最好是採用非同步的方式,也就是說不再有多餘的時鐘訊號線跟著,傳輸的訊號線中只有資料訊號,非同步傳輸不僅能夠節省連線,同時還可以提高傳輸速度,比如USB、乙太網。。。這種快到10Gbps的傳輸都只能靠非同步的方式。

今天我們要講的

UART

(通用非同步接收/傳送)就是一種非同步的傳輸方式,不過它是相對低速的(最低1200bps),這是因為它生下來的時候人們的想象力還非常有限,能用9。6Kbps傳傳資料已經非常開心了,2000年前透過模擬電話線Modem傳57。6Kbps的資料(收發郵件、網頁瀏覽)已經感覺飛快了。

現在幾乎每個MCU都標配UART,主要的功能是用來跟上位機連線的,以便讓上位機對其進行除錯或者執行簡單的資料通訊,比如顯示一下狀態、傳遞幾個命令等。如果需要高速的資料傳輸?不是有USB了麼!經過近20年的演進,USB 已經從最早的1。5Mbps一路升級到12Mbps、480Mbps、現在的10Gbps,USB已經承擔了兩個系統之間高速資料傳輸的主要重擔。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

UART雖然速率比較低,但卻不可或缺,估計全世界的硬體工程師沒有沒和UART打過交道的。這個世界的科技發展變得再快,這種最簡單、粗暴的數字通訊方式也將像常青樹一樣一直陪伴著我們,一如過去的幾十年。

UART的工作原理

UART(Universal Asynchronous Receiver/Transmitter,翻譯過來叫通用非同步收發) 其實不是像SPI和I2C這樣的通訊協議,而是MCU(微控制器)中的物理電路或獨立的IC,它的主要用途是傳送和接收序列資料。

在UART通訊中,兩個UART可以直接相互通訊。 傳送UART將來自CPU等控制裝置的並行資料轉換為序列格式,並將其序列傳送到接收端的UART,接收UART將序列資料轉換回接收裝置的並行資料。 在兩個UART之間傳輸資料只需要兩根線, 資料流從傳送UART的Tx引腳到接收UART的Rx引腳:

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

超簡化的UART介面,左側為並行,右側為序列

通用非同步接收器/傳送器(UART)是負責實現序列通訊的電路塊。 本質上,UART充當並行和序列介面之間的中介。 UART的一端是八條左右資料線(加上一些控制引腳),另一條是兩條序列線 - RX和TX。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

兩個裝置可以傳送和接收資料的序列介面是

全雙工

半雙工

。 全雙工意味著兩個裝置可以同時傳送和接收。 半雙工通訊意味著序列裝置必須輪流傳送和接收。

UART以非同步方式傳送資料,也就是說沒有時鐘訊號將傳送UART的位輸出與接收UART的位取樣進行同步。 傳送UART將“起始”和“停止”位新增到正在傳輸的資料包中, 這些位定義了資料包的開始和結束,接收UART基於這些位的資訊知道何時開始讀取輸入的序列資料。

當接收UART檢測到起始位時,它以特定的頻率(也就是“波特率”)讀取輸入的序列資料。波特率是資料傳輸速度的度量,單位-每秒位數(bps)。 兩個UART必須以相同的波特率執行。傳送和接收UART之間的波特率相差不能超過10%,偏差太遠就無法對資料進行正確的解讀。

當然兩個UART還必須配置為傳送和接收相同的資料包結構。

非同步通訊以一個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同一個字元中的兩個相鄰位間的時間間隔是固定的。兩個相鄰位間的時間間隔與UART通訊的波特率有關,波特率用來表徵UART通訊中資料傳輸的速率,即每秒鐘傳送的二進位制位數。例如資料傳送速率為120字元/秒,而每一個字元為10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率為10×120=1200字元/秒=1200波特。

我們在調試種最比較常見的波特率是9600bps,其它的“標準”波特還有1200、2400、4800、19200、38400、57600和115200。

以9600bps傳輸為例,將每個位高或低保持的時間為1 /(9600 bps)或每位104μs,對於傳送的每個資料位元組,實際上傳送了10位:起始位,8個數據位和一個停止位。 因此,在9600bps時,我們實際上每秒傳送9600位或每秒960(9600/10)位元組。

波特率越高,傳送/接收的資料越快,但資料傳輸的速度有限。您通常不會看到超過115200的速度 - 這對於大多數微控制器來說都很快。太高了,你會開始看到接收端的錯誤,因為時鐘和取樣週期無法跟上。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

資料幀構成

傳送的每個資料塊(通常是一個位元組)實際上是以位元或位元幀傳送的。透過將同步和奇偶校驗位附加到資料來建立幀。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

起始位:先發出一個邏輯”0”訊號,表示傳輸字元的開始。

資料位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴充套件BCD碼(8位)。小端傳輸

校驗位:資料位加上這一位後,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗)

停止位:它是一個字元資料的結束標誌。可以是1位、1。5位、2位的高電平。

空閒位:處於邏輯“1”狀態,表示當前線路上沒有資料傳送。

下面我們詳細介紹一下每一部分。

資料塊

每個序列資料包的真正有營養的是它攜帶的資料,我們且稱之為“資料塊”,它沒有具體的大小限制。 每個資料包中的資料量可以設定為5到9位。 標準資料的大小一般是最基本的8位位元組,但其它大小也有其用途,有時候7位資料能比8位更高效,比如只是用來傳輸7位ASCII字元。

在統一了字元長度後,兩個序列裝置也必須就其資料的位元組順序達成一致。 資料是最高位(msb)還是最低位先發送? 預設設定為首先傳輸最低有效位(lsb)。

同步位

同步位是每個資料塊傳輸的兩個或三個特殊位。 它們是起始位和停止位,顧名思義,這些位標記了資料包的開頭和結尾。 始終只有一個起始位,但停止位的數量可配置為一個或兩個(通常情況下保留為一個)。

起始位始終是由從1到0的空閒資料線來指示,而停止位則將透過將該訊號線保持為1而轉換回空閒狀態。

起始位:單位元組UART傳送的第一位。 它表示資料線正在離開其空閒狀態。 空閒狀態通常為邏輯高,因此起始位為邏輯低。起始位是開銷位, 這意味著它有助於接收器和發射器之間的通訊,但不會傳輸有意義的資料。

停止位: 單位元組UART傳輸的最後一位。 其邏輯電平與訊號的空閒狀態相同,即邏輯高, 這是另一個開銷。

奇偶校驗位

奇偶校驗是一種非常簡單的低階錯誤檢查方式,它分為兩種方式:奇數或偶數。 為了產生奇偶校驗位,資料位元組的所有5-9位相加,並且求和的奇偶性決定該位是否置位。 例如,假設奇偶校驗設定為偶數並且正被新增到數字位元組(如0b01011101,這串數中有奇數(5)個1,奇偶校驗位將被設定為1。相反,如果奇偶校驗模式設定為奇數 ,奇偶校驗位則為0。

同步和取樣

下面我們來看看沒有時鐘訊號的資料在接收端是如何被正確解讀的。

沒有時鐘對資料做判決,這些資料毫無意義。 下圖顯示了原因:

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

同一串資料可以有不同的解讀

典型的資料訊號只是在邏輯低和邏輯高之間轉換的電壓。 只有當接收器知道何時取樣訊號時,接收器才能正確地將這些邏輯狀態轉換為數字資料。

這可以使用單獨的時鐘訊號輕鬆完成 - 例如,傳送器在時鐘的每個上升沿更新資料訊號,然後接收器在每個下降沿取樣資料。但UART介面沒有時鐘訊號來同步Tx和Rx器件,接收端如何知道何時取樣發射端送來的資料訊號呢?

傳送端根據其時鐘訊號生成位元流,然後接收端的目標是使用其內部時鐘訊號在每個位元週期的中間對輸入的資料流進行取樣。雖然在位元週期的中間進行取樣不是必要的但卻是最佳的,因為接近位元週期的開始或結束的取樣使得系統對接收端和發射端之間的時鐘頻率差異的魯棒性較差。

接收端序列從起始位的下降沿開始,這是關鍵同步過程發生的時間。接收端的內部時鐘完全獨立於傳送端的內部時鐘 - 換句話說,第一個下降沿可以對應於接收端時鐘週期中的任何點:

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

為了確保接收端時鐘的有效邊沿能夠在位元週期的中間附近發生,傳送到接收端模組的波特率時鐘的頻率要比實際波特率高得多(比8或16或甚至32倍)。

假設一個位元週期對應於16個接收端時鐘週期。 在這種情況下,同步和取樣可以按如下方式進行:

接收過程由起始位的下降沿啟動。

接收端等待8個時鐘週期,以便建立一個接近位元週期中間的取樣點。

然後,接收端等待16個時鐘週期,使其進入第一個資料位週期的中間。

第一個資料位被取樣並存儲在接收暫存器中,然後模組在取樣第二個資料位之前等待另外16個時鐘週期。

重複此過程直到所有資料位都被取樣和儲存,然後停止位的上升沿使UART介面返回其空閒狀態。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

UART的優點和缺點

沒有任何一種通訊方式和協議是完美的,因此沒中方式都有其優點,也有其缺點,我們來看看UART的主要優缺點。

UART的優點:

只需要使用兩根訊號線就可以實現全雙工的資料傳輸(不算電源線)

無需時鐘訊號

有一個奇偶校驗位提供硬體級別的錯誤檢查

資料包的結構可以透過兩端之間的協調來改變,比較靈活

有豐富的文件且被廣泛使用的通訊方式

相對比較容易配置和執行

UART的缺點:

與並行通訊以及USART相比,資料傳輸的速度較慢

幀的大小被限定為最多9位

不支援多個從裝置或多個主裝置的功能

收發兩個器件UART的波特率差別不能超過10%

實際應用中的訊號傳輸方式

將兩個UART的裝置進行連線有多種方式,取決於具體的應用場景,在這裡我們僅看兩種:TTL UART和RS-232。

TTL UART

當微控制器和其它器件進行序列通訊時,通常以TTL電平進行通訊。 TTL序列訊號存在於微控制器的電源電壓範圍內 - 通常為0V至3。3V或5V。 VCC電平(3。3V,5V等)的訊號表示空閒線,值1或停止位。 0V(GND)訊號表示起始位或值為0的資料位。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

RS-232 UART

RS-232(推薦標準232)是連線資料終端裝置(DTE)和資料通訊裝置(DCE)的序列二進位制資料訊號的標準。 它通常用於計算機的老式串列埠。 TTL電平UART和RS-232的主要區別就是電壓電平。 RS-232中的數字訊號為±3至 - ±15V,無論如何都不會檢測到接近0V的訊號。

RS-232,可以在一些更古老的計算機和外圍裝置上找到,就像TTL串列埠翻轉一樣。 RS-232訊號通常介於-13V和13V之間,但規格允許從+/- 3V到+/- 25V。 在這些訊號上,低電壓(-5V,-13V等)表示空閒線,停止位或值為1的資料位。一個高的RS-232訊號表示起始位或0- 值資料位。 這與TTL系列相反。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

RS-232比TTL的UART有更多的引腳,用於PC和調變解調器之間的通訊。 我們常用的DB-9的引腳排列及其功能如下所示。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

最撲街的RS-232收發晶片 - MAX232

在兩個序列訊號標準之間,TTL更容易實現到嵌入式電路中。 然而,低電壓電平更容易受到長傳輸線路的損耗的影響。 RS-232或更復雜的標準(如RS-485)更適合遠端序列傳輸。當您將兩個序列裝置連線在一起時,確保其訊號電壓匹配是非常重要的。

PC和微控制器的連線

實際的專案中可以有多種方式來連線PC和MCU,最方便的是下面列出的幾種方式中的最後一種。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

全球創客界最火的WiFi模組ESP8266只需要UART介面和AT指令集進行操作

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

物美價廉的USB到TTL UART介面轉換晶片CP2102(來自SiLabs),透過計算機的USB埠模擬UART通訊

使用UART最容易碰到的問題:

RX-To-TX & TX-To-RX

工程師經常犯的錯誤就是將RX和TX線錯誤連線,因此在遇到連線不通的時候一定要先檢查確定一下是否存在這方面的問題。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

波特率失配

如果資料以9600bps的波特率傳輸,並以19200bps的速率接收。 收到的資料將是一團垃圾! 波特率必須在傳送端和接收端匹配,這是UART序列通訊的經驗法則,波特率的最大允許偏移趨於介於(1-2%)之間。 因此嘗試在兩端生成完全相同的波特率,以避免錯配錯誤。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

UART匯流排長度 vs 波特率

UART序列匯流排可以傳輸很長的距離,但傳輸的距離以及最高能夠達到的波特率都取決於傳輸得越遠,波特率也就會降低,它還取決於UART協議本身的硬體實現(物理層)。我們只提到TTL-UART和RS-232標準。

RS-232

RS-232的最大電纜長度為50英尺。 但實際上它取決於波特率、電纜的等效電容和環境噪聲。 下表是TI多年前透過實驗總結的一些經驗法則。

幾種最常用的序列資料傳輸匯流排(3) - 無人不知的UART

TTL-UART

TTL電平的UART僅支援5V的電壓擺幅,因此訊號傳輸的距離以及能夠支援到的波特率取決於下面的3個元素:

電纜的電阻 - 電纜越長電阻也就越高

電纜的電容:大家知道電容效應會阻礙訊號電平的變化

噪聲:任何環境中都會有噪聲,帶遮蔽的雙絞線電纜對訊號的傳輸會有幫助