Organized as 1 block of 256 bytes (1 x 256 x 8)

100 kHz (24AA02) and 400 kHz (24LC02B) compatibility

Device Address : Read = 0xA1, Write = 0xA0

這顆比較小, A0~A2接腳可以Don't care.

WP接地就可以正常寫入.

寫的部分一次一個Page, 這顆ROM是8 Bytes 一個page, 也就是說寫的時候不能跨Page

例如 : 2開始寫只能寫到7, 然後要給一個Stop才會真正寫入.

 再重送Device Address (Call WaitI2CRespond)直到他有ACK之後才能重新下Write的指令, 然後從位址8開始繼續寫8 bytes.

 

使用eAlpha AM8EC720

;-------------[WaitI2CRespond]------------------

WaitI2CRespond:
lcall DelayPer100Us
lcall I2C_Start
movia 0xA0
movar I2CData
lcall I2C_SEND_BYTE
lcall I2C_Stop
btrss SystemFlag,2
lgoto WaitI2CRespond
ret

/*****************************************************/
/* I2C */
/*****************************************************/
;-------------[I2C_Start]------------------
I2C_Start:
lcall Set_SDA_OUT ;Set SDA as Output
bsr I2C,SDA
bsr I2C,SCL
lcall Delay_I2C_100K
bcr I2C,SDA
lcall Delay_I2C_100K
bcr I2C,SCL
lcall Delay_I2C_100K
ret

;-------------[I2C_Stop]------------------
I2C_Stop:
lcall Set_SDA_OUT ;Set SDA as Output
bcr I2C,SDA
lcall Delay_I2C_100K
bsr I2C,SCL
lcall Delay_I2C_100K
bsr I2C,SDA
lcall Delay_I2C_100K
ret

;-------------[I2C_SEND_BYTE]------------------
I2C_SEND_BYTE:
lcall Set_SDA_OUT ;Set SDA as Output
movia 8
movar Counter_Tx
lcall Delay_I2C_400K
I2C_SEND_BYTE_1:
btrsc I2CData,7
bsr I2C,SDA
btrss I2CData,7
bcr I2C,SDA
lcall Delay_I2C_400K
bsr I2C,SCL ;SCL high
lcall Delay_I2C_400K
bcr I2C,SCL ;SCL low
rlr I2CData,R
decrsz Counter_Tx,R
lgoto I2C_SEND_BYTE_1

bsr I2C,SDA
lcall Set_SDA_IN

lcall Delay_I2C_400K
bsr I2C,SCL ;SCL high
lcall Delay_I2C_400K
btrsc I2C,SDA
bcr SystemFlag,2 ;ACK bit flag
btrss I2C,SDA
bsr SystemFlag,2 ;ACK bit flag
bcr I2C,SCL ;SCL low
lcall Delay_I2C_400K

ret

;-------------[I2C_READ_BYTE]------------------
I2C_READ_BYTE:
lcall Set_SDA_IN ;Set SDA as Input
movia 8
movar Counter_Tx
I2C_READ_BYTE_1:
bsr I2C,SCL ;Pull High I2C_CLK for wait data.
lcall Delay_I2C_400K
rlr I2CData,R
btrsc I2C,SDA ;Check I2C_DATA bit state.
bsr I2CData,0 ;If the bit of I2C_DATA was High that set the bit0 of BUFFER to 1.
btrss I2C,SDA ;Check I2C_DATA bit state again.
bcr I2CData,0 ;If the bit of I2C_DATA was low that set the bit0 of BUFFER to 0.
lcall Delay_I2C_400K
bcr I2C,SCL ;Pull Low I2C_CLK for successful catch data.
lcall Delay_I2C_400K
decrsz Counter_Tx,R
lgoto I2C_READ_BYTE_1
;-----------Below as prepare that send a Acknowledgement
btrss SystemFlag,2
ret
lcall Set_SDA_OUT ;Set SDA as Output
bcr I2C,SDA
lcall Delay_I2C_400K
bsr I2C,SCL
lcall Delay_I2C_400K
bcr I2C,SCL
lcall Delay_I2C_400K
ret

Set_SDA_OUT:
bsr Status,5
bcr I2C,SDA ;Set SDA as output
bcr Status,5
ret

Set_SDA_IN:
bsr Status,5
bsr I2C,SDA ;Set SDA as Input
bcr Status,5
ret

相关文章