一大罐白雲 2020/9/16
鏈接:https://www.cnblogs.com/Cloudcan/p/13680159.html
SPI
SPI(Serial Peripheral Interface)串行外圍設備接口是許多不同設備使用的通用通信協議。例如, SD卡模塊, RFID卡讀取器模塊和 2.4 GHz無線發送器/接收器 均使用SPI與微控制器通信。
SPI的一個獨特優勢是可以無中斷傳輸數據。可以在連續流中發送或接收任意數量的位。使用I2C和UART,數據以數據包形式發送,限制為特定位數。開始和停止條件定義了每個數據包的開始和結束,因此數據在傳輸過程中被中斷。
通過SPI通信的設備處於主從關系。主機是控制設備(通常是微控制器),而從機(通常是傳感器,顯示器或存儲芯片)從主機獲取指令。SPI的最簡單配置是一個主機,一個從機系統,但是一個主機可以控制多個從機(下面有更多介紹)。
MOSI(主機輸出/從機輸入) –主機將數據發送到從機的線路。
MISO(主機輸入/從機輸出) –從機將數據發送到主機的線路。
SCLK(時鍾) –時鍾信號線。
SS / CS(從站選擇/芯片選擇) –主站用於選擇向其發送數據的從站的線路。
實際上,從站的數量受到系統負載電容的限制,這降低了主機在電壓電平之間准確切換的能力。
SPI如何運作
時鍾
時鍾信號將主設備的數據位輸出同步到從設備的位采樣。每個時鍾周期傳輸一位數據,因此數據傳輸的速度取決於時鍾信號的頻率。由於主機配置並生成時鍾信號,所以SPI通信始終由主機啟動。
設備共享時鍾信號的任何通信協議都稱為同步。 SPI是一種同步通信協議。還有一些 異步方法不使用時鍾信號。例如,在UART通信中,將雙方都設置為指示數據傳輸速度和時序的預配置波特率。
可以使用時鍾極性和時鍾相位的屬性來修改SPI中的時鍾信號。這兩個屬性共同定義何時輸出位以及何時對其進行采樣。主機可以設置時鍾極性,以允許在時鍾周期的上升沿或下降沿輸出和采樣位。可以設置時鍾相位,以便在時鍾周期的第一沿或第二沿進行輸出和采樣,而不管它是上升還是下降。
從設備選擇
主機可以通過將從機的CS / SS線設置為低電壓電平來選擇要與之通信的從機。在空閑,非傳輸狀態下,從選擇線保持在高電壓電平。主機上可能有多個CS / SS引腳,這允許多個從機並行連接。如果僅存在一個CS / SS引腳,則可以通過菊花鏈將多個從機連接到主機。
多個從設備
可以將SPI設置為與單個主機和單個從機一起運行,也可以與由單個主機控制的多個從機一起設置。有兩種方法可以將多個從站連接到主站。如果主站有多個從站選擇引腳,則從站可以按以下方式並聯:
如果只有一個從設備選擇引腳可用,則可以通過以下方式菊花鏈連接從設備:
MOSI和MISO
主機通過MOSI線以串行方式將數據發送到從機。從機通過MOSI引腳接收主機發送的數據。從主機發送到從機的數據通常先發送最高有效位。
從機還可以通過MISO線串行將數據發送回主機。從從機發送回主機的數據通常首先以最低有效位發送。
SPI的讀像是發一個數據那樣簡單,整個總線需要的時鍾信號是由主機端提供的,也就是說不論是給從機發數據或者從從機讀數據,時鍾信號都需要由主機來產生,主機要讀數據的時候需要給從機時鍾信號,這個信號只能是在主機發數據的時候產生,這樣就需要主機發一個數據,這樣就產生了時鍾信號,從機就會把數據放到總線上來了。為了避免這個假發出去的數據讓從機誤動作,一般都是讓主機為高電平。
SPI數據傳輸步驟
- 主機輸出時鍾信號:
- 主機將SS / CS引腳切換到低電壓狀態,從而激活從機:
- 主機沿着MOSI線路一次將數據發送到從機。從站讀取接收到的位:
- 如果需要響應,則從機沿着MISO線一次向主機返回一位數據。主機讀取接收到的位:
SPI的優缺點
使用SPI有一些優點和缺點,如果在不同的通信協議之間進行選擇,則應根據項目要求知道何時使用SPI:
優點
- 沒有起始位和停止位,因此可以連續傳輸數據而不會中斷
- 沒有像I2C這樣復雜的從站尋址系統
- 數據傳輸速率比I2C更高(幾乎快兩倍)
- 分開的MISO和MOSI線路,因此可以同時發送和接收數據
缺點
- 使用四根線(I2C和UART使用兩根線)
- 沒有確認已成功接收數據的確認(I2C擁有此確認)
- 沒有任何形式的錯誤檢查,如UART中的奇偶校驗位
- 只允許一個主機
UART
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如何運作
將要發送數據的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將數據傳輸線從低電壓驅動到高電壓至少持續兩位時間。
UART傳輸步驟
- 發送UART從數據總線並行接收數據:
- 發送UART將起始位,奇偶校驗位和停止位添加到數據幀:
- 整個數據包從發送UART串行發送到接收UART。接收UART以預先配置的波特率對數據線進行采樣:
- 接收UART丟棄數據幀中的起始位,奇偶校驗位和停止位:
- 接收UART將串行數據轉換回並行數據,並將其傳輸到接收端的數據總線:
UART的優缺點
以下是一些利弊,可幫助您確定它們是否適合您的項目需求:
優點
- 僅使用兩根電線
- 無需共用時鍾信號
- 具有奇偶校驗位以允許進行錯誤檢查
- 需要雙方都設置好數據包的結構
- 文檔可查並應用廣泛
缺點
- 數據幀的大小最大為9位
- 不支持多個從屬系統或多個主系統
- 每個UART的波特率必須在彼此的10%之內
I2C
如果您參與過使用OLED顯示器,氣壓傳感器或陀螺儀/加速度計模塊的項目,則可能會發現自己使用的是I2C。
I2C結合了SPI和UART的最佳功能。使用I2C,您可以將多個從機連接到單個主機(如SPI),並且可以有多個主機控制一個或多個從機。當您希望有多個微控制器將數據記錄到單個存儲卡或將文本顯示到單個LCD時,此功能非常有用。
與UART通信一樣,I2C僅使用兩條線在設備之間傳輸數據:
SDA(串行數據) –主站和從站發送和接收數據的線路。
SCL(串行時鍾) –傳送時鍾信號的線。
I2C是串行通信協議,因此數據沿着單條線(SDA線)單個比特地傳輸。
像SPI一樣,I2C是同步的,因此位輸出通過主機和從機之間共享的時鍾信號同步到位采樣。時鍾信號始終由主機控制。
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數據傳輸步驟
- 在將SCL線從高電平切換到低電平之前,主機通過將SDA線從高電平切換到低電平來向每個連接的從機發送啟動條件:
- 主機向每個從機發送要與之通信的從機的7位或10位地址,以及讀/寫位:
- 每個從機將主機發送的地址與其自己的地址進行比較。如果地址匹配,則從機通過將SDA線拉低一位返回一個ACK位。如果來自主機的地址與從機自身的地址不匹配,則從機將SDA線拉高:
- 主機發送或接收數據幀:
- 傳輸完每個數據幀后,接收設備將另一個ACK位返回給發送方,以確認已成功接收到該幀:
- 為了停止數據傳輸,主機將SCL切換為高電平,然后再將SDA切換為高電平,從而向從機發送停止條件:
單個主機具有多個從機
由於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:
I2C的優缺點
優點
- 僅使用兩根電線
- 支持多個主機和多個從機
- ACK / NACK位用於確認每個幀都已成功傳輸
- 硬件不如使用UART復雜
- 眾所周知且應用廣泛
缺點
- 數據傳輸速率比SPI慢
- 數據幀的大小限制為8位
- 需要實現比SPI更復雜的硬件