SPI的原理與結(jié)構(gòu)
SPI(Serial Peripheral Interface,串行外圍設(shè)備接口)是由Motorola公司開發(fā),用來在微控制器和外圍設(shè)備芯片之間提供一個(gè)低成本、易使用的接口(SPI有時(shí)候也被稱為4線接口)。這種接口可以用來連接存儲(chǔ)器(存儲(chǔ)數(shù)據(jù))、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器、實(shí)時(shí)時(shí)鐘日歷、LCD驅(qū)動(dòng)器、傳感器、音頻芯片,甚至其他處理器。支持SPI的元件很多,并且還一直在增加。
與標(biāo)準(zhǔn)的串行接口不同,SPI是一個(gè)同步協(xié)議接口,所有的傳輸都參照一個(gè)共同的時(shí)鐘,這個(gè)同步時(shí)鐘信號(hào)由主機(jī)(處理器)產(chǎn)生,接收數(shù)據(jù)的外設(shè)(從設(shè)備)使用時(shí)鐘來對(duì)串行比特流的接收進(jìn)行同步化??赡軙?huì)有許多芯片連到主機(jī)的同一個(gè)SPI接口上,這時(shí)主機(jī)通過觸發(fā)從設(shè)備的片選輸入引腳來選擇接收數(shù)據(jù)的從設(shè)備,沒有被選中的外設(shè)將不會(huì)參與SPI傳輸。
SPI主要使用4個(gè)信號(hào):主機(jī)輸出/從機(jī)輸入(MOSI)、主機(jī)輸入/主機(jī)輸出(MISO)、串行SCLK或SCK和外設(shè)芯片(CS)。有些處理器有SPI接口專用的芯片選擇,稱為從機(jī)選擇(SS)。
MOSI信號(hào)由主機(jī)產(chǎn)生,從機(jī)接收。在有些芯片上,MOSI只被簡單的標(biāo)為串行輸入(SI),或者串行數(shù)據(jù)輸入(SDI)。MISO信號(hào)由從機(jī)產(chǎn)生,不過還是在主機(jī)的控制下產(chǎn)生的。在一些芯片上,MISO有時(shí)被稱為串行輸出(SO)或串行數(shù)據(jù)輸出(SDO)。外設(shè)片選信號(hào)通常只是由主機(jī)的備用I/O引腳產(chǎn)生的。下左圖是微處理器通過SPI和外設(shè)進(jìn)行連接的示意圖。
主機(jī)和外設(shè)都包含一個(gè)串行移位寄存器,主機(jī)通過向它的SPI串行寄存器寫入一個(gè)字節(jié)來發(fā)起一次傳輸。寄存器是通過MOSI信號(hào)線將字節(jié)傳送給外設(shè),外設(shè)也將自己移位寄存器中的內(nèi)容通過MISO信號(hào)線返回給主機(jī),如上右圖所示。這樣,兩個(gè)移位寄存器中的內(nèi)容就被交換了。外設(shè)的寫操作和讀操作是同步完成的,因此SPI成為一個(gè)很有效的協(xié)議。
如果只是進(jìn)行寫操作,主機(jī)只需忽略收到的字節(jié);反過來,如果主機(jī)要讀取外設(shè)的一個(gè)字節(jié),就必須發(fā)送一個(gè)空字節(jié)來引發(fā)從機(jī)的傳輸。
當(dāng)主機(jī)發(fā)送一個(gè)連續(xù)的數(shù)據(jù)流時(shí),有些外設(shè)能夠進(jìn)行多字節(jié)傳輸。許多擁有SPI接口的存儲(chǔ)器芯片都以這種方式工作。在這種傳輸方式下,SPI外設(shè)的芯片選擇端必須在整個(gè)傳輸過程中保持低電平。比如,存儲(chǔ)器芯片會(huì)希望在一個(gè)“寫”命令之后緊接著收到的是4個(gè)地址字節(jié)(起始地址),這樣后面接收到的數(shù)據(jù)就可以存儲(chǔ)到該地址。一次傳輸可能會(huì)涉及千字節(jié)的移位或更多的信息。
其他外設(shè)只需要一個(gè)單字節(jié)(比如一個(gè)發(fā)給A/D轉(zhuǎn)換器的命令),有些甚至還支持菊花鏈連接,如下圖所示。
在這個(gè)例子中,主機(jī)處理器從其SPI接口發(fā)送3個(gè)字節(jié)的數(shù)據(jù)。第1個(gè)字節(jié)發(fā)送給外設(shè)A,當(dāng)?shù)?font face="Times New Roman">2個(gè)字節(jié)發(fā)送給外設(shè)A的時(shí)候,第1個(gè)字節(jié)已移出了A,而傳送給了B。同樣,主機(jī)想要從外設(shè)A讀取一個(gè)結(jié)果,它必須再發(fā)送一個(gè)3字節(jié)(空字節(jié))的序列,這樣就可以把A中的數(shù)據(jù)移到B中,然后再移到C中,最后送回主機(jī)。在這個(gè)過程中,主機(jī)還依次從B和C接收到字節(jié)。
注意,菊花鏈連接不一定適用于所有的SPI設(shè)備,特別是要求多字節(jié)傳輸?shù)模ū热绱鎯?chǔ)器芯片)設(shè)備。另外,要對(duì)外設(shè)芯片的數(shù)據(jù)表進(jìn)行仔細(xì)分析,確定能對(duì)它做什么而不能做什么。如果芯片的數(shù)據(jù)表中沒有明確提到菊花鏈連接,那么該芯片不支持這種連接的幾率為50%。
根據(jù)時(shí)鐘極性和時(shí)鐘相位的不同,SPI有4個(gè)工作模式。時(shí)鐘極性有高、低兩極:時(shí)鐘極性為低電平時(shí),空閑時(shí)時(shí)鐘(SCK)處于低電平,傳輸時(shí)跳轉(zhuǎn)到高電平;時(shí)鐘極性為高電平時(shí),空閑時(shí)時(shí)鐘處于高電平,傳輸時(shí)跳轉(zhuǎn)到低電平。
時(shí)鐘相位有兩個(gè):時(shí)鐘相位0和時(shí)鐘相位1。對(duì)于時(shí)鐘相位0,如果時(shí)鐘極性是低電平,MOSI和MISO輸出在(SCK)的上升沿有效。如果時(shí)鐘電平極性為高,對(duì)于時(shí)鐘相位0,這些輸出在SCK的下降沿有效。MISO輸出的第X位是一個(gè)未定義的附加位,是SPI接口特有的情況。用戶不必?fù)?dān)心這個(gè)位,因?yàn)?font face="Times New Roman">SPI接口將忽略該位。