ESP32 - Read EEPROM Size
The EEPROM is one type of Non-Volatile Memories(NVM), which means the data stored in it doesn’t get lost even after the board is turned off.
The ESP32 microcontroller has a Flash memory area that can be interfaced with Arduino EEPROM libraries using a sector (4 kilobytes) of flash memory. The total flash memory size for most of the modules is 4MB, but some board will have 8MB or 16 MB
Step 1: Connect Board to Laptop
Step 2: ESP32 EEPROM size Example Code
Select boar ESP32 DEV Module from Tools >> Boards menu, then select appropriate com port. Upload this program to ESP32.
#include <Wire.h>
#define I2C_SDA_PIN 23
#define I2C_SCL_PIN 19
void eepromSize() {
Serial.println("Discovering eeprom sizes 0x50..0x57");
uint8_t adr = 0x50, i;
uint16_t size;
char buf[64];
while (adr < 0x58) {
i = 0;
size = 0x1000; // Start at 4k
i += sprintf_P(&buf[i], PSTR("0x%02X: "), adr);
if (i2cReady(adr)) { // EEPROM success
uint8_t zeroByte;
Wire.beginTransmission(adr);
Wire.write((uint8_t)0);
Wire.write((uint8_t)0);
uint8_t err = Wire.endTransmission();
if (err == 0) { // no error
err = Wire.requestFrom(adr, (uint8_t)1);
if (err == 1) { // got the value of the byte at address 0
zeroByte = Wire.read();
uint8_t saveByte, testByte;
do {
if (i2cReady(adr)) {
Wire.beginTransmission(adr);
Wire.write(highByte(size));
Wire.write(lowByte(size));
Wire.endTransmission();
err = Wire.requestFrom(adr, (uint8_t)1);
if (err == 1) {
saveByte = Wire.read();
Wire.beginTransmission(adr);
Wire.write(highByte(size));
Wire.write(lowByte(size));
Wire.write((uint8_t)~zeroByte);
err = Wire.endTransmission();
if (err == 0) {
if (!i2cReady(adr)) {
i += sprintf_P(&buf[i], PSTR(" notReady.\n"));
Serial.print(buf);
adr++;
break;
}
Wire.beginTransmission(adr);
Wire.write((uint8_t)0);
Wire.write((uint8_t)0);
err = Wire.endTransmission();
if (err == 0) {
err = Wire.requestFrom(adr, (uint8_t)1);
if (err == 1) {
testByte = Wire.read();
} else {
testByte = ~zeroByte;
}
} else {
testByte = ~zeroByte;
}
} else {
testByte = ~zeroByte;
}
if (!i2cReady(adr)) {
i += sprintf_P(&buf[i], PSTR(" notReady.\n"));
Serial.print(buf);
adr++;
break;
}
Wire.beginTransmission(adr);
Wire.write(highByte(size));
Wire.write(lowByte(size));
Wire.write((uint8_t)saveByte);
Wire.endTransmission();
} else testByte = ~zeroByte;
} else testByte = ~zeroByte;
if (testByte == zeroByte) {
size = size << 1;
}
} while ((testByte == zeroByte) && (size > 0));
if (size == 0) {
i += sprintf_P(&buf[i], PSTR("64k Bytes"));
} else {
i += sprintf_P(&buf[i], PSTR("%dk Bytes"), size / 1024);
}
if (!i2cReady(adr)) {
i += sprintf_P(&buf[i], PSTR(" notReady3.\n"));
Serial.print(buf);
adr++;
continue;
}
Wire.beginTransmission(adr);
Wire.write((uint8_t)0);
Wire.write((uint8_t)0);
Wire.write(zeroByte);
err = Wire.endTransmission();
} else i += sprintf_P(&buf[i], PSTR("Read 0 Failure"));
} else i += sprintf_P(&buf[i], PSTR("Write Adr 0 Failure"));
} else i += sprintf_P(&buf[i], PSTR("Not Present."));
Serial.println(buf);
adr++;
}
}
bool i2cReady(uint8_t adr) {
uint32_t timeout = millis();
bool ready = false;
while ((millis() - timeout < 100) && (!ready)) {
Wire.beginTransmission(adr);
ready = (Wire.endTransmission() == 0);
}
return ready;
}
void setup() {
Serial.begin(115200);
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); //sda - 23, scl - 19
Serial.println("EEPROM size");
eepromSize();
}
void loop() {}