Tom, I am curently using this part in a project I have designed and it works great. One thing to remember though read the data sheet section on addressing as I had a problem similar to yours and it turned out to be the way they do block switching. Normally this would be done with the external address lines but this part is so big they broke it into 2 blocks. Also make sure all external address lines are tied to +5 or ground. These are the routines I wrote to use this part. I always store by page so as to avoid the accumulated write time associated with this part.
HTH
Dave Purola,
N8NTA
CNTRL_BYTE CON $A2 'CONTROL BYTE FOR I2C EEPROM MEMORY (A0 USED FOR CHIP SELECT)
'************************************************* ********************
RW_EEPROM: 'READ FROM or WRITE TO SERIAL EEPROM
'************************************************* ********************
IF BLOCK < 1023 THEN
IF READ_WRITE = 1 THEN 'WRITE 64 BYTE BLOCK TO EEPROM
IF BLOCK <> 0 THEN 'IF STARTING NEW PASS DON'T READ OLD LOCATION
READ_WRITE = 0 'SET FOR BLOCK READ
GOSUB READ_WRITE_BLK 'READ FROM SERIAL EEPROM NEXT AVAILABLE STORAGE BLOCK
READ_WRITE = 1 'SET FOR BLOCK WRITE
ENDIF
ADDRESS = BLOCK << 6 'CALCULATE 12C ADDRESS TO STORE DATA TO
CNTROL_BYTE = CNTRL_BYTE 'COPY CONTROL BYTE
CNTROL_BYTE.3 = ADDRESS.15 'SET 32K BLOCK BIT
I2CWRITE SDA,SCL,CNTROL_BYTE,ADDRESS,[STR STOR_DATA\64] 'SAVE DATA TO 12C
PAUSE 6 'ALLOW TIME FOR I2C WRITE ~5Ms.
BLOCK = BLOCK + 1 'INCREMENT FOR NEXT AVAILABLE BLOCK TO WRITE
BLOCK = BLOCK MIN 1023 'LIMIT TO 1K BLOCKS OF 64 BYTES
GOSUB READ_WRITE_BLK 'WRITE TO or READ FROM SERIAL EEPROM LAST STORAGE BLOCK
ELSE
ADDRESS = BLOCK << 6 'CALCULATE 12C ADDRESS TO STORE DATA TO
CNTROL_BYTE = CNTRL_BYTE 'COPY CONTROL BYTE
CNTROL_BYTE.3 = ADDRESS.15 'SET 32K BLOCK BIT
I2CREAD SDA,SCL,CNTROL_BYTE,ADDRESS,[STR STOR_DATA\64] 'LOAD IN ENTIRE BLOCK
ENDIF
ENDIF
RETURN
'************************************************* ********************
READ_WRITE_BLK: 'WRITE TO or READ FROM SERIAL EEPROM NEXT AVAILABLE STORAGE BLOCK
'************************************************* ********************
ADDRESS = 65534 'POINT TO LAST STORED DATA(WORD) ADDRESS
CNTROL_BYTE = CNTRL_BYTE 'COPY CONTROL BYTE
CNTROL_BYTE.3 = ADDRESS.15 'SET 32K BLOCK BIT
IF READ_WRITE = 1 THEN
I2CWRITE SDA,SCL,CNTROL_BYTE,ADDRESS,[BLOCK.LOWBYTE,BLOCK.HIGHBYTE] 'WRITE DATA POINTER TO 12C
PAUSE 6 'ALLOW TIME FOR I2C WRITE ~5Ms.
ELSE
I2CREAD SDA,SCL,CNTROL_BYTE,ADDRESS,[BLOCK.LOWBYTE,BLOCK.HIGHBYTE] 'READ DATA POINTER FROM 12C
ENDIF
RETURN
Bookmarks