對(duì)于沒(méi)有提供spi接口的單片機(jī)而言,通??墒褂密浖霓k法來(lái)模擬spi的總線操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和輸出。
atmel公司生產(chǎn)的eeprom具有spi接口,存儲(chǔ)容量為4kb的at25040就有spi接口,80c51系列單片機(jī)與at25040的spi總線接口接線如圖所示。
圖 spi總線接口接線圖
圖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
clrp1.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
setbp1.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
clrp1.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
rlca;左移至累加器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
rlca;左移至累加器a,最高為至c
mov p1.0, c ;進(jìn)位c送從機(jī)輸入
setbp1.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ū)動(dòng)芯片等)。對(duì)于下降沿輸入、上升沿輸出的各種串行外圍接口芯片,只要改變p1.1的輸出電平順序,這些子程序也同樣適用。
如先置p1.1為低電平,之后再次置p1.1為高電平,再置p1.1為低電平等等。