SEEPROM 寫入數(shù)據(jù)傳送格式如下:
START | 從地址 | 0 | A | 地址字節(jié) | A | 數(shù)據(jù)字節(jié)1 | A | … | 數(shù)據(jù)字節(jié)N | A | STOP |
A為從設(shè)備的確認(rèn)位。
SEEPROM 讀出數(shù)據(jù)傳送格式如下:(A為確認(rèn)位。)
START | 從地址 | 0 | A | 地址字節(jié) | A | START | 從地址 | 1 | A | 數(shù)據(jù)字節(jié) | A | 。。。 | 最后字節(jié) | STOP |
圖 5.10 程序流程圖
3.參考例程
;*****************************************************************************
;** EM78單片機(jī)與24Cxx / 85Cxx 串行CMOS EEPROM接口I2C總線讀/寫的程序
;** (所有時隙均基于2MHZ晶體震蕩器頻率)
;*****************************************************************************
; 存儲器定義
PC EQU 2 ; Program counter
STAT EQU 3 ; EM78 status byte
FSR EQU 4 ; RAM 選擇寄存器
P5 EQU 5 ; Port A use to select device address
P6 EQU 6 ; P6.7 = SDA, P6.6 = SCL
;
STATUS EQU 08 ; Status register
FLAG EQU 09 ; Common flag bits register
EEPROM EQU 0A ; Bit buffer
ERCODE EQU 0B ; Error code (to indicate bus status)
ADDR EQU 10 &, nbsp; ; Address register
DATAI EQU 11 ; Stored data input register
DATAO EQU 12 ; Stored data output register
SLAVE EQU 13 ; Device address (1010xxx0)
TXBUF EQU 14 ; TX buffer
RXBUF EQU 15 ; RX buffer
COUNT EQU 16 , ; Bit counter
TIMER0 EQU 18 ; Delay timer0
TIMER1 EQU 19 ; Delay timer1
;-----------------------------------------------------------------------------
; 位定義
; Status bits
Z EQU 2
C EQU 0
; FLAG Bits
ERROR EQU 0 ; Error flag
; EEPROM Bits
DI EQU 7 ; EEPROM input
DO EQU 6 ; EEPROM output
; I2C Device Bits
SDA EQU 7 ; P6.7, data in/out
SCL EQU 6 ; P6.6, serial clock
;-----------------------------------------------------------------------------
; 兩線I2C - CPU 通信錯誤狀態(tài)表和子程序
; input : W-reg = error code
; output : ERCODE = error code
; FLAG(ERROR) = 1
; code error status mode
; ------- ------------------------------------------------------
; 1 : SCL locked low by device (bus is still busy)
; 2 : SDA locked low by device (bus is still busy)
; 3 : No acknowledge from device (no handshake)
; 4 : SDA bus not released for master to generate STOP bit
;-----------------------------------------------------------------------------
org 0x0000
JMP start
;按照錯誤狀態(tài)表識別SCL狀態(tài)和SDA數(shù)據(jù)子程序
ERR
JBS FLAG,ERROR ; Remain as first error encountered
MOV ERCODE,A ; Save error code
BS FLAG,ERROR ; Set error flag
RET
;-----------------------------------------------------------------------------
; 啟動總線通信程序
; input : none
; output : initialize bus communication
;-----------------------------------------------------------------------------
;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.
BSTART
MOV A,@B'00111111' ; Put SCL, SDA line in output state
IOW P6
bs P6,SDA ;make sure sda is high
BS P6,SCL ; Set clock high
MOV A,@1 ; Ready error status code 1
JBS P6,SCL ; Locked?
CALL ERR ; SCL locked low by device
BC P6,SDA ; SDA goes low during SCL high
NOP ; Timing adjustment
NOP
NOP
BC P6,SCL ; Start clock train
RET
;-----------------------------------------------------------------------------
; 啟動總線通信程序
; Input : None
; Output : Bus communication, STOP condition
;-----------------------------------------------------------------------------
;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.
BSTOP
MOV A,@B'00111111' ; Put SCL, SDA line in output state
IOW P6
BC P6,SDA ; Return SDA to low
BS P6,SCL ; Set SCL high
nop
nop
MOV A,@1 ; Ready error code 1
JBS P6,SCL ; High?
CALL ERR ; No, SCL locked low by device
BS P6,SDA ; SDA goes from low to high during SCL high
MOV A,@4 ; Ready error code 4
JBS P6,SDA ; High?
CALL ERR ; No, SDA bus not release for STOP
RET
END SUB
;-----------------------------------------------------------------------------
; 從EM78 發(fā)送數(shù)據(jù)到串行EEPROM, 一位一位子程序
; Input : None
; Output : To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
BITIN
MOV A,@B'10111111' ; Force SDA line as input
IOW P6
BS P6,SDA ; Set SDA for input
BC EEPROM,DI
BS P6,SCL ; Clock high
MOV A,@1
JBS P6,SCL ; Skip if SCL is high
JMP BIT1
JBS FLAG,ERROR ; Remain as first error encountered
MOV ERCODE,A ; Save error code
BS FLAG,ERROR ; Set error flag
BIT1
JBC P6,SDA ; Read SDA pin
BS EEPROM,DI ; DI = 1
NOP ; Delay
BC P6,SCL ; Return SCL to low
RET
;-----------------------------------------------------------------------------
; 從串行EEPROM 接收數(shù)據(jù), 一位一位子程序
; Input : EEPROM file
; Output : From (DO) of serial EEPROM device to PIC
;-----------------------------------------------------------------------------
BITOUT
MOV A,@B'00111111' ; Set SDA, SCL as outputs
IOW P6
JBS EEPROM,DO
JMP BIT0
BS P6,SDA ; Output bit 0
MOV A,@2
JBC P6,SDA ; Check for error code 2
JMP CLK1
JBS FLAG,ERROR ; Remain as first error encountered
MOV ERCODE,A ; Save error code
BS FLAG,ERROR ; Set error flag
JMP CLK1 ; SDA locked low by device
BIT0
BC P6,SDA ; Output bit 0
NOP ; Delay
NOP
NOP
CLK1: BS P6,SCL
MOV A,@1 ; Error code 1
JBC P6,SCL ; SCL locked low?
JMP BIT2 ; No.
JBS FLAG,ERROR ; Yes.
MOV ERCODE,A ; Save error code
BS FLAG,ERROR ; Set error flag
BIT2: NOP
NOP
BC P6,SCL ; Return SCL to low
RET