一文搞懂SPI通信協(xié)議
1
簡介
SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是美國摩托羅拉公司(Motorola)最先推出的一種同步串行傳輸規(guī)范,也是一種單片機外設芯片串行擴展接口,是一種高速、全雙工、同步通信總線,所以可以在同一時間發(fā)送和接收數(shù)據(jù),SPI沒有定義速度限制,通常能達到甚至超過10M/bps。
SPI有主、從兩種模式,通常由一個主模塊和一個或多個從模塊組成(SPI不支持多主機),主模塊選擇一個從模塊進行同步通信,從而完成數(shù)據(jù)的交換。提供時鐘的為主設備(Master),接收時鐘的設備為從設備(Slave),SPI接口的讀寫操作,都是由主設備發(fā)起,當存在多個從設備時,通過各自的片選信號進行管理。
SPI通信原理很簡單,需要至少4根線,單向傳輸時3根線,它們是MISO(主設備數(shù)據(jù)輸入)、MOSI(主設備數(shù)據(jù)輸出)、SCLK(時鐘)和CS/SS(片選):
MISO( Master Input Slave Output):主設備數(shù)據(jù)輸入,從設備數(shù)據(jù)輸出;
MOSI(Master Output Slave Input):主設備數(shù)據(jù)輸出,從設備數(shù)據(jù)輸入;
SCLK(Serial Clock):時鐘信號,由主設備產(chǎn)生;
CS/SS(Chip Select/Slave Select):從設備使能信號,由主設備控制,一主多從時,CS/SS是從芯片是否被主芯片選中的控制信號,只有片選信號為預先規(guī)定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。
一主設備一從設備模式

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

SPI數(shù)據(jù)通信的流程可以分為以下幾步:
1、主設備發(fā)起信號,將CS/SS拉低,啟動通信。
2、主設備通過發(fā)送時鐘信號,來告訴從設備進行寫數(shù)據(jù)或者讀數(shù)據(jù)操作(采集時機可能是時鐘信號的上升沿(從低到高)或下降沿(從高到低),因為SPI有四種模式,后面會講到),它將立即讀取數(shù)據(jù)線上的信號,這樣就得到了一位數(shù)據(jù)(1bit)。
3、主機(Master)將要發(fā)送的數(shù)據(jù)寫到發(fā)送數(shù)據(jù)緩存區(qū)(Menory),緩存區(qū)經(jīng)過移位寄存器(緩存長度不一定,看單片機配置),串行移位寄存器通過MOSI信號線將字節(jié)一位一位的移出去傳送給從機,同時MISO接口接收到的數(shù)據(jù)經(jīng)過移位寄存器一位一位的移到接收緩存區(qū)。
4、從機(Slave)也將自己的串行移位寄存器(緩存長度不一定,看單片機配置)中的內(nèi)容通過MISO信號線返回給主機。同時通過MOSI信號線接收主機發(fā)送的數(shù)據(jù),這樣,兩個移位寄存器中的內(nèi)容就被交換。
例如,下圖示例中簡單模擬SPI通信流程,主機拉低NSS片選信號,啟動通信,并且產(chǎn)生時鐘信號,上升沿觸發(fā)邊沿信號,主機在MOSI線路一位一位發(fā)送數(shù)據(jù)0X53,在MISO線路一位一位接收數(shù)據(jù)0X46,如下圖所示:

這里有一點需要著重說明一下:SPI只有主模式和從模式之分,沒有讀和寫的說法,外設的寫操作和讀操作是同步完成的。若只進行寫操作,主機只需忽略接收到的字節(jié)(虛擬數(shù)據(jù));反之,若主機要讀取從機的一個字節(jié),就必須發(fā)送一個空字節(jié)來引發(fā)從機的傳輸。也就是說,你發(fā)一個數(shù)據(jù)必然會收到一個數(shù)據(jù);你要收一個數(shù)據(jù)必須也要先發(fā)一個數(shù)據(jù)。
3
通信特性
3.1、設備選擇
SPI是單主設備(Single Master)通信協(xié)議,只有一支主設備能發(fā)起通信,當SPI主設備想讀/寫從設備時,它首先拉低從設備對應的SS線(SS是低電平有效)。接著開始發(fā)送工作脈沖到時鐘線上,在相應的脈沖時間上,主設備把信號發(fā)到MOSI實現(xiàn)“寫”,同時可對MISO采樣而實現(xiàn)“讀”。如下圖所示:

3.2、設備時鐘
SPI時鐘特點主要包括:時鐘速率、時鐘極性和時鐘相位三方面。
3.2.1、時鐘速率
SPI總線上的主設備必須在通信開始時候配置并生成相應的時鐘信號。從理論上講,只要實際可行,時鐘速率就可以是你想要的任何速率,當然這個速率受限于每個系統(tǒng)能提供多大的系統(tǒng)時鐘頻率,以及最大的SPI傳輸速率。
3.2.2、時鐘極性
根據(jù)硬件制造商的命名規(guī)則不同,時鐘極性通常寫為CKP或CPOL。時鐘極性和相位共同決定讀取數(shù)據(jù)的方式,比如信號上升沿讀取數(shù)據(jù)還是信號下降沿讀取數(shù)據(jù)。
CKP可以配置為1或0。
這意味著你可以根據(jù)需要將時鐘的默認狀態(tài)(IDLE)設置為高或低。極性反轉(zhuǎn)可以通過簡單的邏輯逆變器實現(xiàn)。你必須參考設備的數(shù)據(jù)手冊才能正確設置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的時鐘極性和時鐘相位特性可以設置4種不同的SPI通信操作模式,它們的區(qū)別是定義了在時鐘脈沖的哪條邊沿轉(zhuǎn)換(toggles)輸出信號,哪條邊沿采樣輸入信號,還有時鐘脈沖的穩(wěn)定電平值(就是時鐘信號無效時是高還是低),詳情如下所示:
Mode0:CKP=0,CKE =0:當空閑態(tài)時,SCK處于低電平,數(shù)據(jù)采樣是在第1個邊沿,也就是SCK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿(準備數(shù)據(jù)),(發(fā)送數(shù)據(jù))數(shù)據(jù)發(fā)送是在下降沿。
Mode1:CKP=0,CKE=1:當空閑態(tài)時,SCK處于低電平,數(shù)據(jù)發(fā)送是在第2個邊沿,也就是SCK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。
Mode2:CKP=1,CKE=0:當空閑態(tài)時,SCK處于高電平,數(shù)據(jù)采集是在第1個邊沿,也就是SCK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。
Mode3:CKP=1,CKE=1:當空閑態(tài)時,SCK處于高電平,數(shù)據(jù)發(fā)送是在第2個邊沿,也就是SCK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。

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

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

4
多從機模式
有兩種方法可以將多個從設備連接到主設備:多片選和菊花鏈。
通常,每個從機都需要一條單獨的SS線。如果要和特定的從機進行通訊,可以將相應的NSS信號線拉低,并保持其他SS信號線的狀態(tài)為高電平;如果同時將兩個SS信號線拉低,則可能會出現(xiàn)亂碼,因為從機可能都試圖在同一條MISO線上傳輸數(shù)據(jù),最終導致接收數(shù)據(jù)亂碼。

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

5
SPI優(yōu)缺點
優(yōu)點
無起始位和停止位,因此數(shù)據(jù)位可以連續(xù)傳輸而不會被中斷;
沒有像I2C這樣復雜的從設備尋址系統(tǒng);
數(shù)據(jù)傳輸速率比I2C更高(幾乎快兩倍);
分離的MISO和MOSI信號線,因此可以同時發(fā)送和接收數(shù)據(jù);
極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;
非常簡單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機使用主機時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。
缺點
使用四根信號線(I2C和UART使用兩根信號線);
無法確認是否已成功接收數(shù)據(jù)(I2C擁有此功能);
沒有任何形式的錯誤檢查,如UART中的奇偶校驗位;
只允許一個主設備;
沒有硬件從機應答信號(主機可能在不知情的情況下無處發(fā)送);
沒有定義硬件級別的錯誤檢查協(xié)議;
與RS-232和CAN總線相比,只能支持非常短的距離;
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。