1 引言
SPI(Serial Peripheral Interface--串行外設(shè)接口)總線系統(tǒng)是一種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息,。外圍設(shè)置FLASHRAM,、網(wǎng)絡(luò)控制器、LCD顯示驅(qū)動(dòng)器,、A/D轉(zhuǎn)換器和MCU等,。SPI總線系統(tǒng)可直接與各個(gè)廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,該接口一般使用4條線:串行時(shí)鐘線(SCK),、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO,、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOST和低電平有效的從機(jī)選擇線SS(有的SPI接口芯片帶有中斷信號(hào)線INT或INT,、有的SPI接口芯片沒有主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI)。由于SPI系統(tǒng)總線一共只需3~4位數(shù)據(jù)線和控制即可實(shí)現(xiàn)與具有SPI總線接口功能的各種I/O器件進(jìn)行接口,,而擴(kuò)展并行總線則需要8根數(shù)據(jù)線,、8~16位地址線、2~3位控制線,,因此,,采用SPI總線接口可以簡化電路設(shè)計(jì),節(jié)省很多常規(guī)電路中的接口器件和I/O口線,,提高設(shè)計(jì)的可靠性,。由此可見,在MCS51系列等不具有SPI接口的單片機(jī)組成的智能儀器和工業(yè)測控系統(tǒng)中,,當(dāng)傳輸速度要求不是太高時(shí),,使用SPI總線可以增加應(yīng)用系統(tǒng)接口器件的種類,提高應(yīng)用系統(tǒng)的性能,。
2 SPI總線的組成
利用SPI總線可在軟件的控制下構(gòu)成各種系統(tǒng),。如1個(gè)主MCU和幾個(gè)從MCU、幾個(gè)從MCU相互連接構(gòu)成多主機(jī)系統(tǒng)(分布式系統(tǒng)),、1個(gè)主MCU和1個(gè)或幾個(gè)從I/O設(shè)備所構(gòu)成的各種系統(tǒng)等,。在大多數(shù)應(yīng)用場合,可使用1個(gè)MCU作為控機(jī)來控制數(shù)據(jù),,并向1個(gè)或幾個(gè)從外圍器件傳送該數(shù)據(jù),。從器件只有在主機(jī)發(fā)命令時(shí)才能接收或發(fā)送數(shù)據(jù)。其數(shù)據(jù)的傳輸格式是高位(MSB)在前,,低位(LSB)在后,。SPI總線接口系統(tǒng)的典型結(jié)構(gòu)如圖1所示。
1 引言
SPI(Serial Peripheral Interface--串行外設(shè)接口)總線系統(tǒng)是一種同步串行外設(shè)接口,,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息,。外圍設(shè)置FLASHRAM、網(wǎng)絡(luò)控制器,、LCD顯示驅(qū)動(dòng)器,、A/D轉(zhuǎn)換器和MCU等。SPI總線系統(tǒng)可直接與各個(gè)廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,,該接口一般使用4條線:串行時(shí)鐘線(SCK),、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOST和低電平有效的從機(jī)選擇線SS(有的SPI接口芯片帶有中斷信號(hào)線INT或INT,、有的SPI接口芯片沒有主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI),。由于SPI系統(tǒng)總線一共只需3~4位數(shù)據(jù)線和控制即可實(shí)現(xiàn)與具有SPI總線接口功能的各種I/O器件進(jìn)行接口,而擴(kuò)展并行總線則需要8根數(shù)據(jù)線,、8~16位地址線,、2~3位控制線,,因此,采用SPI總線接口可以簡化電路設(shè)計(jì),,節(jié)省很多常規(guī)電路中的接口器件和I/O口線,,提高設(shè)計(jì)的可靠性。由此可見,,在MCS51系列等不具有SPI接口的單片機(jī)組成的智能儀器和工業(yè)測控系統(tǒng)中,,當(dāng)傳輸速度要求不是太高時(shí),使用SPI總線可以增加應(yīng)用系統(tǒng)接口器件的種類,,提高應(yīng)用系統(tǒng)的性能,。
2 SPI總線的組成
利用SPI總線可在軟件的控制下構(gòu)成各種系統(tǒng)。如1個(gè)主MCU和幾個(gè)從MCU,、幾個(gè)從MCU相互連接構(gòu)成多主機(jī)系統(tǒng)(分布式系統(tǒng)),、1個(gè)主MCU和1個(gè)或幾個(gè)從I/O設(shè)備所構(gòu)成的各種系統(tǒng)等。在大多數(shù)應(yīng)用場合,,可使用1個(gè)MCU作為控機(jī)來控制數(shù)據(jù),,并向1個(gè)或幾個(gè)從外圍器件傳送該數(shù)據(jù)。從器件只有在主機(jī)發(fā)命令時(shí)才能接收或發(fā)送數(shù)據(jù),。其數(shù)據(jù)的傳輸格式是高位(MSB)在前,,低位(LSB)在后。SPI總線接口系統(tǒng)的典型結(jié)構(gòu)如圖1所示,。
.
圖2所示為MCS51系列單片機(jī)與存儲(chǔ)器X25F008(E2PROM)的硬件連接圖,,圖2中,P1.0模擬MCU的數(shù)據(jù)輸出端(MOSI),,P1.1模擬SPI的SCK輸出端,,P1.2模擬SPI的從機(jī)選擇端,P1.3模擬SPI的數(shù)據(jù)輸入端(MISO),。下面介紹用MCS51單片機(jī)的匯編語言模擬SPI串行輸入,、串行輸出和串行輸入/輸出的3個(gè)子程序,實(shí)際上,,這些子程序也適用于在串行時(shí)鐘的上升沿輸入和下降沿輸出的其它各種串行外圍接口芯片(如A/D轉(zhuǎn)換芯片,、網(wǎng)絡(luò)控制器芯片、LED顯示驅(qū)動(dòng)芯片等),。對于下降沿輸入,、上升沿輸出的各種串行外圍接口芯片,,只要改變P1.1的輸出電平順序,,即先置P1.1為低電平,之后再次置P1.1為高電平,,再置P1.1為低電平……,,則這些子程序也同樣適用,。
3.1 MCU串行輸入子程序SPIIN
從X25F008的SPISO線上接收8位數(shù)據(jù)并放入寄存器R0中的應(yīng)用子程序如下:
SPIIN:SETB P1.1 ;使P1.1(時(shí)鐘)輸出為1
CLR P1.2 ;選擇從機(jī)
MOV R1,,#08H ,;置循環(huán)次數(shù)
SPIIN1:CLR P1.1 ;使P1.1(時(shí)鐘)輸出為0
NOP ,;延時(shí)
NOP
MOV C,,P1.3 ;從機(jī)輸出SPISO送進(jìn)位C
RLC A ,;左移至累加器ACC
SETB P1.1 ,;使P1.0(時(shí)鐘)輸出為1
DJNZ R1,SPIIN1 ;判斷是否循環(huán)8次(8位數(shù)據(jù))
MOV R0,,A ,;8位數(shù)據(jù)送R0
RET
3.2 MCU串行輸出子程序SPIOUT
將MCS51單片機(jī)中R0寄存器的內(nèi)容傳送到X25F008的SPISI線上的程序如下:
SPIOUT:SETB P1.1 ;使P1.1(時(shí)鐘)輸出為1
CLR P1.2 ;選擇從機(jī)
MOV R1,#08H ;置循環(huán)次數(shù)
MOV A,R0 ,;8位數(shù)據(jù)送累加器ACC
SPIOUT1:CLR P1.1 ,;使P1.1(時(shí)鐘)輸出為0
NOP ;延時(shí)
NOP
RLC A ,;左移至累加器ACC最高位至C
MOV P1.0,,C ;進(jìn)位C送從機(jī)輸入SPISI線上
SETB P1.1 ,;使P1.1(時(shí)鐘)輸出為1
DJNZ R1,SPIOUT1 ;判是否循環(huán)8次(8位數(shù)據(jù))
RET
3.3 MCU串行輸入/輸出子程序SPIIO
將MCS51單片機(jī)R0寄存器的內(nèi)容傳送到X25F008的SPISI中,,同時(shí)從X25F008的SPISO接收8位數(shù)據(jù)的程序如下:
SPIIO:SETB P1.1 ;使P1.1(時(shí)鐘)輸出為1
CLR P1.2 ,;選擇從機(jī)
MOV R1,,#08H ;置循環(huán)次數(shù)
MOV A,,R0 ,;8位數(shù)據(jù)送累加器ACC
SPIIO1:CLR P1.1 ;使P1.1(時(shí)鐘)輸出為0
NOP ,;延時(shí)
NOP
MOV C,,P1.3 ;從機(jī)輸出SPISO送進(jìn)位C
RLC A ,;左移至累加器ACC最高位至C
MOV P1.0,,C ;進(jìn)位C送從機(jī)輸入
SETB P1.1 ,;使P1.1(時(shí)鐘)輸出為1
DJNZ R1,,SPIIO1 ;判斷是否循環(huán)8次(8位數(shù)據(jù))
RET
4 結(jié)束語
本文介紹了通過SPI總線接口實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)方法,給出了用MCS51單片機(jī)匯編語言模擬SPI串行總線的輸入,、輸出,,輸入/輸出以傳送8位數(shù)據(jù)的子程序。實(shí)際上,,也可以根據(jù)SPI串行總線的操作時(shí)序特點(diǎn)來在MCS96系列,、ATMEL89系列等單片機(jī)上實(shí)現(xiàn)SPI總線的接口。