一文搞懂SPI通信協(xié)議
1
簡(jiǎn)介
SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫,是美國(guó)摩托羅拉公司(Motorola)最先推出的一種同步串行傳輸規(guī)范,也是一種單片機(jī)外設(shè)芯片串行擴(kuò)展接口,是一種高速、全雙工、同步通信總線,所以可以在同一時(shí)間發(fā)送和接收數(shù)據(jù),SPI沒(méi)有定義速度限制,通常能達(dá)到甚至超過(guò)10M/bps。
SPI有主、從兩種模式,通常由一個(gè)主模塊和一個(gè)或多個(gè)從模塊組成(SPI不支持多主機(jī)),主模塊選擇一個(gè)從模塊進(jìn)行同步通信,從而完成數(shù)據(jù)的交換。提供時(shí)鐘的為主設(shè)備(Master),接收時(shí)鐘的設(shè)備為從設(shè)備(Slave),SPI接口的讀寫操作,都是由主設(shè)備發(fā)起,當(dāng)存在多個(gè)從設(shè)備時(shí),通過(guò)各自的片選信號(hào)進(jìn)行管理。
SPI通信原理很簡(jiǎn)單,需要至少4根線,單向傳輸時(shí)3根線,它們是MISO(主設(shè)備數(shù)據(jù)輸入)、MOSI(主設(shè)備數(shù)據(jù)輸出)、SCLK(時(shí)鐘)和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í)鐘信號(hào),由主設(shè)備產(chǎn)生;
CS/SS(Chip Select/Slave Select):從設(shè)備使能信號(hào),由主設(shè)備控制,一主多從時(shí),CS/SS是從芯片是否被主芯片選中的控制信號(hào),只有片選信號(hào)為預(yù)先規(guī)定的使能信號(hào)時(shí)(高電位或低電位),主芯片對(duì)此從芯片的操作才有效。
一主設(shè)備一從設(shè)備模式
一主設(shè)備多從設(shè)備模式
2
通信原理
SPI主設(shè)備和從設(shè)備都有一個(gè)串行移位寄存器,主設(shè)備通過(guò)向它的SPI串行寄存器寫入一個(gè)字節(jié)來(lái)發(fā)起一次傳輸。
SPI數(shù)據(jù)通信的流程可以分為以下幾步:
1、主設(shè)備發(fā)起信號(hào),將CS/SS拉低,啟動(dòng)通信。
2、主設(shè)備通過(guò)發(fā)送時(shí)鐘信號(hào),來(lái)告訴從設(shè)備進(jìn)行寫數(shù)據(jù)或者讀數(shù)據(jù)操作(采集時(shí)機(jī)可能是時(shí)鐘信號(hào)的上升沿(從低到高)或下降沿(從高到低),因?yàn)镾PI有四種模式,后面會(huì)講到),它將立即讀取數(shù)據(jù)線上的信號(hào),這樣就得到了一位數(shù)據(jù)(1bit)。
3、主機(jī)(Master)將要發(fā)送的數(shù)據(jù)寫到發(fā)送數(shù)據(jù)緩存區(qū)(Menory),緩存區(qū)經(jīng)過(guò)移位寄存器(緩存長(zhǎng)度不一定,看單片機(jī)配置),串行移位寄存器通過(guò)MOSI信號(hào)線將字節(jié)一位一位的移出去傳送給從機(jī),同時(shí)MISO接口接收到的數(shù)據(jù)經(jīng)過(guò)移位寄存器一位一位的移到接收緩存區(qū)。
4、從機(jī)(Slave)也將自己的串行移位寄存器(緩存長(zhǎng)度不一定,看單片機(jī)配置)中的內(nèi)容通過(guò)MISO信號(hào)線返回給主機(jī)。同時(shí)通過(guò)MOSI信號(hào)線接收主機(jī)發(fā)送的數(shù)據(jù),這樣,兩個(gè)移位寄存器中的內(nèi)容就被交換。
例如,下圖示例中簡(jiǎn)單模擬SPI通信流程,主機(jī)拉低NSS片選信號(hào),啟動(dòng)通信,并且產(chǎn)生時(shí)鐘信號(hào),上升沿觸發(fā)邊沿信號(hào),主機(jī)在MOSI線路一位一位發(fā)送數(shù)據(jù)0X53,在MISO線路一位一位接收數(shù)據(jù)0X46,如下圖所示:
這里有一點(diǎn)需要著重說(shuō)明一下:SPI只有主模式和從模式之分,沒(méi)有讀和寫的說(shuō)法,外設(shè)的寫操作和讀操作是同步完成的。若只進(jìn)行寫操作,主機(jī)只需忽略接收到的字節(jié)(虛擬數(shù)據(jù));反之,若主機(jī)要讀取從機(jī)的一個(gè)字節(jié),就必須發(fā)送一個(gè)空字節(jié)來(lái)引發(fā)從機(jī)的傳輸。也就是說(shuō),你發(fā)一個(gè)數(shù)據(jù)必然會(huì)收到一個(gè)數(shù)據(jù);你要收一個(gè)數(shù)據(jù)必須也要先發(fā)一個(gè)數(shù)據(jù)。
3
通信特性
3.1、設(shè)備選擇
SPI是單主設(shè)備(Single Master)通信協(xié)議,只有一支主設(shè)備能發(fā)起通信,當(dāng)SPI主設(shè)備想讀/寫從設(shè)備時(shí),它首先拉低從設(shè)備對(duì)應(yīng)的SS線(SS是低電平有效)。接著開(kāi)始發(fā)送工作脈沖到時(shí)鐘線上,在相應(yīng)的脈沖時(shí)間上,主設(shè)備把信號(hào)發(fā)到MOSI實(shí)現(xiàn)“寫”,同時(shí)可對(duì)MISO采樣而實(shí)現(xiàn)“讀”。如下圖所示:
3.2、設(shè)備時(shí)鐘
SPI時(shí)鐘特點(diǎn)主要包括:時(shí)鐘速率、時(shí)鐘極性和時(shí)鐘相位三方面。
3.2.1、時(shí)鐘速率
SPI總線上的主設(shè)備必須在通信開(kāi)始時(shí)候配置并生成相應(yīng)的時(shí)鐘信號(hào)。從理論上講,只要實(shí)際可行,時(shí)鐘速率就可以是你想要的任何速率,當(dāng)然這個(gè)速率受限于每個(gè)系統(tǒng)能提供多大的系統(tǒng)時(shí)鐘頻率,以及最大的SPI傳輸速率。
3.2.2、時(shí)鐘極性
根據(jù)硬件制造商的命名規(guī)則不同,時(shí)鐘極性通常寫為CKP或CPOL。時(shí)鐘極性和相位共同決定讀取數(shù)據(jù)的方式,比如信號(hào)上升沿讀取數(shù)據(jù)還是信號(hào)下降沿讀取數(shù)據(jù)。
CKP可以配置為1或0。
這意味著你可以根據(jù)需要將時(shí)鐘的默認(rèn)狀態(tài)(IDLE)設(shè)置為高或低。極性反轉(zhuǎn)可以通過(guò)簡(jiǎn)單的邏輯逆變器實(shí)現(xiàn)。你必須參考設(shè)備的數(shù)據(jù)手冊(cè)才能正確設(shè)置CKP和CKE。
CKP = 0:時(shí)鐘空閑IDLE為低電平 0;
CKP = 1:時(shí)鐘空閑IDLE為高電平1。
3.2.3、時(shí)鐘相位
根據(jù)硬件制造商的不同,時(shí)鐘相位通常寫為CKE或CPHA。顧名思義,時(shí)鐘相位/邊沿,也就是采集數(shù)據(jù)時(shí)是在時(shí)鐘信號(hào)的具體相位或者邊沿。
CKE = 0:在時(shí)鐘信號(hào)SCK的第一個(gè)跳變沿采樣;
CKE = 1:在時(shí)鐘信號(hào)SCK的第二個(gè)跳變沿采樣。
3.3、四種模式
根據(jù)SPI的時(shí)鐘極性和時(shí)鐘相位特性可以設(shè)置4種不同的SPI通信操作模式,它們的區(qū)別是定義了在時(shí)鐘脈沖的哪條邊沿轉(zhuǎn)換(toggles)輸出信號(hào),哪條邊沿采樣輸入信號(hào),還有時(shí)鐘脈沖的穩(wěn)定電平值(就是時(shí)鐘信號(hào)無(wú)效時(shí)是高還是低),詳情如下所示:
Mode0:CKP=0,CKE =0:當(dāng)空閑態(tài)時(shí),SCK處于低電平,數(shù)據(jù)采樣是在第1個(gè)邊沿,也就是SCK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿(準(zhǔn)備數(shù)據(jù)),(發(fā)送數(shù)據(jù))數(shù)據(jù)發(fā)送是在下降沿。
Mode1:CKP=0,CKE=1:當(dāng)空閑態(tài)時(shí),SCK處于低電平,數(shù)據(jù)發(fā)送是在第2個(gè)邊沿,也就是SCK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。
Mode2:CKP=1,CKE=0:當(dāng)空閑態(tài)時(shí),SCK處于高電平,數(shù)據(jù)采集是在第1個(gè)邊沿,也就是SCK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。
Mode3:CKP=1,CKE=1:當(dāng)空閑態(tài)時(shí),SCK處于高電平,數(shù)據(jù)發(fā)送是在第2個(gè)邊沿,也就是SCK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。
黑線為采樣數(shù)據(jù)的時(shí)刻,藍(lán)線為SCK時(shí)鐘信號(hào)
舉個(gè)例子,下圖是SPI Mode0讀/寫時(shí)序,可以看出SCK空閑狀態(tài)為低電平,主機(jī)數(shù)據(jù)在第一個(gè)跳變沿被從機(jī)采樣,數(shù)據(jù)輸出同理。
下圖是SPI Mode3讀/寫時(shí)序,SCK空閑狀態(tài)為高電平,主機(jī)數(shù)據(jù)在第二個(gè)跳變沿被從機(jī)采樣,數(shù)據(jù)輸出同理。
4
多從機(jī)模式
有兩種方法可以將多個(gè)從設(shè)備連接到主設(shè)備:多片選和菊花鏈。
通常,每個(gè)從機(jī)都需要一條單獨(dú)的SS線。如果要和特定的從機(jī)進(jìn)行通訊,可以將相應(yīng)的NSS信號(hào)線拉低,并保持其他SS信號(hào)線的狀態(tài)為高電平;如果同時(shí)將兩個(gè)SS信號(hào)線拉低,則可能會(huì)出現(xiàn)亂碼,因?yàn)閺臋C(jī)可能都試圖在同一條MISO線上傳輸數(shù)據(jù),最終導(dǎo)致接收數(shù)據(jù)亂碼。
菊花鏈的最大缺點(diǎn)是信號(hào)串行傳輸,一旦數(shù)據(jù)鏈路中的某設(shè)備發(fā)生故障的時(shí)候,它下面優(yōu)先級(jí)較低的設(shè)備就不可能得到服務(wù)了。另一方面,距離主機(jī)越遠(yuǎn)的從機(jī),獲得服務(wù)的優(yōu)先級(jí)越低,所以需要安排好從機(jī)的優(yōu)先級(jí),并且設(shè)置總線檢測(cè)器,如果某個(gè)從機(jī)超時(shí),則對(duì)該從機(jī)進(jìn)行短路,防止單個(gè)從機(jī)損壞造成整個(gè)鏈路崩潰的情況。
5
SPI優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
無(wú)起始位和停止位,因此數(shù)據(jù)位可以連續(xù)傳輸而不會(huì)被中斷;
沒(méi)有像I2C這樣復(fù)雜的從設(shè)備尋址系統(tǒng);
數(shù)據(jù)傳輸速率比I2C更高(幾乎快兩倍);
分離的MISO和MOSI信號(hào)線,因此可以同時(shí)發(fā)送和接收數(shù)據(jù);
極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;
非常簡(jiǎn)單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機(jī)使用主機(jī)時(shí)鐘,不需要精密時(shí)鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。
缺點(diǎn)
使用四根信號(hào)線(I2C和UART使用兩根信號(hào)線);
無(wú)法確認(rèn)是否已成功接收數(shù)據(jù)(I2C擁有此功能);
沒(méi)有任何形式的錯(cuò)誤檢查,如UART中的奇偶校驗(yàn)位;
只允許一個(gè)主設(shè)備;
沒(méi)有硬件從機(jī)應(yīng)答信號(hào)(主機(jī)可能在不知情的情況下無(wú)處發(fā)送);
沒(méi)有定義硬件級(jí)別的錯(cuò)誤檢查協(xié)議;
與RS-232和CAN總線相比,只能支持非常短的距離;
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。