Сам столкнулся с проблемой описанной здесь: Новые ревизии модулей на базе ESP8266 не умеют писать в SPI Flash
Отлаженный проект, работающий на 10 модулях вдруг перестает работать на новом модуле, достал еще один - тот же эффект.
Китайские поставщики начали использовать микросхему flash-памяти производства PUYA. Это привело к поломке драйверов SPIFFS, которые обычно используюся для сохранения настроек в модулях ESP8266.
Лечиться заменой функции в файле Esp.cpp вот функция, на которую надо поменять. Она универсальная, работает на любых ревизиях модулей. Правда на модулях с памятью puya работает, понятно, медленнее, но работает.
Отлаженный проект, работающий на 10 модулях вдруг перестает работать на новом модуле, достал еще один - тот же эффект.
Китайские поставщики начали использовать микросхему flash-памяти производства PUYA. Это привело к поломке драйверов SPIFFS, которые обычно используюся для сохранения настроек в модулях ESP8266.
Лечиться заменой функции в файле Esp.cpp вот функция, на которую надо поменять. Она универсальная, работает на любых ревизиях модулей. Правда на модулях с памятью puya работает, понятно, медленнее, но работает.
Код:
bool EspClass::flashWrite(uint32_t offset, uint32_t *data, size_t size) {
static uint32_t flash_chip_id = 0;
uint32_t *read_buf=NULL;
if (flash_chip_id == 0)
flash_chip_id = getFlashChipId();
ets_isr_mask(FLASH_INT_MASK);
int rc;
uint32_t* ptr = data;
if ((flash_chip_id & 0x000000ff) == 0x85) { // 0x146085 PUYA
read_buf=new uint32_t [SPI_FLASH_SEC_SIZE / 4];
if(!read_buf) return false;
rc = spi_flash_read(offset, read_buf, size);
if (rc != 0) {
delete read_buf;
ets_isr_unmask(FLASH_INT_MASK);
return false;
}
for (size_t i = 0; i < size / 4; ++i) {
read_buf[i] &= data[i];
}
ptr = read_buf;
}
rc = spi_flash_write(offset, ptr, size);
if(read_buf!=NULL) delete read_buf;
ets_isr_unmask(FLASH_INT_MASK);
return rc == 0;
}
Последнее редактирование: