王九龍 鄭貴金
(綏化學(xué)院電氣工程學(xué)院 黑龍江綏化 152061)
基于proteus的C51單片機(jī)I2C總線的實(shí)現(xiàn)
王九龍 鄭貴金
(綏化學(xué)院電氣工程學(xué)院 黑龍江綏化 152061)
I2C總線是由Philips公司設(shè)計(jì)的一款具有兩根接口的總線,其中一個(gè)接口為SCL,為時(shí)鐘信號(hào),另一個(gè)接口為SDA,是數(shù)據(jù)信號(hào),這種總線具有很多有優(yōu)點(diǎn),如:接口線的數(shù)量少,通信速度比較快等。由于80C51系列單片機(jī)并沒(méi)有配置I2C總線接口,給I2C總線的使用帶來(lái)了不便。文章分別通過(guò)C語(yǔ)言與匯編語(yǔ)言分別對(duì)I2C時(shí)序進(jìn)行編程,模擬了I2C總線在芯片間的通信。并在proteus軟件上進(jìn)行了讀寫(xiě)仿真驗(yàn)證。
I2C 總線;proteus;數(shù)據(jù)傳輸;AT24C04
I2C總線是能夠自動(dòng)找尋從器件的地址、使得較高速率設(shè)備與較低速率的設(shè)備之間實(shí)現(xiàn)同步傳輸和優(yōu)化的挑選需要的從器件進(jìn)行高性能數(shù)據(jù)傳送的總線。這種總線是以串行的方式在主期間與從器件之間進(jìn)行數(shù)據(jù)傳送的。I2C總線有兩根可以進(jìn)行雙向數(shù)據(jù)傳送的端口,一個(gè)端口是SDA,另一個(gè)端口是SCL[1-2]。其中,SCL負(fù)責(zé)時(shí)鐘信號(hào)的輸入,用來(lái)控制數(shù)據(jù)雙向傳送的時(shí)間順序,SDA負(fù)責(zé)數(shù)據(jù)的串行輸入,互相連接設(shè)備的所有數(shù)據(jù)端口均懸掛在此線上。圖1為所示I2C的架構(gòu)。
圖1 I2C總線的架構(gòu)
(一)I2C總線的典型信號(hào)及實(shí)現(xiàn)。I2C總線的數(shù)據(jù)傳輸有嚴(yán)格的時(shí)序要求,但主要包括以下四種典型信號(hào):1)起始信號(hào) S,2)終止信號(hào) P,3)發(fā)送應(yīng)答信號(hào)(0),4)發(fā)送非應(yīng)答信號(hào)(1)[3-4]。如圖2所示。
圖2 起始信號(hào)、終止信號(hào)、發(fā)送應(yīng)答信號(hào)、發(fā)送非應(yīng)答信號(hào)時(shí)序
1.起始信號(hào)S。起始信號(hào)是用來(lái)啟動(dòng)該總線的,為了保證起始信號(hào)有效,需要嚴(yán)格按照?qǐng)D2所示的時(shí)間順序進(jìn)行,其中兩種信號(hào)的持續(xù)時(shí)間,均不能低于圖中所標(biāo)示的時(shí)間。實(shí)現(xiàn)程序如下:
2.終止信號(hào)P。終止信號(hào)是用來(lái)釋放該總線的,為了保證終止信號(hào)有效,需要嚴(yán)格按照?qǐng)D2所示的時(shí)間順序進(jìn)行,其中兩種信號(hào)的持續(xù)時(shí)間,均不能低于圖中所標(biāo)示的時(shí)間。實(shí)現(xiàn)程序如下:
3.發(fā)送應(yīng)答信號(hào)(0)。從器件通過(guò)接受應(yīng)答信號(hào)通知主器件,一個(gè)字節(jié)的數(shù)據(jù)已被成功接受。只有嚴(yán)格按照?qǐng)D中所標(biāo)示的時(shí)間順序進(jìn)行且兩種信號(hào)的持續(xù)時(shí)間均不低于所標(biāo)注的時(shí)間,發(fā)送應(yīng)答信號(hào)才有效。實(shí)現(xiàn)程序如下:
4.發(fā)送非應(yīng)答信號(hào)(1)。從器件通過(guò)接受非應(yīng)答信號(hào)通知主器件,一個(gè)字節(jié)的數(shù)據(jù)接受失敗。只有嚴(yán)格按照?qǐng)D中所標(biāo)示的時(shí)間順序進(jìn)行且兩種信號(hào)的持續(xù)時(shí)間均不低于所標(biāo)注的時(shí)間,發(fā)送非應(yīng)答信號(hào)才有效。實(shí)現(xiàn)程序如下:
(二)I2C總線的讀寫(xiě)傳輸格式。
1.主機(jī)的寫(xiě)操作格式。首先,主機(jī)會(huì)先發(fā)出起始信號(hào)S,從而使得I2C總線啟動(dòng);之后進(jìn)行從器件的選擇,會(huì)下發(fā)一個(gè)控制字節(jié);剛才被選中的從器件在進(jìn)行確認(rèn)地址后,會(huì)在SDA線上發(fā)送一個(gè)應(yīng)答信號(hào),以回復(fù)主器件。主機(jī)接收到應(yīng)答信號(hào)后開(kāi)始數(shù)據(jù)傳送。傳送數(shù)據(jù)開(kāi)始后,主機(jī)發(fā)送一個(gè)字節(jié)內(nèi)容以確認(rèn)寫(xiě)入地址,當(dāng)主機(jī)接收到從器件發(fā)送回來(lái)的應(yīng)答信號(hào)之后,主機(jī)開(kāi)始一個(gè)個(gè)發(fā)送需要傳送的字節(jié)的每一位(從高位到低位)。每完成一個(gè)數(shù)據(jù)需等待一個(gè)回答。當(dāng)主機(jī)發(fā)送了P信號(hào)后,總線的控制權(quán)將被交出,終止操作[5]。如圖3。
圖3 主機(jī)寫(xiě)操作格式
2.主機(jī)的讀操作格式。對(duì)從機(jī)進(jìn)行讀出時(shí),主機(jī)須先發(fā)送一個(gè)對(duì)該從器件的控制字節(jié)即“偽寫(xiě)”。偽寫(xiě)的目的是選擇讀出從器件,從器件確認(rèn)是自己的地址后,在總線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為響應(yīng)。隨后,主機(jī)發(fā)送一個(gè)字節(jié)數(shù)據(jù)以確定讀出首地址,主機(jī)收到從器件的應(yīng)答信號(hào)后,重復(fù)一次起始信號(hào),并將數(shù)據(jù)傳送方向確定為“讀出”。收到應(yīng)答信號(hào)后開(kāi)始讀取各字節(jié)。每讀取一個(gè)字節(jié),主機(jī)都要回復(fù)應(yīng)答信號(hào)。直到所有的數(shù)據(jù)讀取完后,主機(jī)將返回一個(gè)“非應(yīng)答信號(hào)(0)”,以通知從器件所有的數(shù)據(jù)均以讀取完畢,隨后,主機(jī)將會(huì)發(fā)出一個(gè)P信號(hào),總線的控制權(quán)將被交出,結(jié)束操作[6]。如圖4。
圖4 主機(jī)讀操作格式
為了模擬I2C總線在89C51系列單片機(jī)背景下芯片間的通信。本文在proteus上搭建了AT89C51單片機(jī)與AT24C04C的通信模型[7]。AT24C04 E2PROM是典型的I2C總線接口器件,容量為512B[8-9]。仿真電路模型如圖5所示。
圖5 AT89C51與AT24C04C通信仿真電路
仿真電路包含復(fù)位電路、晶振電路、I2C通訊部分電路與輸出電路四部分。利用P1.4口輸出SCL時(shí)鐘信號(hào),利用P1.5口輸出SDA數(shù)據(jù)信號(hào)[10-11]。
在上文給出的通信仿真電路上,模擬AT89C51與AT24C04C通信[12-13]。
(一)模擬AT89C51單片機(jī)向AT24C04C內(nèi)寫(xiě)入數(shù)據(jù)。通過(guò)控制SCL時(shí)鐘線與SDA信號(hào)線,預(yù)將16個(gè)十六進(jìn)制數(shù)分別寫(xiě)入AT24C04C的0x00~0x0f單元中。對(duì)應(yīng)單元的內(nèi)容見(jiàn)表1。
表1 16個(gè)單元內(nèi)的16個(gè)數(shù)據(jù)對(duì)照表
仿真運(yùn)行后,AT24C04C0x00~0x0f單元的數(shù)據(jù)見(jiàn)圖6。
圖6 仿真后AT24C04C中0x00~0x0f單元的數(shù)據(jù)
由此可見(jiàn),AT24C04C的0x00~0x0f單元內(nèi)的數(shù)據(jù)與預(yù)寫(xiě)入數(shù)據(jù)內(nèi)容一致,AT89C51單片機(jī)向AT24C04C內(nèi)寫(xiě)入數(shù)據(jù)仿真成功。
(二)模擬AT89C51單片機(jī)從AT24C04C內(nèi)讀出數(shù)據(jù)。將剛剛寫(xiě)入的16個(gè)數(shù)據(jù)從AT24C04C內(nèi)部讀入89C51單片機(jī)[14],并由P2.0口輸出,驅(qū)動(dòng)共陽(yáng)極的8個(gè)LED等閃爍,根據(jù)讀出數(shù)據(jù)可知,將產(chǎn)生流水燈的效果。P2口的字節(jié)地址為0xa0,當(dāng)然,也可從C51的特殊功能寄存器(SFR)內(nèi)讀該數(shù)據(jù)。如圖7、如圖8所示。
圖7 P2口輸出0x04時(shí),對(duì)應(yīng)的仿真現(xiàn)象
圖8 89C51單片機(jī)SFR的0xa0中同一時(shí)刻數(shù)據(jù)
經(jīng)過(guò)仿真驗(yàn)證,89C51單片機(jī)所讀數(shù)據(jù)與所寫(xiě)數(shù)據(jù)一致,AT89C51單片機(jī)向AT24C04C內(nèi)讀出數(shù)據(jù)仿真成功。
本文通過(guò)proteus搭建了AT89C51單片機(jī)與AT24C04C芯片進(jìn)行I2C通信的仿真電路,經(jīng)proteus仿真通信模型驗(yàn)證后,表明數(shù)據(jù)的寫(xiě)入與讀取均能順利完成。在C51系列單片機(jī)沒(méi)有I2C總線的情況下,成功模擬出I2C總線在芯片間的通信。并使用C語(yǔ)言與匯編語(yǔ)言編寫(xiě)出I2C的4種典型時(shí)序及其數(shù)據(jù)的讀寫(xiě)格式。經(jīng)驗(yàn)證,程序簡(jiǎn)潔有效。
[1]李全利.單片機(jī)原理及接口技術(shù)[M].北京:高等教育出版社,2009.
[2]李朝青.單片機(jī)原理及接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,2005.
[3]馬忠梅,等.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2007.
[4]伍馮潔.Proteus虛擬仿真技術(shù)在I2C總線通信中的應(yīng)用[J].太赫茲科學(xué)與電子信息學(xué)報(bào),2015(4):675-678.
[5]黃鑫,王玉林,謝靜.基于I2C總線的單片機(jī)系統(tǒng)設(shè)計(jì)與虛擬仿真[J].儀器儀表用戶,2010(4):44-46.
[6]劉文光,張銘銘.51單片機(jī)I2C總線接口仿真研究[J].電子制作,2012(10):1-2.
[7]張遠(yuǎn)輝,張鼎,許昌,等.基于Proteus的XY數(shù)控工作臺(tái)仿真模型設(shè)計(jì)[J].實(shí)驗(yàn)技術(shù)與管理,2015(3):133-136.
[8]趙輝,董德存.I2C總線技術(shù)及其應(yīng)用實(shí)例[J].微型電腦應(yīng)用,2005(4):61-63+66.
[9]石宗義.I2C總線時(shí)序分析及其模擬[J].太原理工大學(xué)學(xué)報(bào),2004(1):53-56.
[10]劉心紅,郭福田,孫振興,等.Proteus仿真技術(shù)在單片機(jī)教學(xué)中的應(yīng)用[J].實(shí)驗(yàn)技術(shù)與管理,2007(3):96-98+102.
[11]汪寧.Proteus軟件的單片機(jī)仿真方法[J].山東輕工業(yè)學(xué)院學(xué)報(bào)(自然科學(xué)版),2007(1):24-27.
[12]周靈彬,張靖武.PROTEUS的單片機(jī)教學(xué)與應(yīng)用仿真[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2008(1):76-79.
[13]葉建波,朱雙東.基于Proteus的單片機(jī)電路的虛擬仿真[J].電子工程師,2008(11):23-24+67.
[14]陳知紅,王錦蘭.Proteus仿真軟件在電工學(xué)中的應(yīng)用[J].實(shí)驗(yàn)技術(shù)與管理,2014(2):93-95+128.
[責(zé)任編輯 鄭麗娟]
TP273
A
2095-0438(2017)08-0151-05
2017-02-02
王九龍(1988-),男,陜西寶雞人,綏化學(xué)院電氣工程學(xué)院助教,碩士,研究方向:嵌入式開(kāi)發(fā)設(shè)計(jì)。