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