|
摘要:在單片機(jī)系統(tǒng)中廣泛使用E2PROM作為數(shù)據(jù)存儲(chǔ)器。本文簡(jiǎn)要介紹了I2C總線及AT24C系列串行E2PROM,給出了8031單片機(jī)與串行E2PROM通訊的硬軟件實(shí)現(xiàn)方法和實(shí)用的讀/寫(xiě)子程序。
關(guān)鍵詞:?jiǎn)纹瑱C(jī);I2C總線; E2PROM
1 I2C總線簡(jiǎn)介
I2C總線是一種串行數(shù)據(jù)總線,只有二根信號(hào)線,一根是雙向的數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。在 I2C總線上傳送的一個(gè)數(shù)據(jù)字節(jié)由八位組成?偩對(duì)每次傳送的字節(jié)數(shù)沒(méi)有限制,但每個(gè)字節(jié)后必須跟一位應(yīng)答位。數(shù)據(jù)傳送首先傳送最高位(MSB),數(shù)據(jù)傳送按圖1所示格式進(jìn)行。首先由主機(jī)發(fā)出啟動(dòng)信號(hào)“S”(SDA在SCL高電平期間由高電平跳變?yōu)榈碗娖?,然后由主機(jī)發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。啟動(dòng)信號(hào)后的第一個(gè)字節(jié)數(shù)據(jù)具有特殊含義:高七位是從機(jī)的地址,第八位是傳送方向位,0表示主機(jī)發(fā)送數(shù)據(jù)(寫(xiě)),1表示主機(jī)接收數(shù)據(jù)(讀)。被尋址到的從機(jī)設(shè)備按傳送方向位設(shè)置為對(duì)應(yīng)工作方式。標(biāo)準(zhǔn)I2C總線的設(shè)備都有一個(gè)七位地址,所有連接在I2C總線上的設(shè)備都接收啟動(dòng)信號(hào)后的第一個(gè)字節(jié),并將接收到的地址與自己的地址進(jìn)行比較,如果地址相符則為主機(jī)要尋訪的從機(jī),應(yīng)在第九位答時(shí)鐘脈沖時(shí)向SDA線送出低電平作為應(yīng)答。除了第一字節(jié)是通用呼叫地址或十位從機(jī)地址之外(詳細(xì)內(nèi)容見(jiàn)[1]),第二字節(jié)開(kāi)始即數(shù)據(jù)字節(jié)。數(shù)據(jù)傳送完畢,由主機(jī)發(fā)出停止信號(hào)“P”(SDA在SCL高電平期間由低電平跳變?yōu)楦唠娖?。
AT24C系列串行E2PROM具有I2C總線接口功能,功耗小,寬電源電壓(根據(jù)不同型號(hào)2.5V~6.0V),工作電流約為3mA,靜態(tài)電流隨電源電壓不同為30μA~110μA,存儲(chǔ)容量見(jiàn)表1。
(1) AT24C系列 E2PROM接口及地址選擇
由于I2C總線可掛接多個(gè)串行接口器件,在I2C總線中每個(gè)器件應(yīng)有唯一的器件地址,按I2C總線規(guī)則,器件地址為7位數(shù)據(jù)(即一個(gè)I2C總線系統(tǒng)中理論上可掛接128個(gè)不同地址的器件),它和1位數(shù)據(jù)方向位構(gòu)成一個(gè)器件尋址字節(jié),最低位D0為方向位(讀/寫(xiě))。器件尋址字節(jié)中的最高4位(D7~D4)為器件型號(hào)地址,不同的I2C總線接口器件的型號(hào)地址是廠家給定的,如AT24C系列E2PROM的型號(hào)地址皆為1010,器件地址中的低3位為引腳地址A2A1A0,對(duì)應(yīng)器件尋址字節(jié)中的D3、D2、D1位,在硬件設(shè)計(jì)時(shí)由連接的引腳電平給定。
對(duì)于E2PROM的片內(nèi)地址,容量小于256字節(jié)的芯片(AT24C01/02),8位片內(nèi)尋址(A0~A7)即可滿足要求。然而對(duì)于容量大于256字節(jié)的芯片,則8位片內(nèi)尋址范圍不夠,如AT24C16,相應(yīng)的尋址位數(shù)應(yīng)為11位(211=2048)。若以256字節(jié)為1頁(yè),則多于8位的尋址視為頁(yè)面尋址。在AT24C系列中對(duì)頁(yè)面尋址位采取占用器件引腳地址(A2、A1、A0)的辦法,如AT24C16將A2、A1、A0作為頁(yè)地址。凡在系統(tǒng)中引腳地址用作頁(yè)地址后,該引腳在電路中不得使用,作懸空處理。AT24C系列串行E2PROM的器件地址尋址字節(jié)如表1所示,表中P0P1P2表示頁(yè)面尋址位。
(2) AT24C系列 E2PROM讀寫(xiě)操作
對(duì)AT24C系列 E2PROM的讀寫(xiě)操作完全遵守I2C總線的主收從發(fā)和主發(fā)從收的規(guī)則。
連續(xù)寫(xiě)操作 連續(xù)寫(xiě)操作是對(duì)E2PROM連續(xù)裝載n個(gè)字節(jié)數(shù)據(jù)的寫(xiě)入操作,n隨型號(hào)不同而不同,一次可裝載字節(jié)數(shù)見(jiàn)表1。SDA線上連續(xù)寫(xiě)操作數(shù)據(jù)狀態(tài)如圖2。
器件地址(寫(xiě)) 片內(nèi)地址 ≤ n個(gè)字節(jié)數(shù)據(jù)
圖2 SDA線連續(xù)寫(xiě)操作數(shù)據(jù)狀態(tài)
AT24C系列片內(nèi)地址在接收到每一個(gè)數(shù)據(jù)字節(jié)地址后自動(dòng)加1,故裝載一頁(yè)以?xún)?nèi)規(guī)定數(shù)據(jù)字節(jié)時(shí),只須輸入首地址,若裝載字節(jié)多于規(guī)定的最多字節(jié)數(shù),數(shù)據(jù)地址將“上卷”,前面的數(shù)據(jù)被覆蓋。
連續(xù)讀操作 連續(xù)讀操作時(shí)為了指定首地址,需要兩個(gè)偽字節(jié)寫(xiě)來(lái)給定器件地址和片內(nèi)地址,重復(fù)一次啟動(dòng)信號(hào)和器件地址(讀),就可讀出該地址的數(shù)據(jù)。由于偽字節(jié)寫(xiě)中并未執(zhí)行寫(xiě)操作,地址沒(méi)有加1。以后每讀取一個(gè)字節(jié),地址自動(dòng)加1。 在讀操作中接收器接收到最后一個(gè)數(shù)據(jù)字節(jié)后不返回肯定應(yīng)答(保持SDA高電平)隨后發(fā)停止信號(hào)。連續(xù)讀操作SDA上數(shù)據(jù)狀態(tài)如圖3。
器件尋址(寫(xiě)) 片內(nèi)地址 器件尋址(讀)讀出數(shù)據(jù)
圖3 SDA線連續(xù)讀操作數(shù)據(jù)狀態(tài)
3 8031單片機(jī)與AT24C系列 E2PROM通訊的硬軟件實(shí)現(xiàn)
(1)硬件電路
圖4是用8031P1口模擬I2C總線與E2PROM連接電路圖(以AT24C16為例),由于AT24C16是漏極開(kāi)路,圖中R1、R2為上拉電阻(5.1k)。A0~A2地址引腳、TEST測(cè)試腳均懸空。
圖4 8031P1口與E2PROM連接電路圖
(2)軟件實(shí)現(xiàn)
由前述分析和圖4的硬件電路,我們編制了E2PROM的讀寫(xiě)子程序。兩者的主要區(qū)別在于讀子程序需發(fā)器件地址(寫(xiě))和片內(nèi)地址作為偽字節(jié),之后再發(fā)一次開(kāi)始信號(hào)和器件地址(讀命令)。
讀寫(xiě)子程序如下:
;寫(xiě)串行E2PROM子程序EEPW
; (R3)=器件地址
; (R4)=片內(nèi)字節(jié)地址
; (R1)=欲寫(xiě)數(shù)據(jù)存放地址指針
; (R7)=連續(xù)寫(xiě)字節(jié)數(shù)n
EEPW: MOV P1,#0FFH
CLR P1.0 ;發(fā)開(kāi)始信號(hào)
MOV A,R3 ;送器件地址
ACALL SUBS
MOV A,R4 ;送片內(nèi)字節(jié)地址
ACALL SUBS
AGAIN: MOV A,@R1
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序INC R1
DJNZ R7,AGAIN;連續(xù)寫(xiě)n個(gè)字節(jié)
CLR P1.0 ;SDA置0, 準(zhǔn)備送停止信號(hào)
ACALL DELAY ;延時(shí)以滿足傳輸速率要求
SETB P1.1 ;發(fā)停止信號(hào)
ACALL DELAY
SETB P1.0
RET
SUBS: MOV R0,#08H ;發(fā)送單字節(jié)子程序
LOOP: CLR P1.1
RLC A
MOV P1.0,C
NOP
SETB P1.1
ACALL DELAY
DJNZ R0,LOOP ;循環(huán)8次送8個(gè)bit
CLR P1.1
ACALL DELAY
SETB P1.1
REP: MOV C,P1.0
JC REP ;判應(yīng)答到否,未到則等待
CLR P1.1
RET
DELAY: NOP
NOP
RET
;讀串行E2PROM子程序EEPR
;(R1)=欲讀數(shù)據(jù)存放地址指針
;(R3)=器件地址
;(R4)=片內(nèi)字節(jié)地址
;(R7)=連續(xù)讀字節(jié)數(shù)
EEPR: MOV P1,#0FFH
CLR P1.0 ;發(fā)開(kāi)始信號(hào)
MOV A,R3 ;送器件地址
ACALL SUBS ;調(diào)發(fā)送單字節(jié)子程序
MOV A,R4 ;送片內(nèi)字節(jié)地址
ACALL SUBS
MOV P1,#0FFH
CLR P1.0 ;再發(fā)開(kāi)始信號(hào)
MOV A,R3
SETB ACC.0 ;發(fā)讀命令
ACALL SUBS
MORE: ACALL SUBR
MOV @R1,A
INC R1
DJNZ R7,MORE
CLR P1.0
ACALL DELAY
SETB P1.1
ACALL DELAY
SETB P1.0 ;送停止信號(hào)
RET
SUBR: MOV R0,#08H ;接受單字節(jié)子程序
LOOP2: SETB P1.1
ACALL DELAY
MOV C,P1.0
RLC A
CLR P1.1
ACALL DELAY
DJNZ R0,LOOP2
CJNE R7,#01H,LOW
SETB P1.0 ;若是最后一個(gè)字節(jié)置A=1
AJMP SETOK
LOW: CLR P1.0 ;否則置A=0
SETOK: ACALL DELAY
SETB P1.1
ACALL DELAY
CLR P1.1
ACALL DELAY
SETB P1.0 ;應(yīng)答畢,SDA置1
RET
程序中多處調(diào)用了DELAY子程序(僅兩條NOP指令),這是為了滿足I2C總線上數(shù)據(jù)傳送速率的要求,只有當(dāng)SDA數(shù)據(jù)線上的數(shù)據(jù)穩(wěn)定下來(lái)之后才能進(jìn)行讀寫(xiě)(即SCL線發(fā)出正脈沖)。另外,在讀最后一數(shù)據(jù)字節(jié)時(shí),置應(yīng)答信號(hào)為“1”,表示讀操作即將完成。
小結(jié)
在測(cè)量?jī)x器中使用E2PROM保存數(shù)據(jù),這是儀器具有校準(zhǔn)、標(biāo)定功能的基本條件。8031單片機(jī)與串行E2PROM的結(jié)合滿足了這一要求,這種方法電路簡(jiǎn)單、編程方便。E2PROM讀寫(xiě)數(shù)據(jù)安全可靠保證了在測(cè)量過(guò)程中數(shù)據(jù)穩(wěn)定。我們?cè)谘兄茢?shù)種測(cè)量?jī)x器中均使用此法,效果很好。 |