小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

嵌入式底層通信協(xié)議原理(SPI,UART,I2C)

 行者花雕 2022-06-03 發(fā)布于北京

一大罐白云 2020/9/16
鏈接:https://www.cnblogs.com/Cloudcan/p/13680159.html

SPI

SPI(Serial Peripheral Interface)串行外圍設備接口是許多不同設備使用的通用通信協(xié)議。例如, SD卡模塊, RFID卡讀取器模塊和 2.4 GHz無線發(fā)送器/接收器 均使用SPI與微控制器通信。
SPI的一個獨特優(yōu)勢是可以無中斷傳輸數據??梢栽谶B續(xù)流中發(fā)送或接收任意數量的位。使用I2C和UART,數據以數據包形式發(fā)送,限制為特定位數。開始和停止條件定義了每個數據包的開始和結束,因此數據在傳輸過程中被中斷。
通過SPI通信的設備處于主從關系。主機是控制設備(通常是微控制器),而從機(通常是傳感器,顯示器或存儲芯片)從主機獲取指令。SPI的最簡單配置是一個主機,一個從機系統(tǒng),但是一個主機可以控制多個從機(下面有更多介紹)。

MOSI(主機輸出/從機輸入) –主機將數據發(fā)送到從機的線路。

MISO(主機輸入/從機輸出) –從機將數據發(fā)送到主機的線路。

SCLK(時鐘) –時鐘信號線。

SS / CS(從站選擇/芯片選擇) –主站用于選擇向其發(fā)送數據的從站的線路。
params
實際上,從站的數量受到系統(tǒng)負載電容的限制,這降低了主機在電壓電平之間準確切換的能力。

SPI如何運作

時鐘

時鐘信號將主設備的數據位輸出同步到從設備的位采樣。每個時鐘周期傳輸一位數據,因此數據傳輸的速度取決于時鐘信號的頻率。由于主機配置并生成時鐘信號,所以SPI通信始終由主機啟動。

設備共享時鐘信號的任何通信協(xié)議都稱為同步。 SPI是一種同步通信協(xié)議。還有一些 異步方法不使用時鐘信號。例如,在UART通信中,將雙方都設置為指示數據傳輸速度和時序的預配置波特率。

可以使用時鐘極性時鐘相位的屬性來修改SPI中的時鐘信號。這兩個屬性共同定義何時輸出位以及何時對其進行采樣。主機可以設置時鐘極性,以允許在時鐘周期的上升沿或下降沿輸出和采樣位。可以設置時鐘相位,以便在時鐘周期的第一沿或第二沿進行輸出和采樣,而不管它是上升還是下降。

從設備選擇

主機可以通過將從機的CS / SS線設置為低電壓電平來選擇要與之通信的從機。在空閑,非傳輸狀態(tài)下,從選擇線保持在高電壓電平。主機上可能有多個CS / SS引腳,這允許多個從機并行連接。如果僅存在一個CS / SS引腳,則可以通過菊花鏈將多個從機連接到主機。

多個從設備

可以將SPI設置為與單個主機和單個從機一起運行,也可以與由單個主機控制的多個從機一起設置。有兩種方法可以將多個從站連接到主站。如果主站有多個從站選擇引腳,則從站可以按以下方式并聯(lián):

如果只有一個從設備選擇引腳可用,則可以通過以下方式菊花鏈連接從設備:

MOSI和MISO

主機通過MOSI線以串行方式將數據發(fā)送到從機。從機通過MOSI引腳接收主機發(fā)送的數據。從主機發(fā)送到從機的數據通常先發(fā)送最高有效位。

從機還可以通過MISO線串行將數據發(fā)送回主機。從從機發(fā)送回主機的數據通常首先以最低有效位發(fā)送。

SPI的讀像是發(fā)一個數據那樣簡單,整個總線需要的時鐘信號是由主機端提供的,也就是說不論是給從機發(fā)數據或者從從機讀數據,時鐘信號都需要由主機來產生,主機要讀數據的時候需要給從機時鐘信號,這個信號只能是在主機發(fā)數據的時候產生,這樣就需要主機發(fā)一個數據,這樣就產生了時鐘信號,從機就會把數據放到總線上來了。為了避免這個假發(fā)出去的數據讓從機誤動作,一般都是讓主機為高電平。

SPI數據傳輸步驟

  1. 主機輸出時鐘信號:
  2. 主機將SS / CS引腳切換到低電壓狀態(tài),從而激活從機:
  3. 主機沿著MOSI線路一次將數據發(fā)送到從機。從站讀取接收到的位:
  4. 如果需要響應,則從機沿著MISO線一次向主機返回一位數據。主機讀取接收到的位:

SPI的優(yōu)缺點

使用SPI有一些優(yōu)點和缺點,如果在不同的通信協(xié)議之間進行選擇,則應根據項目要求知道何時使用SPI:

優(yōu)點

  • 沒有起始位和停止位,因此可以連續(xù)傳輸數據而不會中斷
  • 沒有像I2C這樣復雜的從站尋址系統(tǒng)
  • 數據傳輸速率比I2C更高(幾乎快兩倍)
  • 分開的MISO和MOSI線路,因此可以同時發(fā)送和接收數據

缺點

  • 使用四根線(I2C和UART使用兩根線)
  • 沒有確認已成功接收數據的確認(I2C擁有此確認)
  • 沒有任何形式的錯誤檢查,如UART中的奇偶校驗位
  • 只允許一個主機

UART

UART代表通用異步接收器/發(fā)送器(Universal Asynchronous Receiver/Transmitter)。它不是像SPI和I2C這樣的通信協(xié)議,而是微控制器中的物理電路或獨立的IC。UART的主要目的是發(fā)送和接收串行數據。

關于UART的最大的優(yōu)點之一是它僅使用兩條線在設備之間傳輸數據。

在UART通信中,兩個UART直接相互通信。發(fā)送UART將來自控制設備(如CPU)的并行數據轉換為串行形式,以串行方式將其發(fā)送到接收UART,然后接收UART將接收到的串行數據轉換回并行數據。只需要兩條線就可以在兩個UART之間傳輸數據。數據從發(fā)送UART的Tx引腳流到接收UART的Rx引腳:

UART 異步傳輸數據,這意味著沒有時鐘信號將發(fā)送UART的位輸出與接收UART的位采樣同步。發(fā)送UART代替時鐘信號,將開始停止位添加到正在傳輸的數據包中。這些位定義了數據包的開始和結束,因此接收UART知道何時開始讀取這些位。

當接收UART檢測到起始位時,它將開始以稱為波特率的特定頻率讀取輸入位。波特率是數據傳輸速度的度量,以每秒位數(bps)表示。 兩個UART必須以大約相同的波特率工作。在位的時序變得太遠之前,發(fā)送和接收UART之間的波特率只能相差約10%。

還必須將兩個UART配置為發(fā)送和接收相同的數據包結構。

UART如何運作

將要發(fā)送數據的UART從數據總線接收數據。數據總線用于通過其他設備(例如CPU,內存或微控制器)將數據發(fā)送到UART。數據以并行形式從數據總線傳輸到發(fā)送UART(電路實現(xiàn)參考數字電路多功能移位寄存器)。發(fā)送UART從數據總線獲取并行數據后,它將添加起始位,奇偶校驗位和停止位,以創(chuàng)建數據包。接下來,數據包在Tx引腳上逐位串行輸出。接收UART在其Rx引腳上逐位讀取數據包。然后,接收UART將數據轉換回并行形式,并刪除起始位,奇偶校驗位和停止位。最后,接收UART將數據包并行傳輸到接收端的數據總線:

UART傳輸的數據被組織成數據包。每個數據包包含1個起始位,5至9個數據位(取決于UART),一個可選的奇偶校驗位以及1個或2個停止位:

起始位

UART數據傳輸線通常在不傳輸數據時保持在高電壓電平。為了開始數據傳輸,發(fā)送UART在一個時鐘周期內將傳輸線從高電平拉低到低電平。當接收UART檢測到高到低電壓轉換時,它開始以波特率的頻率讀取數據幀中的位。

數據幀

數據幀包含正在傳輸的實際數據。如果使用奇偶校驗位,則可以是5位,最多8位。如果不使用奇偶校驗位,則數據幀的長度可以為9位。在大多數情況下,數據首先以最低有效位發(fā)送。

奇偶校驗

奇偶性描述數字的偶數或奇數。奇偶校驗位是接收UART判斷傳輸期間是否有任何數據更改的方式。電磁輻射,不匹配的波特率或長距離數據傳輸會改變數據位。接收UART讀取數據幀后,它將對值為1的位數進行計數,并檢查總數是偶數還是奇數。如果奇偶校驗位為0(偶數奇偶校驗),則數據幀中的1位應總計為偶數。如果奇偶校驗位為1(奇校驗),則數據幀中的1位應合計為奇數。當奇偶校驗位與數據匹配時,UART知道傳輸沒有錯誤。但是,如果奇偶校驗位為0,則總數為奇數;或奇偶校驗位為1,且總數為偶數,則UART知道數據幀中的位已更改。

停止位

為了用信號通知數據包的結束,發(fā)送UART將數據傳輸線從低電壓驅動到高電壓至少持續(xù)兩位時間。

UART傳輸步驟

  1. 發(fā)送UART從數據總線并行接收數據:
  2. 發(fā)送UART將起始位,奇偶校驗位和停止位添加到數據幀:
  3. 整個數據包從發(fā)送UART串行發(fā)送到接收UART。接收UART以預先配置的波特率對數據線進行采樣:
  4. 接收UART丟棄數據幀中的起始位,奇偶校驗位和停止位:
  5. 接收UART將串行數據轉換回并行數據,并將其傳輸到接收端的數據總線:

UART的優(yōu)缺點

以下是一些利弊,可幫助您確定它們是否適合您的項目需求:

優(yōu)點

  • 僅使用兩根電線
  • 無需共用時鐘信號
  • 具有奇偶校驗位以允許進行錯誤檢查
  • 需要雙方都設置好數據包的結構
  • 文檔可查并應用廣泛

缺點

  • 數據幀的大小最大為9位
  • 不支持多個從屬系統(tǒng)或多個主系統(tǒng)
  • 每個UART的波特率必須在彼此的10%之內

I2C

如果您參與過使用OLED顯示器,氣壓傳感器或陀螺儀/加速度計模塊的項目,則可能會發(fā)現(xiàn)自己使用的是I2C。

I2C結合了SPI和UART的最佳功能。使用I2C,您可以將多個從機連接到單個主機(如SPI),并且可以有多個主機控制一個或多個從機。當您希望有多個微控制器將數據記錄到單個存儲卡或將文本顯示到單個LCD時,此功能非常有用。

與UART通信一樣,I2C僅使用兩條線在設備之間傳輸數據:

SDA(串行數據) –主站和從站發(fā)送和接收數據的線路。

SCL(串行時鐘) –傳送時鐘信號的線。

I2C是串行通信協(xié)議,因此數據沿著單條線(SDA線)單個比特地傳輸。

像SPI一樣,I2C是同步的,因此位輸出通過主機和從機之間共享的時鐘信號同步到位采樣。時鐘信號始終由主機控制。

I2C如何運作

使用I2C,數據以消息形式傳輸 。消息被分解 為數據幀。每條消息都有一個包含從站的二進制地址的地址幀,以及一個或多個包含正在發(fā)送的數據的數據幀。該消息還包括每個數據幀之間的開始和停止條件,讀/寫位和ACK / NACK位:

啟動條件: 在SCL線從高電平切換到低電平之前 ,SDA線從高壓電平切換到低壓電平 。

停止條件: SCL線從低切換到高后, SDA線從低電壓切換到高電壓 。

地址幀: 每個從屬設備唯一的7位或10位序列,用于在主設備要與其通信時標識該從屬設備。

讀/寫位: 一位,指定主機是向從機發(fā)送數據(低電壓)還是向從機請求數據(高電壓)。

ACK / NACK位: 消息中的每個幀后均帶有一個確認/不確認位。如果成功接收到地址幀或數據幀,則會從接收設備向發(fā)送方返回ACK位。

尋址

I2C沒有像SPI這樣的從設備選擇線,因此它需要另一種方式來讓從設備知道正在向其發(fā)送數據,而不是另一個從設備。它通過尋址來實現(xiàn)。地址幀始終是新消息中起始位之后的第一幀。

主機將要與之通信的從機的地址發(fā)送給與其連接的每個從機。然后,每個從站將從主站發(fā)送的地址與其自己的地址進行比較。如果地址匹配,它將向主機發(fā)送一個低電壓ACK位。如果地址不匹配,則從站不執(zhí)行任何操作,并且SDA線保持高電平。

讀/寫位

地址幀的末尾包含單個位,該位通知從設備主機是否要向其寫入數據或從中接收數據。如果主機要向從機發(fā)送數據,則讀/寫位為低電壓電平。如果主機正在從機請求數據,則該位為高電壓電平。

數據幀

主機檢測到從機的ACK位后,即可發(fā)送第一個數據幀。

數據幀始終為8位長,并以最高有效位優(yōu)先發(fā)送。每個數據幀后緊跟一個ACK / NACK位,以驗證是否已成功接收到該幀。在發(fā)送下一個數據幀之前,主機或從機必須接收ACK位(取決于誰發(fā)送數據)。

發(fā)送完所有數據幀后,主機可以向從機發(fā)送停止條件以停止傳輸。停止條件是SCL線上從低到高的轉換之后,SDA線上的電壓從低到高的轉換,而SCL線保持高電平。

I2C數據傳輸步驟

  1. 在將SCL線從高電平切換到低電平之前,主機通過將SDA線從高電平切換到低電平來向每個連接的從機發(fā)送啟動條件:
  2. 主機向每個從機發(fā)送要與之通信的從機的7位或10位地址,以及讀/寫位:
  3. 每個從機將主機發(fā)送的地址與其自己的地址進行比較。如果地址匹配,則從機通過將SDA線拉低一位返回一個ACK位。如果來自主機的地址與從機自身的地址不匹配,則從機將SDA線拉高:
  4. 主機發(fā)送或接收數據幀:
  5. 傳輸完每個數據幀后,接收設備將另一個ACK位返回給發(fā)送方,以確認已成功接收到該幀:
  6. 為了停止數據傳輸,主機將SCL切換為高電平,然后再將SDA切換為高電平,從而向從機發(fā)送停止條件:

單個主機具有多個從機

由于I2C使用尋址,因此可以從一個主機控制多個從機。使用7位地址時,可以使用\(2^7=128\)個唯一地址。使用10位地址并不常見,但是會提供\(2^{10}=1024\)個唯一地址。要將多個從機連接到單個主機,請使用\(4.7K\Omega\)上拉電阻將它們連接,將SDA和SCL線連接到Vcc:

多個主機具有多個從機

多個主機可以連接到一個或多個從機。當兩個主機嘗試通過SDA線路同時發(fā)送或接收數據時,會出現(xiàn)同一系統(tǒng)中多個主機的問題。為了解決這個問題,每個主機都需要在發(fā)送消息之前檢測SDA線是低電平還是高電平。如果SDA線為低電平,則意味著另一個主機可以控制總線,并且主機應等待發(fā)送消息。如果SDA線為高電平,則可以安全地發(fā)送消息。要將多個主機連接到多個從機,請使用下圖,其中\(4.7K\Omega\)上拉電阻將SDA和SCL線連接到Vcc:

I2C的優(yōu)缺點

優(yōu)點

  • 僅使用兩根電線
  • 支持多個主機和多個從機
  • ACK / NACK位用于確認每個幀都已成功傳輸
  • 硬件不如使用UART復雜
  • 眾所周知且應用廣泛

缺點

  • 數據傳輸速率比SPI慢
  • 數據幀的大小限制為8位
  • 需要實現(xiàn)比SPI更復雜的硬件

參考資料

圖片來源于:https://www./

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多