日本强好片久久久久久AAA_色综合久久天天综合观看_久久精品国产亚洲av日韩_久久久久一级片

常用的串行數(shù)據(jù)傳輸總線(3) - UART

在SPI中有SCLK,在I2C中有SCK,這種有時(shí)鐘的傳輸方式叫同步傳輸,有時(shí)鐘做參考可以方便接收端對(duì)接受數(shù)據(jù)的判決,但同時(shí)也帶來一些限制,比如:


需要一根多余的連線用于時(shí)鐘信號(hào)


因?yàn)樾枰獣r(shí)鐘的邊沿對(duì)數(shù)據(jù)進(jìn)行采樣判決,時(shí)鐘的帶寬至少要是數(shù)據(jù)帶寬的2倍,因此也就限制了系統(tǒng)的數(shù)據(jù)傳輸速率


長距離傳輸?shù)臅r(shí)候數(shù)據(jù)信號(hào)和時(shí)鐘信號(hào)容易失去同步(即便倆人一起跑步,速度越快越不容易步調(diào)一致)

常用的串行數(shù)據(jù)傳輸總線(3) - UART

串行通信(同步)



所以,傳輸要往高速走,同步串行的傳輸方式就力不從心了,雖然可以在同樣時(shí)鐘頻率的情況下靠增加數(shù)據(jù)線來提高傳輸?shù)臄?shù)據(jù)量(SD卡就這么干的),但信號(hào)線越多,也就越難同步,最后搞得跟并行傳輸一樣了。


并行通信(PCB的布線在高速時(shí)將變得非常困難)


因此更高速的傳輸最好是采用異步的方式,也就是說不再有多余的時(shí)鐘信號(hào)線跟著,傳輸?shù)男盘?hào)線中只有數(shù)據(jù)信號(hào),異步傳輸不僅能夠節(jié)省連線,同時(shí)還可以提高傳輸速度,比如USB、以太網(wǎng)。。。這種快到10Gbps的傳輸都只能靠異步的方式。


今天我們要講的UART(通用異步接收/發(fā)送)就是一種異步的傳輸方式,不過它是相對(duì)低速的(最低1200bps),這是因?yàn)樗聛淼臅r(shí)候人們的想象力還非常有限,能用9.6Kbps傳傳數(shù)據(jù)已經(jīng)非常開心了,2000年前通過模擬電話線Modem傳57.6Kbps的數(shù)據(jù)(收發(fā)郵件、網(wǎng)頁瀏覽)已經(jīng)感覺飛快了。


現(xiàn)在幾乎每個(gè)MCU都標(biāo)配UART,主要的功能是用來跟上位機(jī)連接的,以便讓上位機(jī)對(duì)其進(jìn)行調(diào)試或者執(zhí)行簡單的數(shù)據(jù)通信,比如顯示一下狀態(tài)、傳遞幾個(gè)命令等。如果需要高速的數(shù)據(jù)傳輸?不是有USB了么!經(jīng)過近20年的演進(jìn),USB 已經(jīng)從最早的1.5Mbps一路升級(jí)到12Mbps、480Mbps、現(xiàn)在的10Gbps,USB已經(jīng)承擔(dān)了兩個(gè)系統(tǒng)之間高速數(shù)據(jù)傳輸?shù)闹饕負(fù)?dān)。


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


常用的串行數(shù)據(jù)傳輸總線(3) - UART

UART的工作原理

UART(Universal Asynchronous Receiver/Transmitter,翻譯過來叫通用異步收發(fā)) 其實(shí)不是像SPI和I2C這樣的通信協(xié)議,而是MCU(微控制器)中的物理電路或獨(dú)立的IC,它的主要用途是發(fā)送和接收串行數(shù)據(jù)。


在UART通信中,兩個(gè)UART可以直接相互通信。 發(fā)送UART將來自CPU等控制設(shè)備的并行數(shù)據(jù)轉(zhuǎn)換為串行格式,并將其串行發(fā)送到接收端的UART,接收UART將串行數(shù)據(jù)轉(zhuǎn)換回接收設(shè)備的并行數(shù)據(jù)。 在兩個(gè)UART之間傳輸數(shù)據(jù)只需要兩根線, 數(shù)據(jù)流從發(fā)送UART的Tx引腳到接收UART的Rx引腳:


超簡化的UART接口,左側(cè)為并行,右側(cè)為串行


通用異步接收器/發(fā)送器(UART)是負(fù)責(zé)實(shí)現(xiàn)串行通信的電路塊。 本質(zhì)上,UART充當(dāng)并行和串行接口之間的中介。 UART的一端是八條左右數(shù)據(jù)線(加上一些控制引腳),另一條是兩條串行線 - RX和TX。


兩個(gè)設(shè)備可以發(fā)送和接收數(shù)據(jù)的串行接口是全雙工或半雙工。 全雙工意味著兩個(gè)設(shè)備可以同時(shí)發(fā)送和接收。 半雙工通信意味著串行設(shè)備必須輪流發(fā)送和接收。


UART以異步方式發(fā)送數(shù)據(jù),也就是說沒有時(shí)鐘信號(hào)將發(fā)送UART的位輸出與接收UART的位采樣進(jìn)行同步。 發(fā)送UART將“起始”和“停止”位添加到正在傳輸?shù)臄?shù)據(jù)包中, 這些位定義了數(shù)據(jù)包的開始和結(jié)束,接收UART基于這些位的信息知道何時(shí)開始讀取輸入的串行數(shù)據(jù)。


當(dāng)接收UART檢測(cè)到起始位時(shí),它以特定的頻率(也就是“波特率”)讀取輸入的串行數(shù)據(jù)。波特率是數(shù)據(jù)傳輸速度的度量,單位-每秒位數(shù)(bps)。 兩個(gè)UART必須以相同的波特率運(yùn)行。發(fā)送和接收UART之間的波特率相差不能超過10%,偏差太遠(yuǎn)就無法對(duì)數(shù)據(jù)進(jìn)行正確的解讀。


當(dāng)然兩個(gè)UART還必須配置為發(fā)送和接收相同的數(shù)據(jù)包結(jié)構(gòu)。


異步通信以一個(gè)字符為傳輸單位,通信中兩個(gè)字符間的時(shí)間間隔多少是不固定的,然而在同一個(gè)字符中的兩個(gè)相鄰位間的時(shí)間間隔是固定的。兩個(gè)相鄰位間的時(shí)間間隔與UART通信的波特率有關(guān),波特率用來表征UART通信中數(shù)據(jù)傳輸?shù)乃俾?,即每秒鐘傳送的二進(jìn)制位數(shù)。例如數(shù)據(jù)傳送速率為120字符/秒,而每一個(gè)字符為10位(1個(gè)起始位,7個(gè)數(shù)據(jù)位,1個(gè)校驗(yàn)位,1個(gè)結(jié)束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。


我們?cè)谡{(diào)試種最比較常見的波特率是9600bps,其它的“標(biāo)準(zhǔn)”波特還有1200、2400、4800、19200、38400、57600和115200。


以9600bps傳輸為例,將每個(gè)位高或低保持的時(shí)間為1 /(9600 bps)或每位104μs,對(duì)于發(fā)送的每個(gè)數(shù)據(jù)字節(jié),實(shí)際上發(fā)送了10位:起始位,8個(gè)數(shù)據(jù)位和一個(gè)停止位。 因此,在9600bps時(shí),我們實(shí)際上每秒發(fā)送9600位或每秒960(9600/10)字節(jié)。


波特率越高,發(fā)送/接收的數(shù)據(jù)越快,但數(shù)據(jù)傳輸?shù)乃俣扔邢蕖Dǔ2粫?huì)看到超過115200的速度 - 這對(duì)于大多數(shù)微控制器來說都很快。太高了,你會(huì)開始看到接收端的錯(cuò)誤,因?yàn)闀r(shí)鐘和采樣周期無法跟上。


數(shù)據(jù)幀構(gòu)成

發(fā)送的每個(gè)數(shù)據(jù)塊(通常是一個(gè)字節(jié))實(shí)際上是以比特或比特幀發(fā)送的。通過將同步和奇偶校驗(yàn)位附加到數(shù)據(jù)來創(chuàng)建幀。


起始位:先發(fā)出一個(gè)邏輯”0”信號(hào),表示傳輸字符的開始。

數(shù)據(jù)位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴(kuò)展BCD碼(8位)。小端傳輸

校驗(yàn)位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗(yàn))或奇數(shù)(奇校驗(yàn))

停止位:它是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志。可以是1位、1.5位、2位的高電平。

空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路上沒有資料傳送。


下面我們?cè)敿?xì)介紹一下每一部分。


數(shù)據(jù)塊

每個(gè)串行數(shù)據(jù)包的真正有營養(yǎng)的是它攜帶的數(shù)據(jù),我們且稱之為“數(shù)據(jù)塊”,它沒有具體的大小限制。 每個(gè)數(shù)據(jù)包中的數(shù)據(jù)量可以設(shè)置為5到9位。 標(biāo)準(zhǔn)數(shù)據(jù)的大小一般是最基本的8位字節(jié),但其它大小也有其用途,有時(shí)候7位數(shù)據(jù)能比8位更高效,比如只是用來傳輸7位ASCII字符。


在統(tǒng)一了字符長度后,兩個(gè)串行設(shè)備也必須就其數(shù)據(jù)的字節(jié)順序達(dá)成一致。 數(shù)據(jù)是最高位(msb)還是最低位先發(fā)送? 缺省設(shè)定為首先傳輸最低有效位(lsb)。


同步位


同步位是每個(gè)數(shù)據(jù)塊傳輸?shù)膬蓚€(gè)或三個(gè)特殊位。 它們是起始位和停止位,顧名思義,這些位標(biāo)記了數(shù)據(jù)包的開頭和結(jié)尾。 始終只有一個(gè)起始位,但停止位的數(shù)量可配置為一個(gè)或兩個(gè)(通常情況下保留為一個(gè))。


起始位始終是由從1到0的空閑數(shù)據(jù)線來指示,而停止位則將通過將該信號(hào)線保持為1而轉(zhuǎn)換回空閑狀態(tài)。


起始位:單字節(jié)UART發(fā)送的第一位。 它表示數(shù)據(jù)線正在離開其空閑狀態(tài)。 空閑狀態(tài)通常為邏輯高,因此起始位為邏輯低。起始位是開銷位, 這意味著它有助于接收器和發(fā)射器之間的通信,但不會(huì)傳輸有意義的數(shù)據(jù)。

停止位: 單字節(jié)UART傳輸?shù)淖詈笠晃弧?其邏輯電平與信號(hào)的空閑狀態(tài)相同,即邏輯高, 這是另一個(gè)開銷。


奇偶校驗(yàn)位

奇偶校驗(yàn)是一種非常簡單的低級(jí)錯(cuò)誤檢查方式,它分為兩種方式:奇數(shù)或偶數(shù)。 為了產(chǎn)生奇偶校驗(yàn)位,數(shù)據(jù)字節(jié)的所有5-9位相加,并且求和的奇偶性決定該位是否置位。 例如,假設(shè)奇偶校驗(yàn)設(shè)置為偶數(shù)并且正被添加到數(shù)字字節(jié)(如0b01011101,這串?dāng)?shù)中有奇數(shù)(5)個(gè)1,奇偶校驗(yàn)位將被設(shè)置為1。相反,如果奇偶校驗(yàn)?zāi)J皆O(shè)置為奇數(shù) ,奇偶校驗(yàn)位則為0。

 

同步和采樣

下面我們來看看沒有時(shí)鐘信號(hào)的數(shù)據(jù)在接收端是如何被正確解讀的。


沒有時(shí)鐘對(duì)數(shù)據(jù)做判決,這些數(shù)據(jù)毫無意義。 下圖顯示了原因:


 同一串?dāng)?shù)據(jù)可以有不同的解讀


典型的數(shù)據(jù)信號(hào)只是在邏輯低和邏輯高之間轉(zhuǎn)換的電壓。 只有當(dāng)接收器知道何時(shí)采樣信號(hào)時(shí),接收器才能正確地將這些邏輯狀態(tài)轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù)。


這可以使用單獨(dú)的時(shí)鐘信號(hào)輕松完成 - 例如,發(fā)送器在時(shí)鐘的每個(gè)上升沿更新數(shù)據(jù)信號(hào),然后接收器在每個(gè)下降沿采樣數(shù)據(jù)。但UART接口沒有時(shí)鐘信號(hào)來同步Tx和Rx器件,接收端如何知道何時(shí)采樣發(fā)射端送來的數(shù)據(jù)信號(hào)呢?


發(fā)送端根據(jù)其時(shí)鐘信號(hào)生成比特流,然后接收端的目標(biāo)是使用其內(nèi)部時(shí)鐘信號(hào)在每個(gè)比特周期的中間對(duì)輸入的數(shù)據(jù)流進(jìn)行采樣。雖然在比特周期的中間進(jìn)行采樣不是必要的但卻是最佳的,因?yàn)榻咏忍刂芷诘拈_始或結(jié)束的采樣使得系統(tǒng)對(duì)接收端和發(fā)射端之間的時(shí)鐘頻率差異的魯棒性較差。


接收端序列從起始位的下降沿開始,這是關(guān)鍵同步過程發(fā)生的時(shí)間。接收端的內(nèi)部時(shí)鐘完全獨(dú)立于發(fā)送端的內(nèi)部時(shí)鐘 - 換句話說,第一個(gè)下降沿可以對(duì)應(yīng)于接收端時(shí)鐘周期中的任何點(diǎn):


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


假設(shè)一個(gè)比特周期對(duì)應(yīng)于16個(gè)接收端時(shí)鐘周期。 在這種情況下,同步和采樣可以按如下方式進(jìn)行:


接收過程由起始位的下降沿啟動(dòng)。

接收端等待8個(gè)時(shí)鐘周期,以便建立一個(gè)接近比特周期中間的采樣點(diǎn)。

然后,接收端等待16個(gè)時(shí)鐘周期,使其進(jìn)入第一個(gè)數(shù)據(jù)位周期的中間。

第一個(gè)數(shù)據(jù)位被采樣并存儲(chǔ)在接收寄存器中,然后模塊在采樣第二個(gè)數(shù)據(jù)位之前等待另外16個(gè)時(shí)鐘周期。

重復(fù)此過程直到所有數(shù)據(jù)位都被采樣和存儲(chǔ),然后停止位的上升沿使UART接口返回其空閑狀態(tài)。 


UART的優(yōu)點(diǎn)和缺點(diǎn)

沒有任何一種通信方式和協(xié)議是完美的,因此沒中方式都有其優(yōu)點(diǎn),也有其缺點(diǎn),我們來看看UART的主要優(yōu)缺點(diǎn)。


UART的優(yōu)點(diǎn):

只需要使用兩根信號(hào)線就可以實(shí)現(xiàn)全雙工的數(shù)據(jù)傳輸(不算電源線)

無需時(shí)鐘信號(hào)

有一個(gè)奇偶校驗(yàn)位提供硬件級(jí)別的錯(cuò)誤檢查

數(shù)據(jù)包的結(jié)構(gòu)可以通過兩端之間的協(xié)調(diào)來改變,比較靈活

有豐富的文檔且被廣泛使用的通信方式

相對(duì)比較容易配置和運(yùn)行


UART的缺點(diǎn):

與并行通信以及USART相比,數(shù)據(jù)傳輸?shù)乃俣容^慢

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

不支持多個(gè)從設(shè)備或多個(gè)主設(shè)備的功能

收發(fā)兩個(gè)器件UART的波特率差別不能超過10%


實(shí)際應(yīng)用中的信號(hào)傳輸方式

將兩個(gè)UART的設(shè)備進(jìn)行連接有多種方式,取決于具體的應(yīng)用場(chǎng)景,在這里我們僅看兩種:TTL UART和RS-232。


TTL UART

當(dāng)微控制器和其它器件進(jìn)行串行通信時(shí),通常以TTL電平進(jìn)行通信。 TTL串行信號(hào)存在于微控制器的電源電壓范圍內(nèi) - 通常為0V至3.3V或5V。 VCC電平(3.3V,5V等)的信號(hào)表示空閑線,值1或停止位。 0V(GND)信號(hào)表示起始位或值為0的數(shù)據(jù)位。


RS-232 UART


RS-232(推薦標(biāo)準(zhǔn)232)是連接數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)的串行二進(jìn)制數(shù)據(jù)信號(hào)的標(biāo)準(zhǔn)。 它通常用于計(jì)算機(jī)的老式串口。 TTL電平UART和RS-232的主要區(qū)別就是電壓電平。 RS-232中的數(shù)字信號(hào)為±3至 - ±15V,無論如何都不會(huì)檢測(cè)到接近0V的信號(hào)。


RS-232,可以在一些更古老的計(jì)算機(jī)和外圍設(shè)備上找到,就像TTL串口翻轉(zhuǎn)一樣。 RS-232信號(hào)通常介于-13V和13V之間,但規(guī)格允許從+/- 3V到+/- 25V。 在這些信號(hào)上,低電壓(-5V,-13V等)表示空閑線,停止位或值為1的數(shù)據(jù)位。一個(gè)高的RS-232信號(hào)表示起始位或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


在兩個(gè)串行信號(hào)標(biāo)準(zhǔn)之間,TTL更容易實(shí)現(xiàn)到嵌入式電路中。 然而,低電壓電平更容易受到長傳輸線路的損耗的影響。 RS-232或更復(fù)雜的標(biāo)準(zhǔn)(如RS-485)更適合遠(yuǎn)程串行傳輸。當(dāng)您將兩個(gè)串行設(shè)備連接在一起時(shí),確保其信號(hào)電壓匹配是非常重要的。 


PC和微控制器的連接


實(shí)際的項(xiàng)目中可以有多種方式來連接PC和MCU,最方便的是下面列出的幾種方式中的最后一種。


TTL-UART到RS-232串口(古老的通用方式) 


TTL-UART 到 RS-232串口 到 USB


USB-TTL 轉(zhuǎn)換模塊


全球創(chuàng)客界最火的WiFi模塊ESP8266只需要UART接口和AT指令集進(jìn)行操作


物美價(jià)廉的USB到TTL UART接口轉(zhuǎn)換芯片CP2102(來自SiLabs),通過計(jì)算機(jī)的USB端口仿真UART通信


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


RX-To-TX & TX-To-RX


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



波特率失配


如果數(shù)據(jù)以9600bps的波特率傳輸,并以19200bps的速率接收。 收到的數(shù)據(jù)將是一團(tuán)垃圾! 波特率必須在發(fā)送端和接收端匹配,這是UART串行通信的經(jīng)驗(yàn)法則,波特率的最大允許偏移趨于介于(1-2%)之間。 因此嘗試在兩端生成完全相同的波特率,以避免錯(cuò)配錯(cuò)誤。


UART總線長度 vs 波特率


UART串行總線可以傳輸很長的距離,但傳輸?shù)木嚯x以及最高能夠達(dá)到的波特率都取決于傳輸?shù)迷竭h(yuǎn),波特率也就會(huì)降低,它還取決于UART協(xié)議本身的硬件實(shí)現(xiàn)(物理層)。我們只提到TTL-UART和RS-232標(biāo)準(zhǔn)。


RS-232

RS-232的最大電纜長度為50英尺。 但實(shí)際上它取決于波特率、電纜的等效電容和環(huán)境噪聲。 下表是TI多年前通過實(shí)驗(yàn)總結(jié)的一些經(jīng)驗(yàn)法則。


TTL-UART


TTL電平的UART僅支持5V的電壓擺幅,因此信號(hào)傳輸?shù)木嚯x以及能夠支持到的波特率取決于下面的3個(gè)元素:

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

電纜的電容:大家知道電容效應(yīng)會(huì)阻礙信號(hào)電平的變化

噪聲:任何環(huán)境中都會(huì)有噪聲,帶屏蔽的雙絞線電纜對(duì)信號(hào)的傳輸會(huì)有幫助


圖片加載中...

在線留言