[fpc-pascal] FPC/Lazarus on RPi4 - How to read/write I2C connected EEPROM?

Bo Berglund bo.berglund at gmail.com
Mon Apr 3 20:58:28 CEST 2023

On Mon, 03 Apr 2023 20:55:43 +0200, Bo Berglund via fpc-pascal >On Mon, 3 Apr
2023 14:26:17 -0400, "Jeffrey A. Wormsley via fpc-pascal"
><fpc-pascal at lists.freepascal.org> wrote:
>>I've been using i2c and SPI eeproms for almost two decades.  All of them
>>can read/write a single byte if that's what you want to do, but the
>>write/erase restrictions I noted are there for any parts I've ever used.
>>If you write a byte to $00, you cannot write it to $01 without first
>>erasing the entire block that it is located in (usually 128 to 256 bytes).
>>You can write $FF to $F0, then $F0 to $80, then $80 to $00, as these all
>>only involve turning 1 bits into 0 bits, but if you try to write from a $00
>>to a $01, then it will not work, at least not on any part I've ever used,
>>as that involves turning a 0 bit into a 1 bit.   All of the parts I've
>>seen, if you want to modify a single memory location (if the write involves
>>turning a 0 bit into a 1 bit), they require you to read the block of data
>>into your CPU, modify it there, erase the block, then write the entire
>>block data back into the chip.  I've seen some parts that have an on-chip
>>RAM buffer that would let you read the block into this RAM buffer with one
>>command, modify the RAM buffer with a single byte write, erase the block,
>>then write the RAM buffer back to the chip, which is a lot faster than
>>having to do this yourself with your CPU memory, but it still required the
>>block erase and that block erase still counted towards your maximum number
>>of erase cycles.  I have not seen a chip that allowed completely random
>>writes at the byte level before short of a static ram with battery backup.
>>If you have an i2c part that doesn't work like this, then I would be very
>>interested in knowing the part number and seeing a link to the data sheet.
>>Such a part would make using these sorts of devices much easier, but to
>>date I have never seen one.
>I just tested by writing four 0x00 bytes in a row, then verifying that the
>memory read shows these, then writing other data and again verifying that the
>data is there.
>All using the i2c-tools commands:
>$ i2ctransfer -y 1 w6 at 0x50 0x00 0x00 0x00 0x00 0x00 0x00
>$ i2ctransfer -y 1 w2 at 0x50 0x00 0x00 r8 at 0x50
>0x00 0x00 0x00 0x00 0xff 0xff 0xff 0xff
>$ i2ctransfer -y 1 w6 at 0x50 0x00 0x00 0x70 0x30 0x55 0x40
>$ i2ctransfer -y 1 w2 at 0x50 0x00 0x00 r8 at 0x50
>0x70 0x30 0x55 0x40 0xff 0xff 0xff 0xff
>The part number is: CAT24C32 by ON Semiconductor (www.onsemi.com)
>It is a 128 kbit (16 kbyte) part organized as 64 pages of 256 bytes.

Sorry copied from the wrong datasheet here, should be CAT24C128

Bo Berglund
Developer in Sweden

More information about the fpc-pascal mailing list