一大罐白云 2020/9/16
鏈接:https://www.cnblogs.com/Cloudcan/p/13680159.html
SPI(Serial Peripheral Interface)串行外圍設(shè)備接口是許多不同設(shè)備使用的通用通信協(xié)議。例如, SD卡模塊, RFID卡讀取器模塊和 2.4 GHz無(wú)線發(fā)送器/接收器 均使用SPI與微控制器通信。
SPI的一個(gè)獨(dú)特優(yōu)勢(shì)是可以無(wú)中斷傳輸數(shù)據(jù)??梢栽谶B續(xù)流中發(fā)送或接收任意數(shù)量的位。使用I2C和UART,數(shù)據(jù)以數(shù)據(jù)包形式發(fā)送,限制為特定位數(shù)。開始和停止條件定義了每個(gè)數(shù)據(jù)包的開始和結(jié)束,因此數(shù)據(jù)在傳輸過(guò)程中被中斷。
通過(guò)SPI通信的設(shè)備處于主從關(guān)系。主機(jī)是控制設(shè)備(通常是微控制器),而從機(jī)(通常是傳感器,顯示器或存儲(chǔ)芯片)從主機(jī)獲取指令。SPI的最簡(jiǎn)單配置是一個(gè)主機(jī),一個(gè)從機(jī)系統(tǒng),但是一個(gè)主機(jī)可以控制多個(gè)從機(jī)(下面有更多介紹)。
MISO(主機(jī)輸入/從機(jī)輸出) –從機(jī)將數(shù)據(jù)發(fā)送到主機(jī)的線路。
SCLK(時(shí)鐘) –時(shí)鐘信號(hào)線。
SS / CS(從站選擇/芯片選擇) –主站用于選擇向其發(fā)送數(shù)據(jù)的從站的線路。
時(shí)鐘信號(hào)將主設(shè)備的數(shù)據(jù)位輸出同步到從設(shè)備的位采樣。每個(gè)時(shí)鐘周期傳輸一位數(shù)據(jù),因此數(shù)據(jù)傳輸?shù)乃俣热Q于時(shí)鐘信號(hào)的頻率。由于主機(jī)配置并生成時(shí)鐘信號(hào),所以SPI通信始終由主機(jī)啟動(dòng)。
設(shè)備共享時(shí)鐘信號(hào)的任何通信協(xié)議都稱為同步。 SPI是一種同步通信協(xié)議。還有一些 異步方法不使用時(shí)鐘信號(hào)。例如,在UART通信中,將雙方都設(shè)置為指示數(shù)據(jù)傳輸速度和時(shí)序的預(yù)配置波特率。
可以使用時(shí)鐘極性和時(shí)鐘相位的屬性來(lái)修改SPI中的時(shí)鐘信號(hào)。這兩個(gè)屬性共同定義何時(shí)輸出位以及何時(shí)對(duì)其進(jìn)行采樣。主機(jī)可以設(shè)置時(shí)鐘極性,以允許在時(shí)鐘周期的上升沿或下降沿輸出和采樣位??梢栽O(shè)置時(shí)鐘相位,以便在時(shí)鐘周期的第一沿或第二沿進(jìn)行輸出和采樣,而不管它是上升還是下降。
主機(jī)可以通過(guò)將從機(jī)的CS / SS線設(shè)置為低電壓電平來(lái)選擇要與之通信的從機(jī)。在空閑,非傳輸狀態(tài)下,從選擇線保持在高電壓電平。主機(jī)上可能有多個(gè)CS / SS引腳,這允許多個(gè)從機(jī)并行連接。如果僅存在一個(gè)CS / SS引腳,則可以通過(guò)菊花鏈將多個(gè)從機(jī)連接到主機(jī)。
可以將SPI設(shè)置為與單個(gè)主機(jī)和單個(gè)從機(jī)一起運(yùn)行,也可以與由單個(gè)主機(jī)控制的多個(gè)從機(jī)一起設(shè)置。有兩種方法可以將多個(gè)從站連接到主站。如果主站有多個(gè)從站選擇引腳,則從站可以按以下方式并聯(lián):
主機(jī)通過(guò)MOSI線以串行方式將數(shù)據(jù)發(fā)送到從機(jī)。從機(jī)通過(guò)MOSI引腳接收主機(jī)發(fā)送的數(shù)據(jù)。從主機(jī)發(fā)送到從機(jī)的數(shù)據(jù)通常先發(fā)送最高有效位。
從機(jī)還可以通過(guò)MISO線串行將數(shù)據(jù)發(fā)送回主機(jī)。從從機(jī)發(fā)送回主機(jī)的數(shù)據(jù)通常首先以最低有效位發(fā)送。
SPI的讀像是發(fā)一個(gè)數(shù)據(jù)那樣簡(jiǎn)單,整個(gè)總線需要的時(shí)鐘信號(hào)是由主機(jī)端提供的,也就是說(shuō)不論是給從機(jī)發(fā)數(shù)據(jù)或者從從機(jī)讀數(shù)據(jù),時(shí)鐘信號(hào)都需要由主機(jī)來(lái)產(chǎn)生,主機(jī)要讀數(shù)據(jù)的時(shí)候需要給從機(jī)時(shí)鐘信號(hào),這個(gè)信號(hào)只能是在主機(jī)發(fā)數(shù)據(jù)的時(shí)候產(chǎn)生,這樣就需要主機(jī)發(fā)一個(gè)數(shù)據(jù),這樣就產(chǎn)生了時(shí)鐘信號(hào),從機(jī)就會(huì)把數(shù)據(jù)放到總線上來(lái)了。為了避免這個(gè)假發(fā)出去的數(shù)據(jù)讓從機(jī)誤動(dòng)作,一般都是讓主機(jī)為高電平。
使用SPI有一些優(yōu)點(diǎn)和缺點(diǎn),如果在不同的通信協(xié)議之間進(jìn)行選擇,則應(yīng)根據(jù)項(xiàng)目要求知道何時(shí)使用SPI:
UART代表通用異步接收器/發(fā)送器(Universal Asynchronous Receiver/Transmitter)。它不是像SPI和I2C這樣的通信協(xié)議,而是微控制器中的物理電路或獨(dú)立的IC。UART的主要目的是發(fā)送和接收串行數(shù)據(jù)。
關(guān)于UART的最大的優(yōu)點(diǎn)之一是它僅使用兩條線在設(shè)備之間傳輸數(shù)據(jù)。
在UART通信中,兩個(gè)UART直接相互通信。發(fā)送UART將來(lái)自控制設(shè)備(如CPU)的并行數(shù)據(jù)轉(zhuǎn)換為串行形式,以串行方式將其發(fā)送到接收UART,然后接收UART將接收到的串行數(shù)據(jù)轉(zhuǎn)換回并行數(shù)據(jù)。只需要兩條線就可以在兩個(gè)UART之間傳輸數(shù)據(jù)。數(shù)據(jù)從發(fā)送UART的Tx引腳流到接收UART的Rx引腳:
UART 異步傳輸數(shù)據(jù),這意味著沒(méi)有時(shí)鐘信號(hào)將發(fā)送UART的位輸出與接收UART的位采樣同步。發(fā)送UART代替時(shí)鐘信號(hào),將開始和停止位添加到正在傳輸?shù)臄?shù)據(jù)包中。這些位定義了數(shù)據(jù)包的開始和結(jié)束,因此接收UART知道何時(shí)開始讀取這些位。
當(dāng)接收UART檢測(cè)到起始位時(shí),它將開始以稱為波特率的特定頻率讀取輸入位。波特率是數(shù)據(jù)傳輸速度的度量,以每秒位數(shù)(bps)表示。 兩個(gè)UART必須以大約相同的波特率工作。在位的時(shí)序變得太遠(yuǎn)之前,發(fā)送和接收UART之間的波特率只能相差約10%。
還必須將兩個(gè)UART配置為發(fā)送和接收相同的數(shù)據(jù)包結(jié)構(gòu)。
將要發(fā)送數(shù)據(jù)的UART從數(shù)據(jù)總線接收數(shù)據(jù)。數(shù)據(jù)總線用于通過(guò)其他設(shè)備(例如CPU,內(nèi)存或微控制器)將數(shù)據(jù)發(fā)送到UART。數(shù)據(jù)以并行形式從數(shù)據(jù)總線傳輸?shù)桨l(fā)送UART(電路實(shí)現(xiàn)參考數(shù)字電路多功能移位寄存器)。發(fā)送UART從數(shù)據(jù)總線獲取并行數(shù)據(jù)后,它將添加起始位,奇偶校驗(yàn)位和停止位,以創(chuàng)建數(shù)據(jù)包。接下來(lái),數(shù)據(jù)包在Tx引腳上逐位串行輸出。接收UART在其Rx引腳上逐位讀取數(shù)據(jù)包。然后,接收UART將數(shù)據(jù)轉(zhuǎn)換回并行形式,并刪除起始位,奇偶校驗(yàn)位和停止位。最后,接收UART將數(shù)據(jù)包并行傳輸?shù)浇邮斩说臄?shù)據(jù)總線:
UART數(shù)據(jù)傳輸線通常在不傳輸數(shù)據(jù)時(shí)保持在高電壓電平。為了開始數(shù)據(jù)傳輸,發(fā)送UART在一個(gè)時(shí)鐘周期內(nèi)將傳輸線從高電平拉低到低電平。當(dāng)接收UART檢測(cè)到高到低電壓轉(zhuǎn)換時(shí),它開始以波特率的頻率讀取數(shù)據(jù)幀中的位。
數(shù)據(jù)幀包含正在傳輸?shù)膶?shí)際數(shù)據(jù)。如果使用奇偶校驗(yàn)位,則可以是5位,最多8位。如果不使用奇偶校驗(yàn)位,則數(shù)據(jù)幀的長(zhǎng)度可以為9位。在大多數(shù)情況下,數(shù)據(jù)首先以最低有效位發(fā)送。
奇偶性描述數(shù)字的偶數(shù)或奇數(shù)。奇偶校驗(yàn)位是接收UART判斷傳輸期間是否有任何數(shù)據(jù)更改的方式。電磁輻射,不匹配的波特率或長(zhǎng)距離數(shù)據(jù)傳輸會(huì)改變數(shù)據(jù)位。接收UART讀取數(shù)據(jù)幀后,它將對(duì)值為1的位數(shù)進(jìn)行計(jì)數(shù),并檢查總數(shù)是偶數(shù)還是奇數(shù)。如果奇偶校驗(yàn)位為0(偶數(shù)奇偶校驗(yàn)),則數(shù)據(jù)幀中的1位應(yīng)總計(jì)為偶數(shù)。如果奇偶校驗(yàn)位為1(奇校驗(yàn)),則數(shù)據(jù)幀中的1位應(yīng)合計(jì)為奇數(shù)。當(dāng)奇偶校驗(yàn)位與數(shù)據(jù)匹配時(shí),UART知道傳輸沒(méi)有錯(cuò)誤。但是,如果奇偶校驗(yàn)位為0,則總數(shù)為奇數(shù);或奇偶校驗(yàn)位為1,且總數(shù)為偶數(shù),則UART知道數(shù)據(jù)幀中的位已更改。
為了用信號(hào)通知數(shù)據(jù)包的結(jié)束,發(fā)送UART將數(shù)據(jù)傳輸線從低電壓驅(qū)動(dòng)到高電壓至少持續(xù)兩位時(shí)間。
以下是一些利弊,可幫助您確定它們是否適合您的項(xiàng)目需求:
如果您參與過(guò)使用OLED顯示器,氣壓傳感器或陀螺儀/加速度計(jì)模塊的項(xiàng)目,則可能會(huì)發(fā)現(xiàn)自己使用的是I2C。
I2C結(jié)合了SPI和UART的最佳功能。使用I2C,您可以將多個(gè)從機(jī)連接到單個(gè)主機(jī)(如SPI),并且可以有多個(gè)主機(jī)控制一個(gè)或多個(gè)從機(jī)。當(dāng)您希望有多個(gè)微控制器將數(shù)據(jù)記錄到單個(gè)存儲(chǔ)卡或?qū)⑽谋撅@示到單個(gè)LCD時(shí),此功能非常有用。
與UART通信一樣,I2C僅使用兩條線在設(shè)備之間傳輸數(shù)據(jù):
SDA(串行數(shù)據(jù)) –主站和從站發(fā)送和接收數(shù)據(jù)的線路。
SCL(串行時(shí)鐘) –傳送時(shí)鐘信號(hào)的線。
I2C是串行通信協(xié)議,因此數(shù)據(jù)沿著單條線(SDA線)單個(gè)比特地傳輸。
像SPI一樣,I2C是同步的,因此位輸出通過(guò)主機(jī)和從機(jī)之間共享的時(shí)鐘信號(hào)同步到位采樣。時(shí)鐘信號(hào)始終由主機(jī)控制。
使用I2C,數(shù)據(jù)以消息形式傳輸 。消息被分解 為數(shù)據(jù)幀。每條消息都有一個(gè)包含從站的二進(jìn)制地址的地址幀,以及一個(gè)或多個(gè)包含正在發(fā)送的數(shù)據(jù)的數(shù)據(jù)幀。該消息還包括每個(gè)數(shù)據(jù)幀之間的開始和停止條件,讀/寫位和ACK / NACK位:
啟動(dòng)條件: 在SCL線從高電平切換到低電平之前 ,SDA線從高壓電平切換到低壓電平 。
停止條件: SCL線從低切換到高后, SDA線從低電壓切換到高電壓 。
地址幀: 每個(gè)從屬設(shè)備唯一的7位或10位序列,用于在主設(shè)備要與其通信時(shí)標(biāo)識(shí)該從屬設(shè)備。
讀/寫位: 一位,指定主機(jī)是向從機(jī)發(fā)送數(shù)據(jù)(低電壓)還是向從機(jī)請(qǐng)求數(shù)據(jù)(高電壓)。
ACK / NACK位: 消息中的每個(gè)幀后均帶有一個(gè)確認(rèn)/不確認(rèn)位。如果成功接收到地址幀或數(shù)據(jù)幀,則會(huì)從接收設(shè)備向發(fā)送方返回ACK位。
I2C沒(méi)有像SPI這樣的從設(shè)備選擇線,因此它需要另一種方式來(lái)讓從設(shè)備知道正在向其發(fā)送數(shù)據(jù),而不是另一個(gè)從設(shè)備。它通過(guò)尋址來(lái)實(shí)現(xiàn)。地址幀始終是新消息中起始位之后的第一幀。
主機(jī)將要與之通信的從機(jī)的地址發(fā)送給與其連接的每個(gè)從機(jī)。然后,每個(gè)從站將從主站發(fā)送的地址與其自己的地址進(jìn)行比較。如果地址匹配,它將向主機(jī)發(fā)送一個(gè)低電壓ACK位。如果地址不匹配,則從站不執(zhí)行任何操作,并且SDA線保持高電平。
地址幀的末尾包含單個(gè)位,該位通知從設(shè)備主機(jī)是否要向其寫入數(shù)據(jù)或從中接收數(shù)據(jù)。如果主機(jī)要向從機(jī)發(fā)送數(shù)據(jù),則讀/寫位為低電壓電平。如果主機(jī)正在從機(jī)請(qǐng)求數(shù)據(jù),則該位為高電壓電平。
主機(jī)檢測(cè)到從機(jī)的ACK位后,即可發(fā)送第一個(gè)數(shù)據(jù)幀。
數(shù)據(jù)幀始終為8位長(zhǎng),并以最高有效位優(yōu)先發(fā)送。每個(gè)數(shù)據(jù)幀后緊跟一個(gè)ACK / NACK位,以驗(yàn)證是否已成功接收到該幀。在發(fā)送下一個(gè)數(shù)據(jù)幀之前,主機(jī)或從機(jī)必須接收ACK位(取決于誰(shuí)發(fā)送數(shù)據(jù))。
發(fā)送完所有數(shù)據(jù)幀后,主機(jī)可以向從機(jī)發(fā)送停止條件以停止傳輸。停止條件是SCL線上從低到高的轉(zhuǎn)換之后,SDA線上的電壓從低到高的轉(zhuǎn)換,而SCL線保持高電平。
由于I2C使用尋址,因此可以從一個(gè)主機(jī)控制多個(gè)從機(jī)。使用7位地址時(shí),可以使用\(2^7=128\)個(gè)唯一地址。使用10位地址并不常見,但是會(huì)提供\(2^{10}=1024\)個(gè)唯一地址。要將多個(gè)從機(jī)連接到單個(gè)主機(jī),請(qǐng)使用\(4.7K\Omega\)上拉電阻將它們連接,將SDA和SCL線連接到Vcc:
多個(gè)主機(jī)可以連接到一個(gè)或多個(gè)從機(jī)。當(dāng)兩個(gè)主機(jī)嘗試通過(guò)SDA線路同時(shí)發(fā)送或接收數(shù)據(jù)時(shí),會(huì)出現(xiàn)同一系統(tǒng)中多個(gè)主機(jī)的問(wèn)題。為了解決這個(gè)問(wèn)題,每個(gè)主機(jī)都需要在發(fā)送消息之前檢測(cè)SDA線是低電平還是高電平。如果SDA線為低電平,則意味著另一個(gè)主機(jī)可以控制總線,并且主機(jī)應(yīng)等待發(fā)送消息。如果SDA線為高電平,則可以安全地發(fā)送消息。要將多個(gè)主機(jī)連接到多個(gè)從機(jī),請(qǐng)使用下圖,其中\(4.7K\Omega\)上拉電阻將SDA和SCL線連接到Vcc:
圖片來(lái)源于:https://www.circuitbasics.com/
聯(lián)系客服