SPI是一種高速的,全雙工,同步的通信總線,可以在同一時(shí)間發(fā)送和接收數(shù)據(jù),并且沒(méi)有定義速度限制,通常能達(dá)到甚至超過(guò)10M/bps。在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。
1.SPI特性
SPI總線包括4條邏輯線,定義如下:
MISO:Master input slave output 主機(jī)輸入,從機(jī)輸出(數(shù)據(jù)來(lái)自從機(jī));
MOSI:Master output slave input 主機(jī)輸出,從機(jī)輸入(數(shù)據(jù)來(lái)自主機(jī));
SCLK :Serial Clock 串行時(shí)鐘信號(hào),由主機(jī)產(chǎn)生發(fā)送給從機(jī);
SS:Slave Select 片選信號(hào),由主機(jī)發(fā)送,以控制與哪個(gè)從機(jī)通信,通常是低電平有效信號(hào)。
2.SPI工作流程
SPI是一個(gè)同步的數(shù)據(jù)總線,它是用一條單獨(dú)的數(shù)據(jù)線和一條單獨(dú)的時(shí)鐘信號(hào)來(lái)保證發(fā)送端和接收端的完美同步。
時(shí)鐘是一個(gè)振蕩信號(hào),它告訴接收端在確切的時(shí)機(jī)對(duì)數(shù)據(jù)線上的信號(hào)進(jìn)行采樣。
SPI有主、從兩種模式,通常由一個(gè)主模塊(主機(jī))和一個(gè)或多個(gè)從模塊(叢機(jī))組成(SPI不支持多主機(jī)),提供時(shí)鐘的為主設(shè)備(Master),接收時(shí)鐘的設(shè)備為從設(shè)備(Slave),SPI接口的讀寫操作,都是由主設(shè)備發(fā)起,當(dāng)存在多個(gè)從設(shè)備時(shí),通過(guò)各自的片選信號(hào)進(jìn)行管理。
整體的傳輸大概可以分為以下幾個(gè)過(guò)程:
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)的上升沿(從低到高)或下降沿(從高到低),它將立即讀取數(shù)據(jù)線上的信號(hào),這樣就得到了一位數(shù)據(jù)(1bit)。
3、主機(jī)(Master)將要發(fā)送的數(shù)據(jù)寫到發(fā)送數(shù)據(jù)緩存區(qū)(Menory),緩存區(qū)經(jīng)過(guò)移位寄存器,串行移位寄存器通過(guò)MOSI信號(hào)線將字節(jié)一位一位的移出去傳送給從機(jī),同時(shí)MISO接口接收到的數(shù)據(jù)經(jīng)過(guò)移位寄存器一位一位的移到接收緩存區(qū)。
4、從機(jī)(Slave)也將自己的串行移位寄存器中的內(nèi)容通過(guò)MISO信號(hào)線返回給主機(jī)。同時(shí)通過(guò)MOSI信號(hào)線接收主機(jī)發(fā)送的數(shù)據(jù),這樣,兩個(gè)移位寄存器中的內(nèi)容就被交換。
下圖簡(jiǎn)單模擬SPI通信流程,主機(jī)拉低CS片選信號(hào),啟動(dòng)通信,并且產(chǎn)生時(shí)鐘信號(hào),上升沿觸發(fā)邊沿信號(hào),主機(jī)在MOSI線路一位一位發(fā)送數(shù)據(jù)0X53,在MISO線路一位一位接收數(shù)據(jù)0X46,如下圖所示:
數(shù)據(jù)在傳輸中,高位在先還是低位在先,SPI協(xié)議并無(wú)明確規(guī)定,但是數(shù)據(jù)要在主從機(jī)中正確傳輸,自然雙方要先約定好,一般會(huì)采用高位在先(MSB)方式傳輸。
3.SPI四種工作模式
除了配置串行時(shí)鐘速率(頻率)外,SPI主設(shè)備還需要配置時(shí)鐘極性和時(shí)鐘相位。
時(shí)鐘極性 CKP/Clock Polarit
時(shí)鐘極性通常寫為CKP或CPOL。時(shí)鐘極性和相位共同決定讀取數(shù)據(jù)的方式,比如信號(hào)上升沿讀取數(shù)據(jù)還是信號(hào)下降沿讀取數(shù)據(jù),CKP可以配置為1或0??梢愿鶕?jù)需要將時(shí)鐘的默認(rèn)狀態(tài)設(shè)置為高或低。極性反轉(zhuǎn)可以通過(guò)簡(jiǎn)單的邏輯逆變器實(shí)現(xiàn)。
CKP = 0:時(shí)鐘空閑IDLE為低電平0;
CKP = 1:時(shí)鐘空閑IDLE為高電平1;
時(shí)鐘相位 CKE /Clock Phase (Edge)
除配置串行時(shí)鐘速率和極性外,SPI主設(shè)備還應(yīng)配置時(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è)跳變沿采樣;