Диагностика: печатать сектор EEPROM и границы FS против физического флеша

commit() возвращает false, то есть падает сам вызов SDK
(spi_flash_erase_sector либо spi_flash_write). Самая вероятная причина —
сектор EEPROM за пределами физической микросхемы.

При раскладке 4MB/FS:2MB сектор EEPROM это 1019 (смещение 0x3FB000), что
требует чипа не меньше 4 МБ. Теперь лог сам печатает это смещение и
сравнивает с ESP.getFlashChipRealSize(), а также границы файловой системы —
последнее важно, потому что при том же дефекте LittleFS по адресу
0x400000 окажется недоступен ровно так же.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Vitali
2026-08-07 17:21:25 +07:00
co-authored by Claude Opus 5
parent d07a0dd23c
commit 56e6bfd098
@@ -41,6 +41,7 @@
#include <WiFiManager.h> #include <WiFiManager.h>
#include <EEPROM.h> #include <EEPROM.h>
#include <Wire.h> #include <Wire.h>
#include <flash_hal.h> // EEPROM_start / FS_PHYS_ADDR — только для диагностики
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> #include <Adafruit_SSD1306.h>
@@ -721,9 +722,24 @@ void setup() {
flashIde == flashReal ? "совпадает" : "!!! НЕ СОВПАДАЕТ !!!"); flashIde == flashReal ? "совпадает" : "!!! НЕ СОВПАДАЕТ !!!");
Serial.printf("[FLASH] скетч %u Б, свободно под скетч %u Б\n", Serial.printf("[FLASH] скетч %u Б, свободно под скетч %u Б\n",
ESP.getSketchSize(), ESP.getFreeSketchSpace()); ESP.getSketchSize(), ESP.getFreeSketchSpace());
// Куда именно EEPROM собирается писать. Если это смещение выходит за размер
// физической микросхемы, spi_flash_erase_sector() провалится и commit()
// вернёт false — то есть настройки не сохранятся никогда.
uint32_t eepromOffset = EEPROM_start - 0x40200000;
Serial.printf("[FLASH] EEPROM пишет в сектор %u (смещение 0x%06X)%s\n",
eepromOffset / SPI_FLASH_SEC_SIZE, eepromOffset,
eepromOffset + SPI_FLASH_SEC_SIZE <= flashReal
? "" : " <<< ЗА ПРЕДЕЛАМИ ФИЗИЧЕСКОГО ФЛЕША!");
Serial.printf("[FLASH] файловая система: смещение 0x%06X, размер %u Б%s\n",
FS_PHYS_ADDR, FS_PHYS_SIZE,
FS_PHYS_ADDR + FS_PHYS_SIZE <= flashReal
? "" : " <<< ЗА ПРЕДЕЛАМИ ФИЗИЧЕСКОГО ФЛЕША!");
if (flashIde != flashReal) { if (flashIde != flashReal) {
Serial.println(F("[FLASH] ВНИМАНИЕ: выберите в IDE верный размер флеша,")); Serial.println(F("[FLASH] ВНИМАНИЕ: размер флеша в IDE не соответствует"));
Serial.println(F("[FLASH] иначе EEPROM не сохраняется.")); Serial.println(F("[FLASH] микросхеме. Ни EEPROM, ни LittleFS работать не будут,"));
Serial.println(F("[FLASH] пока в Tools -> Flash Size не выбран верный размер."));
} }
EEPROM.begin(EEPROM_SIZE); EEPROM.begin(EEPROM_SIZE);