I2C總線在單片機(jī)上的實(shí)現(xiàn)
圖5是一個(gè)伺服系統(tǒng)的結(jié)構(gòu)圖。它用8XC752單片機(jī)的PWM輸出經(jīng)放大后來驅(qū)動(dòng)電機(jī),電機(jī)的轉(zhuǎn)速由測速機(jī)測取并直接送到8XC752片內(nèi)的A/D電路。處理后的有關(guān)信息經(jīng)I2C總線送到LCD驅(qū)動(dòng)芯片PCF8577以驅(qū)動(dòng)64段LCD顯示板。
3.2 通用I/O端口作為I2C總線接口
目前,51、96系列的單片機(jī)應(yīng)用很廣,但是由于它們都沒有I2C總線接口,從而限制了在這些系統(tǒng)中使用具有I2C總線接口的器件。通過對(duì)I2C總線時(shí)序的分析,可以用51單片機(jī)的兩根I/O線來實(shí)現(xiàn)I2C總線的功能。接I2C總線規(guī)定:SCL線和SDA線是各設(shè)備對(duì)應(yīng)輸出狀態(tài)相“與”的結(jié)果,任一設(shè)備都可以用輸出低電平的方法來延長SCL的低電平時(shí)間,以迫使高速設(shè)備進(jìn)入等待狀態(tài),從而實(shí)現(xiàn)不同速度設(shè)備間的時(shí)鐘同步。因此,即使時(shí)鐘脈沖的高、低電平時(shí)間長短不一,也能實(shí)現(xiàn)數(shù)據(jù)的可靠傳送,可以用軟件控制I/O口做I2C接口。下面就是用GMS97C2051的通用I/O口來作為I2C總線接口,并由軟件控制實(shí)現(xiàn)數(shù)據(jù)傳送的例子,圖6為其連線圖。
在單主控器的系統(tǒng)中,時(shí)鐘線僅由主控器驅(qū)動(dòng),因此可以用51系列的一根I/O線作為SCL的信號(hào)線,將其設(shè)備為輸出方式,并由軟件控制來產(chǎn)生串行時(shí)鐘信號(hào)。在實(shí)際系統(tǒng)中使用了P1.3。另一根I/O線P1.2作為I2C總線的串行數(shù)據(jù)線,可在軟件控制下在時(shí)鐘的低電平期間讀取或輸出數(shù)據(jù)。系統(tǒng)傳輸數(shù)據(jù)的過程如下:先由單片機(jī)發(fā)出一個(gè)啟始數(shù)據(jù)信號(hào),接著送出要訪問器件的7位地址數(shù)據(jù),并等待被控器件的應(yīng)答信號(hào)。當(dāng)收以應(yīng)答信號(hào)后,根據(jù)訪問要求進(jìn)行相應(yīng)的操作。如果是讀入數(shù)據(jù),則數(shù)據(jù)線可一直設(shè)為輸入方式,中間不需要改變SDA線的工作方式,每讀入一個(gè)字節(jié)均應(yīng)依次檢測應(yīng)答信號(hào);如果是輸出數(shù)據(jù),則首先將SDA設(shè)置為輸出方式,當(dāng)發(fā)送完一個(gè)字節(jié)后,需要改變SDA線為輸入方式,此時(shí)讀入被控器件的應(yīng)答信號(hào)就完成了一個(gè)字節(jié)的傳送。當(dāng)所有數(shù)據(jù)傳輸完畢后,應(yīng)向SDA發(fā)出一個(gè)停止信號(hào),以結(jié)束該次數(shù)據(jù)傳輸。
下面給出51系列用匯編語言實(shí)現(xiàn)啟始、停止、讀、寫、應(yīng)答的程序,讀者也可以根據(jù)I2C總線時(shí)序在96系列或其它單片機(jī)上實(shí)現(xiàn)I2C總線接口。
a.啟動(dòng)位程序
ACK:CLR P1.3
NOP
NOP
SETB P1.2
NOP
NOP
NOP
CPL P1.3 ;P1.3=1
NOP
NOP
NOP
DENGDAI:JB P1.2,DENGDAI
RET
b.讀數(shù)據(jù)程序
讀字節(jié)可以在當(dāng)前地址讀(CURRENT READ),也可以隨機(jī)讀(RANDOM READ),讀出數(shù)據(jù)的最后一個(gè)字節(jié)后不用加應(yīng)答信號(hào)。
READ:PUSH 0EH
CLR P1.4
LCALL BSTART ;START
MOV A,#0A0H ;SEND THE CNOTROL BYTE
LCALL SENDBYTE
LCALL ACK
MOV A,R1 ;SEND THE ADDRESS
LCALL SENDBYTE
LCALL ACK
LCALL BSTART ;START
評(píng)論