一大罐白雲 2020/9/16
連接:http://www.javashuo.com/article/p-qpoqetla-mu.htmlhtml
SPI(Serial Peripheral Interface)串行外圍設備接口是許多不一樣設備使用的通用通訊協議。例如, SD卡模塊, RFID卡讀取器模塊和 2.4 GHz無線發送器/接收器 均使用SPI與微控制器通訊。
SPI的一個獨特優點是能夠無中斷傳輸數據。能夠在連續流中發送或接收任意數量的位。使用I2C和UART,數據以數據包形式發送,限制爲特定位數。開始和中止條件定義了每一個數據包的開始和結束,所以數據在傳輸過程當中被中斷。
經過SPI通訊的設備處於主從關係。主機是控制設備(一般是微控制器),而從機(一般是傳感器,顯示器或存儲芯片)從主機獲取指令。SPI的最簡單配置是一個主機,一個從機系統,可是一個主機能夠控制多個從機(下面有更多介紹)。
MOSI(主機輸出/從機輸入) –主機將數據發送到從機的線路。安全
MISO(主機輸入/從機輸出) –從機將數據發送到主機的線路。異步
SCLK(時鐘) –時鐘信號線。ui
SS / CS(從站選擇/芯片選擇) –主站用於選擇向其發送數據的從站的線路。
實際上,從站的數量受到系統負載電容的限制,這下降了主機在電壓電平之間準確切換的能力。spa
時鐘信號將主設備的數據位輸出同步到從設備的位採樣。每一個時鐘週期傳輸一位數據,所以數據傳輸的速度取決於時鐘信號的頻率。因爲主機配置並生成時鐘信號,因此SPI通訊始終由主機啓動。3d
設備共享時鐘信號的任何通訊協議都稱爲同步。 SPI是一種同步通訊協議。還有一些 異步方法不使用時鐘信號。例如,在UART通訊中,將雙方都設置爲指示數據傳輸速度和時序的預配置波特率。htm
可使用時鐘極性和時鐘相位的屬性來修改SPI中的時鐘信號。這兩個屬性共同定義什麼時候輸出位以及什麼時候對其進行採樣。主機能夠設置時鐘極性,以容許在時鐘週期的上升沿或降低沿輸出和採樣位。能夠設置時鐘相位,以便在時鐘週期的第一沿或第二沿進行輸出和採樣,而無論它是上升仍是降低。blog
主機能夠經過將從機的CS / SS線設置爲低電壓電平來選擇要與之通訊的從機。在空閒,非傳輸狀態下,從選擇線保持在高電壓電平。主機上可能有多個CS / SS引腳,這容許多個從機並行鏈接。若是僅存在一個CS / SS引腳,則能夠經過菊花鏈將多個從機鏈接到主機。接口
能夠將SPI設置爲與單個主機和單個從機一塊兒運行,也能夠與由單個主機控制的多個從機一塊兒設置。有兩種方法能夠將多個從站鏈接到主站。若是主站有多個從站選擇引腳,則從站能夠按如下方式並聯:
若是隻有一個從設備選擇引腳可用,則能夠經過如下方式菊花鏈鏈接從設備:
圖片
主機經過MOSI線以串行方式將數據發送到從機。從機經過MOSI引腳接收主機發送的數據。從主機發送到從機的數據一般先發送最高有效位。
從機還能夠經過MISO線串行將數據發送回主機。從從機發送回主機的數據一般首先以最低有效位發送。
SPI的讀像是發一個數據那樣簡單,整個總線須要的時鐘信號是由主機端提供的,也就是說不管是給從機發數據或者從從機讀數據,時鐘信號都須要由主機來產生,主機要讀數據的時候須要給從機時鐘信號,這個信號只能是在主機發數據的時候產生,這樣就須要主機發一個數據,這樣就產生了時鐘信號,從機就會把數據放到總線上來了。爲了不這個假髮出去的數據讓從機誤動做,通常都是讓主機爲高電平。
使用SPI有一些優勢和缺點,若是在不一樣的通訊協議之間進行選擇,則應根據項目要求知道什麼時候使用SPI:
UART表明通用異步接收器/發送器(Universal Asynchronous Receiver/Transmitter)。它不是像SPI和I2C這樣的通訊協議,而是微控制器中的物理電路或獨立的IC。UART的主要目的是發送和接收串行數據。
關於UART的最大的優勢之一是它僅使用兩條線在設備之間傳輸數據。
在UART通訊中,兩個UART直接相互通訊。發送UART未來自控制設備(如CPU)的並行數據轉換爲串行形式,以串行方式將其發送到接收UART,而後接收UART將接收到的串行數據轉換回並行數據。只須要兩條線就能夠在兩個UART之間傳輸數據。數據從發送UART的Tx引腳流到接收UART的Rx引腳:
UART 異步傳輸數據,這意味着沒有時鐘信號將發送UART的位輸出與接收UART的位採樣同步。發送UART代替時鐘信號,將開始和中止位添加到正在傳輸的數據包中。這些位定義了數據包的開始和結束,所以接收UART知道什麼時候開始讀取這些位。
當接收UART檢測到起始位時,它將開始以稱爲波特率的特定頻率讀取輸入位。波特率是數據傳輸速度的度量,以每秒位數(bps)表示。 兩個UART必須以大約相同的波特率工做。在位的時序變得太遠以前,發送和接收UART之間的波特率只能相差約10%。
還必須將兩個UART配置爲發送和接收相同的數據包結構。
將要發送數據的UART從數據總線接收數據。數據總線用於經過其餘設備(例如CPU,內存或微控制器)將數據發送到UART。數據以並行形式從數據總線傳輸到發送UART(電路實現參考數字電路多功能移位寄存器)。發送UART從數據總線獲取並行數據後,它將添加起始位,奇偶校驗位和中止位,以建立數據包。接下來,數據包在Tx引腳上逐位串行輸出。接收UART在其Rx引腳上逐位讀取數據包。而後,接收UART將數據轉換回並行形式,並刪除起始位,奇偶校驗位和中止位。最後,接收UART將數據包並行傳輸到接收端的數據總線:
UART傳輸的數據被組織成數據包。每一個數據包包含1個起始位,5至9個數據位(取決於UART),一個可選的奇偶校驗位以及1個或2箇中止位:
UART數據傳輸線一般在不傳輸數據時保持在高電壓電平。爲了開始數據傳輸,發送UART在一個時鐘週期內將傳輸線從高電平拉低到低電平。當接收UART檢測到高到低電壓轉換時,它開始以波特率的頻率讀取數據幀中的位。
數據幀包含正在傳輸的實際數據。若是使用奇偶校驗位,則能夠是5位,最多8位。若是不使用奇偶校驗位,則數據幀的長度能夠爲9位。在大多數狀況下,數據首先以最低有效位發送。
奇偶性描述數字的偶數或奇數。奇偶校驗位是接收UART判斷傳輸期間是否有任何數據更改的方式。電磁輻射,不匹配的波特率或長距離數據傳輸會改變數據位。接收UART讀取數據幀後,它將對值爲1的位數進行計數,並檢查總數是偶數仍是奇數。若是奇偶校驗位爲0(偶數奇偶校驗),則數據幀中的1位應總計爲偶數。若是奇偶校驗位爲1(奇校驗),則數據幀中的1位應合計爲奇數。當奇偶校驗位與數據匹配時,UART知道傳輸沒有錯誤。可是,若是奇偶校驗位爲0,則總數爲奇數;或奇偶校驗位爲1,且總數爲偶數,則UART知道數據幀中的位已更改。
爲了用信號通知數據包的結束,發送UART將數據傳輸線從低電壓驅動到高電壓至少持續兩位時間。
如下是一些利弊,可幫助您肯定它們是否適合您的項目需求:
若是您參與過使用OLED顯示器,氣壓傳感器或陀螺儀/加速度計模塊的項目,則可能會發現本身使用的是I2C。
I2C結合了SPI和UART的最佳功能。使用I2C,您能夠將多個從機鏈接到單個主機(如SPI),而且能夠有多個主機控制一個或多個從機。當您但願有多個微控制器將數據記錄到單個存儲卡或將文本顯示到單個LCD時,此功能很是有用。
與UART通訊同樣,I2C僅使用兩條線在設備之間傳輸數據:
SDA(串行數據) –主站和從站發送和接收數據的線路。
SCL(串行時鐘) –傳送時鐘信號的線。
I2C是串行通訊協議,所以數據沿着單條線(SDA線)單個比特意傳輸。
像SPI同樣,I2C是同步的,所以位輸出經過主機和從機之間共享的時鐘信號同步到位採樣。時鐘信號始終由主機控制。
使用I2C,數據以消息形式傳輸 。消息被分解 爲數據幀。每條消息都有一個包含從站的二進制地址的地址幀,以及一個或多個包含正在發送的數據的數據幀。該消息還包括每一個數據幀之間的開始和中止條件,讀/寫位和ACK / NACK位:
啓動條件: 在SCL線從高電平切換到低電平以前 ,SDA線從高壓電平切換到低壓電平 。
中止條件: SCL線從低切換到高後, SDA線從低電壓切換到高電壓 。
地址幀: 每一個從屬設備惟一的7位或10位序列,用於在主設備要與其通訊時標識該從屬設備。
讀/寫位: 一位,指定主機是向從機發送數據(低電壓)仍是向從機請求數據(高電壓)。
ACK / NACK位: 消息中的每一個幀後均帶有一個確認/不確認位。若是成功接收到地址幀或數據幀,則會從接收設備向發送方返回ACK位。
I2C沒有像SPI這樣的從設備選擇線,所以它須要另外一種方式來讓從設備知道正在向其發送數據,而不是另外一個從設備。它經過尋址來實現。地址幀始終是新消息中起始位以後的第一幀。
主機將要與之通訊的從機的地址發送給與其鏈接的每一個從機。而後,每一個從站將從主站發送的地址與其本身的地址進行比較。若是地址匹配,它將向主機發送一個低電壓ACK位。若是地址不匹配,則從站不執行任何操做,而且SDA線保持高電平。
地址幀的末尾包含單個位,該位通知從設備主機是否要向其寫入數據或從中接收數據。若是主機要向從機發送數據,則讀/寫位爲低電壓電平。若是主機正在從機請求數據,則該位爲高電壓電平。
主機檢測到從機的ACK位後,便可發送第一個數據幀。
數據幀始終爲8位長,並以最高有效位優先發送。每一個數據幀後緊跟一個ACK / NACK位,以驗證是否已成功接收到該幀。在發送下一個數據幀以前,主機或從機必須接收ACK位(取決於誰發送數據)。
發送完全部數據幀後,主機能夠向從機發送中止條件以中止傳輸。中止條件是SCL線上從低到高的轉換以後,SDA線上的電壓從低到高的轉換,而SCL線保持高電平。
因爲I2C使用尋址,所以能夠從一個主機控制多個從機。使用7位地址時,可使用\(2^7=128\)個惟一地址。使用10位地址並不常見,可是會提供\(2^{10}=1024\)個惟一地址。要將多個從機鏈接到單個主機,請使用\(4.7K\Omega\)上拉電阻將它們鏈接,將SDA和SCL線鏈接到Vcc:
多個主機能夠鏈接到一個或多個從機。當兩個主機嘗試經過SDA線路同時發送或接收數據時,會出現同一系統中多個主機的問題。爲了解決這個問題,每一個主機都須要在發送消息以前檢測SDA線是低電平仍是高電平。若是SDA線爲低電平,則意味着另外一個主機能夠控制總線,而且主機應等待發送消息。若是SDA線爲高電平,則能夠安全地發送消息。要將多個主機鏈接到多個從機,請使用下圖,其中\(4.7K\Omega\)上拉電阻將SDA和SCL線鏈接到Vcc: