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