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