Arduino菜鳥通俗版解讀系列(7)通信類型總結
來自專欄無線圖傳1 人贊了文章
這一篇打算總結一些基本概念。之所以放到第7篇才講這個內容有兩點原因:1.前幾篇內容中逐漸接觸到一些關於通信的知識,那麼到第7篇的時候也差不多需要匯總一下了;2.本人在做四軸無人機項目時發現在這些基本概念上有一些沒講清楚,同時這些不清楚的概念也會導致在軟體編寫時出現了一些彎路,所以感覺非常有必要把通信的概念梳理一下。為此本人也專門查閱了一些資料,整理了一下。
那麼本篇會講些什麼內容呢?主要有:串列通信,並行通信,串口通信USART,SPI,I2C,波特率。還是按照本系列的宗旨,我會講我覺得比較有用的方面,也就是在做Arduino嵌入式項目時你必須知道的內容,如果不知道或者沒搞清楚有可能會導致項目出錯。當然如果你想做一些很低層的嵌入式工作可能本篇的內容就不夠深入了,但是如果你像我一樣藉助很多「庫」文件來做項目那麼本篇內容應該足夠你應付實際問題了。
圖1中顯示的是前幾篇提到的各種通信模式的關係。最上層分兩大類:串列通信和並行通信;並行通信到目前為止還沒有涉及到,涉及到的都屬於串列通信。串列通信下面又分好多種不同的協議方式:SPI,I2C,USART等等,當然串列通信下面包含的不僅僅是圖1中所示的這三種,有很多種協議方式,但是目前我們在本系列中接觸到的是圖1中這三種,在以後的學習中可能還會接觸更多不同種類但是它們之間的區別無非也就是今天要講的幾個方面。下面一一對這些概念進行介紹:
串列通信---所謂串列通信就是一堆數據,被一個一個地傳輸,這時候看上去就像一個「串串」,所以叫串列通信,見圖2。串列通信是一個大類,凡是數據被一個一個傳輸的都屬於串列通信。像SPI,I2C,USART等等,它們都是將數據一個一個傳輸的,而區別僅僅在於一些細節上,但是從大的原理上講他們都是屬於串列通信。
並行通信---所謂並行通信是和串列通信想區別的,並行通信就是一次同時傳輸多位數據,這些數據就像肩並肩一樣被傳輸出去。從圖2中可以看到,並行通信一次可以傳輸多位數據,而串列通行一次這能傳輸一位數據。
所以從理論上講,並行通信效率要高於串列通信。講到這裡我想到一個很有趣的例子,在我上小學的時候,有個小朋友經常被老師罰寫字,比如老師會罰他一個字寫100遍,當時他就投機取巧地將三支筆綁一起來寫字,這樣每寫一次就會出三個字,這就是一種樸素的並行通信思想。不過雖然並行通信效率高,但是它出錯率也高,因為要實現並行通信意味著需要多條通道同時運行,串列通信就不同了,由於串列通信一次只發送一位數據,所以它只需要一條通道。那麼好,通道多了自然出錯的概率就大了。這也很容易理解,試想一位交警,他需要同時管理8條馬路,另外一位交警他只需要管理一條馬路,你說哪個人出錯的可能性大呢?當然是同時管8條馬路的那位,所謂忙中出錯,這條鐵律不光對人有用,對機器也一樣。
講完了最頂層的區別,接下來我們單獨看看串列通信下面這些協議之間的區別。
SPI---見圖3,圖中是SPI的引腳示意圖。假如你在使用一塊SPI通信模式的模塊,這時候怎麼和Arduino連接呢?其實在Arduino上Pin13,Pin12,Pin11,Pin10分別被設定為SCLK,MISO,MOSI,SS引腳。什麼意思呢?意思就是這幾個引腳在被用作普通的I/O介面時,也可以在SPI串列通信時被用作對應功能的引腳。SCLK是「時鐘引腳」,MISO是「主機發送從機接收引腳」,MOSI是「主機接收從機發送引腳」,SS是「片選引腳」。這些引腳是什麼意思呢?
SCLK時鐘引腳:在串列通信中通常有一個主機從機的概念,SPI既然是串列通信的一種當然也有主從機的概念。主機一般是發送時鐘信號的,從機是接收時鐘信號的。這個時鐘信號是幹什麼的呢?說白了就是協調主機,從機之間發送接收動作的。所以圖3中所示SPI協議下,Arduino和模塊之間不需要設定波特率,因為他們之間的協調通過時鐘信號就可以完成。
MISO,MOSI:主機發送信息給從機時,信息是通過MOSI傳送的;主機接收從機信息時,信息由MISO傳送的。其實他倆的英文寫法可能會更清晰,MISO即」master in slave out",MOSI即"master out slave in"。
SS片選引腳:片選引腳就是「模塊晶元選擇引腳」。看名字就知道其意思,圖3中畫的是1對1通信,假如是1對多通信的話就需要SS片選引腳來選擇我們想要對話的模塊了。
I2C---圖4中是I2C協議的示意圖。我們前面講過SPI,I2C都屬於串列通信,那麼他們的區別又是什麼呢?對比圖3和圖4就可以知道:1.SPI有兩條數據線MOSI和MISO,I2C只有一條數據線SDA;2.SPI有片選引腳,I2C沒有片選引腳。
先說數據線的差別:從圖4中可見,Arduino的4號引腳可被用作I2C模式下的SDA引腳,就是數據傳輸引腳,它相當於圖3中SPI模式下的MOSI和MISO兩者的結合。所以這意味著I2C發送和接收只能同時做一樣,即半雙工,因為它只有一根線,同一時間要嘛發送要嘛接收;而SPI可以同時進行發送和接收動作,這就是全雙工,因為SPI有兩根線,一根發送一根接收。
接著說片選引腳:SPI中我們說到片選引腳是用來選擇要通信的模塊用的,那麼I2C沒有片選引腳是不是意味著I2C協議沒辦法做到1對多通信呢?當然不是的。I2C也可以做到1對多通信,只不過I2C在選擇模塊時也是通過SDA引腳實現的。具體做法是:當SDA數據引腳開始傳送數據的時候,它會先傳送一個片選信號,即需要通信的模塊的編號,然後才開始傳送數據;打個不恰當的比方,假設現在有1個主機10歌從機,假如主機要給3號從機發送數據,那麼主機的SDA會先發送一個數據3,這時候所有從機都會收到這個信號,但是除了3號從機以外其他從機在接到這個數據後會保持靜默狀態,而3號從機會發出一個確認信號給主機,這時候主機和3號從機就建立了通信狀態,接下來主機就開始傳送後續的數據給3號從機了。這就是I2C與SPI在片選引腳上的區別。
上面時I2C與SPI不同之處,而I2C和SPI相同之處在於它們都有時鐘信號,這就意味著它們都不需要設置波特率。
USART---,USART又叫串口通信,圖5所示就是USART的引腳連接方式。其實在前面第4篇文章中我們講到過這個連接方式圖(第4篇中圖5),可看到USART即沒有時鐘引腳,也沒有片選引腳,所以這就決定了USART協議的兩大特點:1.由於沒有時鐘信號所以USART需要另外的方法來協調主機和從機之間的動作,即「設定波特率」;2.由於沒有片選引腳,USART只能單點對單點通信,不能1對多或者多對1。下面分別講講這兩大特點:
波特率:波特率往往會和另一個概念「比特率」混淆,不過通常情況下兩者數量上一致。在Arduino上通常不需要區分兩者區別,為了簡單起見我就簡單地下個定義:在Arduino上,波特率就是比特率,即每秒發送的bit數量。
USART的點對點通信:Arduino UNO只有一套串口通信介面,即一個TX一個RX,所以如果採用USART協議,Arduino UNO同時只能和一個外設進行通信。不過有兩點要說明:首先,Arduino是一個系列,它還有高端版本的版子可供選用,而這些高端版子擁有不止一套的USART串口,比如Arduino Mega,所以Arduino Mega 可以同時與多個設備通信。其次,Arduino UNO的的串口通信分為硬串口和軟串口兩種,什麼意思呢?硬串口就是默認的Pin0為RX,Pin1為TX;不過你也可以自己定義哪一個Pin作為TX,哪一個Pin作為RX,這就是軟串口。軟串口的定義方法見圖6。可見軟串口的使用也需要通過「庫」文件,不過這個庫文件「Software.h"是Arduino自帶的,不需要從網上下載,直接打命令就可以。圖6中的例子就是將Pin2作為RX,Pin3作為TX。
上面就是對SPI,I2C,USART的介紹。總結一下本文:
1. SPI,I2C有時鐘引腳,不需要設置波特率,屬於同步串列通信;
2. USART沒有時鐘引腳,需要設置波特率,屬於非同步串列通信;
3. SPI和I2C可以實現1對1,1對多的通信;USART只能是1對1的通信。
推薦閱讀:
※小米8終於全平台現貨了,網友:米8這是賣不動的節奏?
※[博應用軟體]怎樣激活電腦win10系統?
※2018上半年度旗艦手機拍照排行
※「用戶」到底是什麼?