http://github.com/JChristensen/JC_EEPROM
README file
Arduino EEPROM Library Copyright (C) 2022 Jack Christensen GNU GPL v3.0
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/gpl.html
Arduino EEPROM Library
This library will work with most I2C serial EEPROM chips between 2k bits and 2048k bits (2M bits) in size. Multiple EEPROMs on the bus are supported as a single address space. I/O across block, page and device boundaries is supported. Certain assumptions are made regarding the EEPROM device addressing. These assumptions should be true for most EEPROMs but there are exceptions, so read the datasheet and know your hardware.
The library should also work for EEPROMs smaller than 2k bits, assuming that there is only one EEPROM on the bus and also that the user is careful to not exceed the maximum address for the EEPROM.
The JC_EEPROM Library has been tested with:
- Microchip 24AA02E48 (2k bit)
- 24xx32 (32k bit, thanks to Richard M)
- Microchip 24LC256 (256k bit)
- Microchip 24FC1026 (1M bit, thanks to Gabriele B on the Arduino forum)
- ST Micro M24M02 (2M bit)
- Atmel AT24C256C (thanks to searobin)
- Microchip 24C16B, 24C32 (thanks to Diogko)
- Microchip AT24C02 and ST Micro M24C04-W with ESP-12F/ESP8266 (thanks to Thorsten)
The JC_EEPROM Library will NOT work with Microchip 24xx1025 as its control byte does not conform to the following assumptions.
Device addressing assumptions:
- The I2C address sequence consists of a control byte followed by one address byte (for EEPROMs <= 16k bits) or two address bytes (for EEPROMs > 16k bits).
- The three least-significant bits in the control byte (excluding the R/W bit) comprise the three most-significant bits for the entire address space, i.e. all chips on the bus. As such, these may be chip-select bits or block-select bits (for individual chips that have an internal block organization), or a combination of both (in which case the block-select bits must be of lesser significance than the chip-select bits).
- Regardless of the number of bits needed to address the entire address space, the three most-significant bits always go in the control byte. Depending on EEPROM device size, this may result in one or more of the most significant bits in the I2C address bytes being unused (or "don't care" bits).
- An EEPROM contains an integral number of pages.
Note that the Arduino Wire library has a buffer size of 32 bytes. This limits the size of physical I/Os that can be done to EEPROM. For writes, one or two bytes are used for the address, so writing is therefore limited to 31 or 30 bytes. Because the JC_EEPROM Library will handle I/O across block, page and device boundaries, the only consequence this has for the user is one of efficiency; arbitrarily large blocks of data can be written and read; however, carefully chosen block sizes may reduce the number of physical I/Os needed.
The library can be installed using the Arduino Library Manager. To install manually:
- Go to http://github.com/JChristensen/JC_EEPROM, click Code > Download ZIP and save the ZIP file to a convenient location on your PC.
- Uncompress the downloaded file. This will result in a folder containing all the files for the library, that has a name that includes the branch name, usually JC_EEPROM-master.
- Rename the folder to just JC_EEPROM.
- Copy the renamed folder to the Arduino sketchbook/libraries folder.
The following example sketch is included with the JC_EEPROM Library:
- eepromTest: Writes 32-bit integers to the entire EEPROM address space, starting at address 0 and continuing to the topmost address. These are then read back in and verified; any discrepancies are reported to the serial monitor.
- struct: Demonstrates writing a
struct
to EEPROM and reading it back.
EEPROM device size in k-bits. Many manufacturers' EEPROM part numbers are designated in k-bits.
- JC_EEPROM::kbits_2
- JC_EEPROM::kbits_4
- JC_EEPROM::kbits_8
- JC_EEPROM::kbits_16
- JC_EEPROM::kbits_32
- JC_EEPROM::kbits_64
- JC_EEPROM::kbits_128
- JC_EEPROM::kbits_256
- JC_EEPROM::kbits_512
- JC_EEPROM::kbits_1024
- JC_EEPROM::kbits_2048
I2C bus speed.
- JC_EEPROM::twiClock100kHz
- JC_EEPROM::twiClock400kHz
Instantiates an external EEPROM object.
JC_EEPROM myEEPROM(eeprom_size_t devCap, uint8_t nDev, uint16_t pgSize, uint8_t busAddr));
devCap (eeprom_size_t): The size of one EEPROM device in k-bits. Choose a value from the eeprom_size_t enumeration above.
nDev (uint8_t): The number of EEPROM devices on the bus. Note that if there are multiple EEPROM devices on the bus, they must be identical and each must have its address pins strapped properly.
pgSize (uint16_t): The EEPROM page size in bytes. Consult the datasheet if you are unsure of the page size.
busAddr (uint8_t): The base I2C bus address for the EEPROM(s). 0x50 is a common value and this parameter can be omitted, in which case 0x50 will be used as the default.
JC_EEPROM myEEPROM(kbits_256, 2, 64); //two 24LC256 EEPROMS on the bus
JC_EEPROM oddEEPROM(kbits_8, 1, 16, 0x42); //an EEPROM with a non-standard I2C address