SPI總線的軟件模擬
對于沒有提供SPI接口的單片機而言,通?墒褂密浖霓k法來模擬SPI的總線操作,包括串行時鐘、數(shù)據(jù)輸入和輸出。
Atmel公司生產(chǎn)的EEPROM具有SPI接口,存儲容量為4Kb的AT25040就有SPI接口,80C51系列單片機與AT25040的SPI總線接口接線如圖所示。
圖 SPI總線接口接線圖<?XML:NAMESPACE PREFIX = O />
圖9-6中,P1.0模擬SPI的數(shù)據(jù)輸出端(MOSI),P1.1模擬SPI的SCK輸出端,P1.2模擬SPI的從機選擇端(SS),P1.3模擬SPI的數(shù)據(jù)輸入端(MISO)。下面給出模擬SPI串行輸入、串行輸出和串行輸入/輸出的3個子程序。
1.MCU串行輸入子程序SPIIN
從AT25040的SO端接收8位數(shù)據(jù)并放入寄存器R0中。參考程序如下:
SPIIN: SETB P1.1 ;使P1.1(時鐘)輸出為1
CLR P1.2 ;選擇從機
MOV R1, #08H ;置循環(huán)次數(shù)
SPIIN1: CLR P1.1 ;使P1.1(時鐘)輸出為0
NOP ;延時
NOP
MOV C, P1.3 ;從機輸出送進位C
RLC A ;左移至累加器A
SETB P1.1 ;使P1.1(時鐘)輸出為1
DJNZ R1, SPIIN1 ;判斷是否循環(huán)8次(8位數(shù)據(jù))
MOV R0, A ;8位數(shù)據(jù)送R0
RET
2.MCU串行輸出子程序SPIOUT
將80C51單片機中R0寄存器的內(nèi)容傳送到AT25040的SI端。參考程序如下:
SPIOUT: SETB P1.1 ;使P1.1(時鐘)輸出為1
CLR P1.2 ;選擇從機
MOV R1, #08H ;置循環(huán)次數(shù)
MOV A, R0 ;8位數(shù)據(jù)送累加器A
SPIOUT1: CLR P1.1 ;使P1.1(時鐘)輸出為0
NOP ;延時
NOP
RLC A ;左移至累加器A,最高為至C
MOV P1.0, C ;進位C送從機輸入
SETB P1.1 ;使P1.1(時鐘)輸出為1
DJNZ R1, SPIOUT1 ;判斷是否循環(huán)8次(8位數(shù)據(jù))
RET
3.MCU串行輸入/輸出子程序 SPIIO
將80C51單片機R0寄存器的內(nèi)容傳送到AT25040的SI端,同時從AT25040的SO端接收8位數(shù)據(jù)。參考程序如下:
SPIIO: SETB P1.1 ;使P1.1 (時鐘)輸出為1
CLR P1.2 ;選擇從機
MOV R1, #08H ;置循環(huán)次數(shù)
MOV A, R0 ;8位數(shù)據(jù)送累加器A
SPIIO1: CLR P1.1 ;使P1.1(時鐘)輸出為0
NOP ;延時
NOP
MOV C, P1.3 ;從機輸出送進位C
RLC A ;左移至累加器A,最高為至C
MOV P1.0, C ;進位C送從機輸入
SETB P1.1 ;使P1.1(時鐘)輸出為1
DJNZ R1, SPIIO1 ;判斷是否循環(huán)8次(8位數(shù)據(jù))
RET
這些子程序適用于在串行時鐘的上升沿輸入和下降沿輸出的各種串行外圍接口芯片(如D/A和A/D轉(zhuǎn)換芯片、實時時鐘芯片、LED顯示驅(qū)動芯片等)。對于下降沿輸入、上升沿輸出的各種串行外圍接口芯片,只要改變P1.1的輸出電平順序,這些子程序也同樣適用。
如先置P1.1為低電平,之后再次置P1.1為高電平,再置P1.1為低電平等等。
編輯:admin 最后修改時間:2018-05-08