|
電子小制作24C02存儲器是基于I2C總線存儲器,是一種 采用I2C總線接口進行數據存取的可擦除寫入存儲器件,廣泛應用于音視頻設備之中。早期產品如M58655、PCF8581等等,現在大多使用24系列存 儲器件,如電視機中使用的24C02、24C04、24C08等等,用來存儲電視機收看節目使用的制式、語言、工作模式及頻道數據等信息。
本文以24C02存儲器為例,介紹一下I2C總線存儲器的數據傳輸規范以及采用單片機對I2C總線存儲器進行數據復制。
圖為24C02存儲器的數據復制器電路原理圖。這種電路配合下文程序,可完成兩片存儲器N1、N2之間數據復制。程序設計以N2為讀取方,N1為寫入方,完成將存儲器N2中的數據復制到N1之中。
24C02存儲器的數據復制器電路核心采用單片機電路89S51。一個完整的微機系統必須包括處理器、內存(隨機存儲器)、ROM(程序存儲器)及輸入輸出接口這幾部分。所謂單片機就是將這幾部分集成到一塊電路中,從而形成一個完整的微機系統,可以獨立完成一些較小的程序。現在單片機電路已經很普遍了,遙控電視機中的微處理器就是一種最常見的單片機電路。單片機電路89S51內部集成了128Byte的隨機存儲器RAM、4KByte的可擦寫程序存儲器ROM、P0-P3四個雙向輸入輸出端口、一個標準的異步通訊接口,用來與電腦COM口連接,進行異步通訊。89S51并不具有標準的I2C總線通訊接口,這里僅通過軟件模擬,實現與標準I2C總線接口存儲器的數據通訊。
存儲器N2、N1與單片機89S51通過SDA、SCL兩線,共同連接在一條I2C總線之上。N1的三位芯片地址線A0、A1、A2全部接地,N2的A0地址線則與正電源相接。這樣的連接可以為兩片同樣型號的存儲器設置了不同的芯片地址,這樣單片機就能通過芯片地址的不同對同一總線上的兩塊存儲器分別進行讀寫操作了。存儲器N1、N2與電路的連接,采用插座方式。按放、拿取存儲器電路時,需要使用開關“SW”將電源切斷,保證斷電操作。“復制”按鍵負責控制程序的運行。
連接好電路之后,接通電源,按動“復制”鍵,程序進入執行,單片機依次讀取N2中的數據,并將數據寫入到N1中,在這同時還將讀寫數據送入P0接口,通過P0接口的八只發光管顯示出來。數據復制完成后,發光管熄滅。
24C02存儲器的數據復制器源程序
;==============================
sda EQU p2.0
scl EQU p2.1
address EQU 08H
i2cdate EQU 09H
sbit p37=p3^7
sbit p36=p3^6
org 0000H
ljmp start
;======================== 存儲器寫
i2c_write:
i2c_write_a:
lcall i2c_start
mov a,r6
lcall i2c_send
lcall i2c_ack
Jc i2c_write_a
mov a,address
lcall i2c_send
lcall i2c_ack
mov a,i2cdate
lcall i2c_send
lcall i2c_ack
lcall i2c_stop
ret
;========================存儲器讀
i2c_read:
i2c_read_a:
lcall i2c_start
mov a,r2
lcall i2c_send
lcall i2c_ack
Jc i2c_read_a
mov a,address
lcall i2c_send
lcall i2c_ack
i2c_read_b:
lcall i2c_start
mov a,r4
lcall i2c_send
lcall i2c_ack
Jc i2c_read_b
i2c_rece:
lcall i2c_receive
mov i2cdate,a
lcall i2c_ack
lcall i2c_stop
ret
;=======================總線啟動
i2c_start:
setb scl
setb sda
nop
nop
clr sda
nop
nop
clr scl
ret
;=======================總線停止
i2c_stop:
clr sda
nop
nop
setb scl
nop
nop
setb sda
ret
;======================存儲器應答
i2c_ack:
setb sda
nop
nop
setb scl
Jb sda,i2c_ack0
clr c
sjmp i2c_ack_end
i2c_ack0:
setb c
i2c_ack_end:
nop
nop
clr scl
ret
;=====================發送八位數據
i2c_send:
mov b,#08H
i2c_send1:
rlc a
mov sda,c
setb scl
nop
nop
clr scl
djnz b,i2c_send1
ret
;====================接收八位數據
i2c_receive:
mov b,#08H
clr a
setb sda
i2c_receive_a:
setb scl
nop
nop
mov c,sda
rlc a
clr scl
djnz b,i2c_receive_a
ret
;=======================延時程序
delay:
mov r1,#255
djnz r1,$
ret
;===============256字節數據復制程序
copy:
mov r5,#0
s:
mov r2,#10100010b
mov r4,#10100011b
call i2c_read
mov i2cdate,a
mov p0,a
mov r6,#10100000b
call i2c_write
inc address
djnz r5, s
mov p0,#255
ret
;=========================主程序
start:
mov SP,#60H
mov p0,#255
mov p1,#255
mov p2,#255
mov p3,#255
mov address,#00H
wai:
jb p37,$
call delay
jnb p37,$
call copy
ljmp wai
end
使用Keil軟件對24C02存儲器的數據復制器源程序進行編譯,并寫入AT89S51之中,就可以對24C02存儲芯片進行復制了。對匯編程序進行相應改動,還可以適應所有24系列存儲器之間的數據復制。
|
|