串行通信 Serial Communication
介紹
嵌入式電子產(chǎn)品全部是關(guān)于互連電路(處理器或其他集成電路)以創(chuàng)建共生系統(tǒng)。 為了讓這些單獨的電路交換他們的信息,他們必須共享一個通用的通信協(xié)議。 已經(jīng)定義了數(shù)百種通信協(xié)議來實現(xiàn)這種數(shù)據(jù)交換,并且通常每種協(xié)議都可以分為兩類:并行或串行。
并行與串行
并行接口同時傳輸多個位。 他們通常需要數(shù)據(jù)總線 - 通過八根,十六根或更多的電線進(jìn)行傳輸。 數(shù)據(jù)以巨大的1和0的巨大沖擊波傳輸。
一個8位數(shù)據(jù)總線,由一個時鐘控制,每個時鐘脈沖發(fā)送一個字節(jié)。 使用9根導(dǎo)線。
串行接口每次只傳輸一個數(shù)據(jù)。 這些接口可以在一根電線上工作,通常不會超過四根。
串行接口示例,每個時鐘脈沖發(fā)送一位。 只需要2根電線!
將兩個接口想象成一串汽車:一個并行接口將是8+車道的大型高速公路,而串行接口更像是一條雙線農(nóng)村鄉(xiāng)村公路。 在一段時間內(nèi),大型高速公路可能會讓更多的人到達(dá)目的地,但是這個雙向農(nóng)村地區(qū)的服務(wù)宗旨和成本只是建立資金的一小部分。
并行通信當(dāng)然有其好處。 它快速,簡單并且相對容易實施。 但它需要更多的輸入/輸出(I / O)線。 如果你曾經(jīng)將一個項目從一個基本的Arduino Uno移動到一個Mega,那么你就知道微處理器上的I / O線可能很珍貴,而且很少。 所以,我們經(jīng)常選擇串行通信,犧牲潛在的引腳傳輸速度。
異步串行
多年來,已經(jīng)制作了數(shù)十種串行協(xié)議來滿足嵌入式系統(tǒng)的特殊需求。 USB(通用串行總線)和以太網(wǎng)是幾個更為人熟知的計算串行接口。其他非常常見的串行接口包括SPI,I2C和今天要討論的串行標(biāo)準(zhǔn)。每個串行接口都可以分為兩組:同步或異步。
同步串行接口總是將其數(shù)據(jù)線與時鐘信號配對,因此同步串行總線上的所有器件共享一個公共時鐘。這使得更簡單,通常更快的串行傳輸,但它也需要通信設(shè)備之間至少一個額外的電線。同步接口的例子包括SPI和I2C。
異步意味著數(shù)據(jù)在沒有外部時鐘信號支持的情況下傳輸。這種傳輸方式非常適合最小化所需的線路和I / O引腳,但這確實意味著我們需要付出一些額外的努力來可靠地傳輸和接收數(shù)據(jù)。這里討論的串行協(xié)議是異步傳輸?shù)淖畛R娦问?。實際上,這是很常見的,當(dāng)大多數(shù)人說“串行”時,他們正在談?wù)撨@個協(xié)議。
無時鐘串行協(xié)議廣泛用于嵌入式電子產(chǎn)品中。
串行規(guī)則
異步串行協(xié)議有許多內(nèi)置的規(guī)則機制,這些機制有助于確保健壯且無錯誤的數(shù)據(jù)傳輸。這些機制,我們用來避開外部時鐘信號,是:
數(shù)據(jù)位,
同步比特,
奇偶校驗位,
和波特率。
通過各種各樣的信號機制,您將發(fā)現(xiàn)沒有一種方法可以串行發(fā)送數(shù)據(jù)。該協(xié)議是高度可配置的。關(guān)鍵部分是確保串行總線上的兩個設(shè)備都配置為使用完全相同的協(xié)議。
波特率
波特率指定通過串行線路發(fā)送數(shù)據(jù)的速度。它通常以每秒比特數(shù)(bps)為單位表示。如果反轉(zhuǎn)波特率,則可以發(fā)現(xiàn)傳輸單個位需要多長時間。此值決定發(fā)送器將串行線路保持高/低電平的時間或接收設(shè)備采樣線路的時間。
波特率可以是任何合理的值。唯一的要求是兩臺設(shè)備的運行速度相同。最常見的波特率之一,特別是對于速度不重要的簡單工具,其波特率為9600 bps。其他“標(biāo)準(zhǔn)”波特率分別為1200,2400,4800,19200,38400,57600和115200。
波特率越高,發(fā)送/接收的數(shù)據(jù)越快,但數(shù)據(jù)傳輸?shù)乃俣扔邢?。你通??床坏剿俣瘸^115200--這對于大多數(shù)微控制器來說速度很快。太高了,你會在接收端看到錯誤,因為時鐘和采樣周期不能跟上。
構(gòu)建數(shù)據(jù)
每個傳輸?shù)臄?shù)據(jù)塊(通常是一個字節(jié))實際上是以一個數(shù)據(jù)包或一個比特幀發(fā)送的。 通過將同步和奇偶校驗位添加到我們的數(shù)據(jù)來創(chuàng)建幀。
一個串行幀。 幀中的一些符號具有可配置的位大小。
我們來詳細(xì)介紹這些框架的每個部分。
數(shù)據(jù)塊
每個串行數(shù)據(jù)包的真正價值在于它攜帶的數(shù)據(jù)。 我們不明確地稱這塊數(shù)據(jù)為塊,因為它的大小沒有具體說明。 每個數(shù)據(jù)包中的數(shù)據(jù)量可以設(shè)置為5到9位。 當(dāng)然,標(biāo)準(zhǔn)數(shù)據(jù)大小是您的基本8位字節(jié),但其他大小有其用途。 7位數(shù)據(jù)塊可以比8更有效,特別是如果您只是傳輸7位ASCII字符。
在達(dá)成字符長度之后,這兩種串行設(shè)備也必須同意其數(shù)據(jù)的字節(jié)順序。 數(shù)據(jù)最重要的位(msb)發(fā)送到最少,反之亦然? 如果沒有另外說明,通??梢约僭O(shè)數(shù)據(jù)首先傳輸最低有效位(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ù),并將其添加到數(shù)據(jù)字節(jié)(如奇數(shù)個1(5))的數(shù)據(jù)字節(jié)中,則奇偶校驗位將設(shè)置為1.相反,如果奇偶校驗?zāi)J皆O(shè)置為奇數(shù) ,奇偶校驗位將為0。
奇偶校驗是可選的,不是非常廣泛的使用。 它可能有助于跨嘈雜的媒體進(jìn)行傳輸,但它也會減慢數(shù)據(jù)傳輸?shù)乃俣龋⒁蟀l(fā)送者和接收者都執(zhí)行錯誤處理(通常,必須重新發(fā)送失敗的接收數(shù)據(jù))。
9600 8N1(一個例子)
9600 8N1 - 9600波特,8個數(shù)據(jù)位,無奇偶校驗和1個停止位 - 是最常用的串行協(xié)議之一。 那么,一個或兩個9600 8N1數(shù)據(jù)會是什么樣子呢? 舉個例子吧!
傳輸ASCII字符'O'和'K'的設(shè)備必須創(chuàng)建兩個數(shù)據(jù)包。 O(大寫)的ASCII值為79,分解為8位二進(jìn)制值01001111,而K的二進(jìn)制值為01001011.剩下的就是追加同步位。
沒有具體說明,但是假定數(shù)據(jù)首先傳輸?shù)阶畹臀弧?注意兩個字節(jié)在從右到左讀取時是如何發(fā)送的。
由于我們以9600bps的速度傳輸數(shù)據(jù),因此將每個比特位保持在高位或低位的時間為每比特1 /(9600bps)或104μs。
對于發(fā)送的每個字節(jié)的數(shù)據(jù),實際上有10位被發(fā)送:一個起始位,8個數(shù)據(jù)位和一個停止位。 所以,在9600bps時,我們實際上是每秒發(fā)送9600比特或每秒960(9600/10)字節(jié)。
現(xiàn)在您已經(jīng)知道如何構(gòu)建串行數(shù)據(jù)包了,我們可以轉(zhuǎn)到硬件部分。 在那里我們將看到1和0以及波特率如何在信號電平上實現(xiàn)!
布線和硬件
串行總線只包含兩條線 - 一條用于發(fā)送數(shù)據(jù),另一條用于接收數(shù)據(jù)。 因此,串行設(shè)備應(yīng)該有兩個串行引腳:接收器,RX和發(fā)送器TX。
請注意,這些RX和TX標(biāo)簽是與設(shè)備本身相關(guān)的。所以來自一個設(shè)備的RX應(yīng)該到達(dá)另一個設(shè)備的TX,反之亦然。如果您習(xí)慣將VCC連接到VCC,GND連接到GND,MOSI連接到MOSI等,這很奇怪,但是如果您仔細(xì)想想,這很有意義。發(fā)射機應(yīng)該與接收機通話,而不是與其他發(fā)射機通話。
兩個設(shè)備都可以發(fā)送和接收數(shù)據(jù)的串行接口是全雙工或半雙工。全雙工意味著兩個設(shè)備可以同時發(fā)送和接收。半雙工通信意味著串行設(shè)備必須輪流發(fā)送和接收。
一些串行總線可能只能通過發(fā)送和接收設(shè)備之間的單個連接而脫離。例如,我們的支持串行的液晶顯示屏都是耳朵,并且沒有任何數(shù)據(jù)可以傳輸回控制設(shè)備。這就是所謂的單工串行通信。所有你需要的是從主設(shè)備的TX到聽眾的RX線路的單線。
硬件實現(xiàn)
我們已經(jīng)從概念方面介紹了異步串行。 我們知道我們需要哪些導(dǎo)線。 但是,串行通信如何在信號級實際實現(xiàn)? 實際上,它有多種方式。 串行信號有各種標(biāo)準(zhǔn)。 我們來看幾個更流行的串行:邏輯電平(TTL)和RS-232硬件實現(xiàn)。
當(dāng)微控制器和其他低電平集成電路進(jìn)行串行通信時,他們通常以TTL(晶體管 - 晶體管邏輯)電平進(jìn)行通信。 TTL串行信號存在于微控制器的電壓供應(yīng)范圍之間 - 通常為0V至3.3V或5V。 處于VCC電平(3.3V,5V等)的信號表示空閑線路,值為1或停止位。 0V(GND)信號表示一個起始位或一個數(shù)值為0的數(shù)據(jù)位。
RS-232可以在一些更古老的計算機和外圍設(shè)備上找到,就像TTL系列的頭部翻轉(zhuǎn)一樣。 RS-232信號通常介于-13V和13V之間,但該規(guī)范允許+/- 3V至+/- 25V之間的任何值。 在這些信號上,低電壓(-5V,-13V等)表示空閑線路,停止位或值為1的數(shù)據(jù)位。高RS-232信號表示啟動位或0- 值數(shù)據(jù)位。 這與TTL系列相反。
在兩種串行信號標(biāo)準(zhǔn)之間,TTL更容易實現(xiàn)到嵌入式電路中。 然而,低電壓水平在長傳輸線上更容易損失。 RS-232或更復(fù)雜的標(biāo)準(zhǔn)如RS-485,更適合長距離串行傳輸。
將兩個串行設(shè)備連接在一起時,確保其信號電壓匹配很重要。 您不能直接將TTL串行設(shè)備與RS-232總線連接。 你必須改變這些信號!
接下來,我們將探討微控制器用于在串行接口上并行總線上轉(zhuǎn)換數(shù)據(jù)的工具。UART!
UART
這個串行謎題的最后一部分是找到一些東西來創(chuàng)建串行數(shù)據(jù)包并控制這些物理硬件線路。 輸入UART。
通用異步接收器/發(fā)送器(UART)是負(fù)責(zé)實現(xiàn)串行通信的電路塊。 本質(zhì)上,UART充當(dāng)并行和串行接口之間的媒介。 在UART的一端是一條八線左右的數(shù)據(jù)線(加上一些控制引腳),另一端是兩條串行線 - RX和TX。
超簡化的UART接口。 一端并行,另一端串行。
UART確實作為獨立IC存在,但它們更常見于微控制器內(nèi)部。 你必須檢查你的微控制器的數(shù)據(jù)表,看它是否有任何UART。 有些沒有,有的有一個,有的有很多。 例如,基于“老忠實”ATmega328的Arduino Uno只有一個UART,而基于ATmega2560的Arduino Mega則有四個UART。
由于首字母縮寫詞中的R和T指示,UART負(fù)責(zé)發(fā)送和接收串行數(shù)據(jù)。 在發(fā)送端,UART必須創(chuàng)建數(shù)據(jù)包(附加同步和奇偶校驗位),并將該數(shù)據(jù)包以精確定時(根據(jù)設(shè)置的波特率)從TX線路發(fā)出。 在接收端,UART必須根據(jù)預(yù)期的波特率對RX線進(jìn)行采樣,挑出同步位并將數(shù)據(jù)吐出。
內(nèi)部UART框圖(由Exar ST16C550數(shù)據(jù)表提供)
更高級的UART可能會將其接收到的數(shù)據(jù)放入緩沖區(qū),直到微控制器獲得它。 UART通常會以先進(jìn)先出(FIFO)的方式釋放其緩沖數(shù)據(jù)。 緩沖區(qū)可以小至幾位,或者可以大至數(shù)千字節(jié)。
軟件UART
如果一個微控制器沒有UART(或者沒有足夠的),串行接口可能會被比特沖突 - 直接由處理器控制。 這就是SoftwareSerial所采用的Arduino庫。 比特沖突是處理器密集型的,通常不像UART那么精確,但它在一個緊湊的環(huán)境中工作。
常見的陷阱
這就是關(guān)于串行通信的一切。 留下幾個常見的錯誤,這對任何經(jīng)驗級別的工程師來說都很容易:
RX到TX,TX到RX
似乎很簡單。 盡可能多地希望他們的標(biāo)簽匹配,請務(wù)必跨越串行設(shè)備之間的RX和TX線路。
FTDI Basic編程Pro Mini。 注意RX和TX交叉!
波特率不匹配
波特率就像串行通信的語言。如果兩個設(shè)備不能以相同的速度說話,數(shù)據(jù)可能會被誤解,或者完全被忽略。如果所有接收設(shè)備在接收線上看到的都是垃圾,請檢查確保波特率匹配。
數(shù)據(jù)以9600 bps傳輸,但以19200 bps傳輸。 波特不匹配=垃圾。
主線爭奪
串行通信旨在允許只有兩個設(shè)備通過一條串行總線進(jìn)行通信。 如果多個設(shè)備試圖在同一條串行線路上傳輸,則可能會遇到總線爭用。 敦敦敦...
例如,如果您將GPS模塊連接至Arduino,則可以將該模塊的TX線連接至Arduino的RX線。 但是,Arduino RX引腳已連接到USB至串行轉(zhuǎn)換器的TX引腳,無論何時您編程Arduino或使用串行監(jiān)視器時都會使用該引腳。 這就設(shè)定了GPS模塊和FTDI芯片同時嘗試在同一條線路上傳輸?shù)臐撛谇闆r。
兩個發(fā)送器發(fā)送給一個接收器會導(dǎo)致總線爭用的可能性。
試圖在同一行上同時傳輸數(shù)據(jù)的兩臺設(shè)備很糟糕! 在“最好”的情況下,這兩款設(shè)備都不會發(fā)送數(shù)據(jù)。 在最壞的情況下,這兩款器件的發(fā)射線路都工作(盡管這很罕見,并且通常受到保護(hù))。
將多個接收設(shè)備連接到單個傳輸設(shè)備可能是安全的。 沒有真正的規(guī)格,但它會起作用。 例如,如果將串行LCD連接到Arduino,最簡單的方法可能是將LCD模塊的RX線連接到Arduino的TX線。 Arduino的TX已連接到USB編程器的RX線,但仍然只剩下一個設(shè)備控制傳輸線。
像這樣分配TX線路從固件的角度來看仍然是危險的,因為你不能挑選哪個設(shè)備聽到什么傳輸。 液晶顯示器最終會收到不適合它的數(shù)據(jù),這可能會命令它進(jìn)入未知狀態(tài)。
一般情況下 - 一個串行總線,兩個串行設(shè)備!
-
集成電路
+關(guān)注
關(guān)注
5425文章
12070瀏覽量
368511 -
通信協(xié)議
+關(guān)注
關(guān)注
28文章
1037瀏覽量
41185 -
并行接口
+關(guān)注
關(guān)注
0文章
33瀏覽量
15514 -
總線
+關(guān)注
關(guān)注
10文章
2960瀏覽量
89777 -
串行通信
+關(guān)注
關(guān)注
4文章
588瀏覽量
36197
發(fā)布評論請先 登錄
介紹一下串行通信的原理
基于AT89C51應(yīng)用系統(tǒng)的串行通信設(shè)計
實現(xiàn)FPGA與PC的串行通信

串行通信的介紹及串行通信的應(yīng)用說明

串行通信技術(shù)介紹

評論