博客專欄

EEPW首頁 > 博客 > 一文搞懂SPI通信協(xié)議

一文搞懂SPI通信協(xié)議

發(fā)布人:美男子玩編程 時間:2022-06-22 來源:工程師 發(fā)布文章

1


簡介


SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫,是美國摩托羅拉公司(Motorola)最先推出的一種同步串行傳輸規(guī)范,也是一種單片機(jī)外設(shè)芯片串行擴(kuò)展接口,是一種高速、全雙工、同步通信總線,所以可以在同一時間發(fā)送和接收數(shù)據(jù),SPI沒有定義速度限制,通常能達(dá)到甚至超過10M/bps。


SPI有主、從兩種模式,通常由一個主模塊和一個或多個從模塊組成(SPI不支持多主機(jī)),主模塊選擇一個從模塊進(jìn)行同步通信,從而完成數(shù)據(jù)的交換。提供時鐘的為主設(shè)備(Master),接收時鐘的設(shè)備為從設(shè)備(Slave),SPI接口的讀寫操作,都是由主設(shè)備發(fā)起,當(dāng)存在多個從設(shè)備時,通過各自的片選信號進(jìn)行管理。


SPI通信原理很簡單,需要至少4根線,單向傳輸時3根線,它們是MISO(主設(shè)備數(shù)據(jù)輸入)、MOSI(主設(shè)備數(shù)據(jù)輸出)、SCLK(時鐘)和CS/SS(片選):

  • MISO( Master Input Slave Output):主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出;

  • MOSI(Master Output Slave Input):主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入;

  • SCLK(Serial Clock):時鐘信號,由主設(shè)備產(chǎn)生;

  • CS/SS(Chip Select/Slave Select):從設(shè)備使能信號,由主設(shè)備控制,一主多從時,CS/SS是從芯片是否被主芯片選中的控制信號,只有片選信號為預(yù)先規(guī)定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。


圖片

一主設(shè)備一從設(shè)備模式

圖片

一主設(shè)備多從設(shè)備模式



2


通信原理


SPI主設(shè)備和從設(shè)備都有一個串行移位寄存器,主設(shè)備通過向它的SPI串行寄存器寫入一個字節(jié)來發(fā)起一次傳輸。


圖片

SPI數(shù)據(jù)通信的流程可以分為以下幾步:

1、主設(shè)備發(fā)起信號,將CS/SS拉低,啟動通信。

2、主設(shè)備通過發(fā)送時鐘信號,來告訴從設(shè)備進(jìn)行寫數(shù)據(jù)或者讀數(shù)據(jù)操作(采集時機(jī)可能是時鐘信號的上升沿(從低到高)或下降沿(從高到低),因?yàn)镾PI有四種模式,后面會講到),它將立即讀取數(shù)據(jù)線上的信號,這樣就得到了一位數(shù)據(jù)(1bit)。

3、主機(jī)(Master)將要發(fā)送的數(shù)據(jù)寫到發(fā)送數(shù)據(jù)緩存區(qū)(Menory),緩存區(qū)經(jīng)過移位寄存器(緩存長度不一定,看單片機(jī)配置),串行移位寄存器通過MOSI信號線將字節(jié)一位一位的移出去傳送給從機(jī),同時MISO接口接收到的數(shù)據(jù)經(jīng)過移位寄存器一位一位的移到接收緩存區(qū)。

4、從機(jī)(Slave)也將自己的串行移位寄存器(緩存長度不一定,看單片機(jī)配置)中的內(nèi)容通過MISO信號線返回給主機(jī)。同時通過MOSI信號線接收主機(jī)發(fā)送的數(shù)據(jù),這樣,兩個移位寄存器中的內(nèi)容就被交換。


例如,下圖示例中簡單模擬SPI通信流程,主機(jī)拉低NSS片選信號,啟動通信,并且產(chǎn)生時鐘信號,上升沿觸發(fā)邊沿信號,主機(jī)在MOSI線路一位一位發(fā)送數(shù)據(jù)0X53,在MISO線路一位一位接收數(shù)據(jù)0X46,如下圖所示:


圖片

這里有一點(diǎn)需要著重說明一下:SPI只有主模式和從模式之分,沒有讀和寫的說法,外設(shè)的寫操作和讀操作是同步完成的。若只進(jìn)行寫操作,主機(jī)只需忽略接收到的字節(jié)(虛擬數(shù)據(jù));反之,若主機(jī)要讀取從機(jī)的一個字節(jié),就必須發(fā)送一個空字節(jié)來引發(fā)從機(jī)的傳輸。也就是說,你發(fā)一個數(shù)據(jù)必然會收到一個數(shù)據(jù);你要收一個數(shù)據(jù)必須也要先發(fā)一個數(shù)據(jù)。




3


通信特性


3.1、設(shè)備選擇


SPI是單主設(shè)備(Single Master)通信協(xié)議,只有一支主設(shè)備能發(fā)起通信,當(dāng)SPI主設(shè)備想讀/寫從設(shè)備時,它首先拉低從設(shè)備對應(yīng)的SS線(SS是低電平有效)。接著開始發(fā)送工作脈沖到時鐘線上,在相應(yīng)的脈沖時間上,主設(shè)備把信號發(fā)到MOSI實(shí)現(xiàn)“寫”,同時可對MISO采樣而實(shí)現(xiàn)“讀”。如下圖所示:


圖片


3.2、設(shè)備時鐘


SPI時鐘特點(diǎn)主要包括:時鐘速率、時鐘極性和時鐘相位三方面。


3.2.1、時鐘速率


SPI總線上的主設(shè)備必須在通信開始時候配置并生成相應(yīng)的時鐘信號。從理論上講,只要實(shí)際可行,時鐘速率就可以是你想要的任何速率,當(dāng)然這個速率受限于每個系統(tǒng)能提供多大的系統(tǒng)時鐘頻率,以及最大的SPI傳輸速率。


3.2.2、時鐘極性


根據(jù)硬件制造商的命名規(guī)則不同,時鐘極性通常寫為CKP或CPOL。時鐘極性和相位共同決定讀取數(shù)據(jù)的方式,比如信號上升沿讀取數(shù)據(jù)還是信號下降沿讀取數(shù)據(jù)。

CKP可以配置為1或0。


這意味著你可以根據(jù)需要將時鐘的默認(rèn)狀態(tài)(IDLE)設(shè)置為高或低。極性反轉(zhuǎn)可以通過簡單的邏輯逆變器實(shí)現(xiàn)。你必須參考設(shè)備的數(shù)據(jù)手冊才能正確設(shè)置CKP和CKE。

  • CKP = 0:時鐘空閑IDLE為低電平 0;

  • CKP = 1:時鐘空閑IDLE為高電平1。


3.2.3、時鐘相位


根據(jù)硬件制造商的不同,時鐘相位通常寫為CKE或CPHA。顧名思義,時鐘相位/邊沿,也就是采集數(shù)據(jù)時是在時鐘信號的具體相位或者邊沿。

  • CKE = 0:在時鐘信號SCK的第一個跳變沿采樣;

  • CKE = 1:在時鐘信號SCK的第二個跳變沿采樣。


3.3、四種模式


根據(jù)SPI的時鐘極性和時鐘相位特性可以設(shè)置4種不同的SPI通信操作模式,它們的區(qū)別是定義了在時鐘脈沖的哪條邊沿轉(zhuǎn)換(toggles)輸出信號,哪條邊沿采樣輸入信號,還有時鐘脈沖的穩(wěn)定電平值(就是時鐘信號無效時是高還是低),詳情如下所示:

  • Mode0:CKP=0,CKE =0:當(dāng)空閑態(tài)時,SCK處于低電平,數(shù)據(jù)采樣是在第1個邊沿,也就是SCK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿(準(zhǔn)備數(shù)據(jù)),(發(fā)送數(shù)據(jù))數(shù)據(jù)發(fā)送是在下降沿。

  • Mode1:CKP=0,CKE=1:當(dāng)空閑態(tài)時,SCK處于低電平,數(shù)據(jù)發(fā)送是在第2個邊沿,也就是SCK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。

  • Mode2:CKP=1,CKE=0:當(dāng)空閑態(tài)時,SCK處于高電平,數(shù)據(jù)采集是在第1個邊沿,也就是SCK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。

  • Mode3:CKP=1,CKE=1:當(dāng)空閑態(tài)時,SCK處于高電平,數(shù)據(jù)發(fā)送是在第2個邊沿,也就是SCK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。


圖片

黑線為采樣數(shù)據(jù)的時刻,藍(lán)線為SCK時鐘信號


舉個例子,下圖是SPI Mode0讀/寫時序,可以看出SCK空閑狀態(tài)為低電平,主機(jī)數(shù)據(jù)在第一個跳變沿被從機(jī)采樣,數(shù)據(jù)輸出同理。


圖片


下圖是SPI Mode3讀/寫時序,SCK空閑狀態(tài)為高電平,主機(jī)數(shù)據(jù)在第二個跳變沿被從機(jī)采樣,數(shù)據(jù)輸出同理。


圖片



4


多從機(jī)模式


有兩種方法可以將多個從設(shè)備連接到主設(shè)備:多片選和菊花鏈。


通常,每個從機(jī)都需要一條單獨(dú)的SS線。如果要和特定的從機(jī)進(jìn)行通訊,可以將相應(yīng)的NSS信號線拉低,并保持其他SS信號線的狀態(tài)為高電平;如果同時將兩個SS信號線拉低,則可能會出現(xiàn)亂碼,因?yàn)閺臋C(jī)可能都試圖在同一條MISO線上傳輸數(shù)據(jù),最終導(dǎo)致接收數(shù)據(jù)亂碼。


圖片


菊花鏈的最大缺點(diǎn)是信號串行傳輸,一旦數(shù)據(jù)鏈路中的某設(shè)備發(fā)生故障的時候,它下面優(yōu)先級較低的設(shè)備就不可能得到服務(wù)了。另一方面,距離主機(jī)越遠(yuǎn)的從機(jī),獲得服務(wù)的優(yōu)先級越低,所以需要安排好從機(jī)的優(yōu)先級,并且設(shè)置總線檢測器,如果某個從機(jī)超時,則對該從機(jī)進(jìn)行短路,防止單個從機(jī)損壞造成整個鏈路崩潰的情況。


圖片

5


SPI優(yōu)缺點(diǎn)


優(yōu)點(diǎn)


  1. 無起始位和停止位,因此數(shù)據(jù)位可以連續(xù)傳輸而不會被中斷;

  2. 沒有像I2C這樣復(fù)雜的從設(shè)備尋址系統(tǒng);

  3. 數(shù)據(jù)傳輸速率比I2C更高(幾乎快兩倍);

  4. 分離的MISO和MOSI信號線,因此可以同時發(fā)送和接收數(shù)據(jù);

  5. 極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;

  6. 非常簡單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機(jī)使用主機(jī)時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。


缺點(diǎn)

  1. 使用四根信號線(I2C和UART使用兩根信號線);

  2. 無法確認(rèn)是否已成功接收數(shù)據(jù)(I2C擁有此功能);

  3. 沒有任何形式的錯誤檢查,如UART中的奇偶校驗(yàn)位;

  4. 只允許一個主設(shè)備;

  5. 沒有硬件從機(jī)應(yīng)答信號(主機(jī)可能在不知情的情況下無處發(fā)送);

  6. 沒有定義硬件級別的錯誤檢查協(xié)議;

  7. 與RS-232和CAN總線相比,只能支持非常短的距離;



*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: SPI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉