ESP32 NVS получить сохраненное значение не удается с ESP_ERR_NVS_NOT_FOUND (0x1102)

Плата: ESP32-WROOM с размером флэш-памяти 16 МБ

Как заголовок: чтение значений, записанных в раздел NVS платы ESP32, завершается ошибкой с кодом 4354 (0x1102), который соответствует ESP_ERR_NVS_NOT_FOUND.

Ошибка на официальной странице ESP API: ESP_ERR_NVS_NOT_FOUND = пространство имен Id еще не существует, а режим - NVS_READONLY

Я не могу понять почему, поскольку я инициализирую с правильным пространством имен и с флагом NVS_READWRITE.

Код:

esp_err_t ret = 0;
nvs_handle handler = 0;
ret = nvs_flash_init_partition("nvs");
log_e("nvs_flash_init_partition CODE: %d", ret);

delay(500);

ret = nvs_open_from_partition("nvs", "tele", NVS_READWRITE, &handler);
log_e("nvs_open CODE: %d", ret);

delay(500);

ret = nvs_set_u8(handler, "kk", 7);
log_e("nvs_set_u8 CODE: %d", ret);

delay(500);

ret = nvs_commit(handler);
log_e("nvs_commit CODE: %d", ret);

delay(500);


int8_t max_buffer_size = 256; 
ret = nvs_get_i8(handler, "kk", &max_buffer_size);
log_e("nvs_get_u8 CODE: %d", ret);
log_e("nvs_get_u8 STORED: %d", max_buffer_size);

delay(500);

ret = nvs_flash_deinit_partition("nvs");
log_e("nvs_flash_deinit_partition CODE: %d", ret);

nvs_close(handler);

Примечание: Тоже без задержек попробовал: результат тот же.

выход:

begin(): nvs_flash_init_partition CODE: 0
begin(): nvs_open CODE: 0
begin(): nvs_set_u8 CODE: 0
begin(): nvs_commit CODE: 0
begin(): nvs_get_u8 CODE: 4354
begin(): nvs_get_u8 STORED: 0
begin(): nvs_flash_deinit_partition CODE: 0

Перегородки:

 # Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags

nvs,data,nvs,0x9000,16K,
otadata,data,ota,0xd000,8K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,8M,
ota_0,app,ota_0,0x810000,1M,
ota_1,app,ota_1,0x910000,1M,

Я делаю что-то неправильно? Я что-то упускаю?

Спасибо!

ОБНОВЛЕНИЕ: Похоже, флэш-память тестовой платы была повреждена. Я пробовал с другим, и код работал нормально.


person SXN    schedule 09.02.2021    source источник
comment
Какую версию IDF вы используете? Обе доски, которые вы использовали, одного типа? В частности, какой флэш-чип / идентификатор они используют? Это то же самое? Сегодня я увидел очень похожую проблему, которая, вероятно, была вызвана ошибкой во флэш-коде IDF. Если вам нужна помощь в поиске команд для ответов на вышеперечисленные вопросы, дайте мне знать, пожалуйста.   -  person StrawHat    schedule 26.02.2021
comment
Я обновил свой вопрос: плата, на которой я тестировал, была повреждена, тестировалась с другой, и все работало нормально.   -  person SXN    schedule 26.02.2021


Ответы (1)


Взгляните на это примечание в документации для nvs_set_u8 ():

Обратите внимание, что фактическое хранилище не будет обновлено до тех пор, пока не будет вызвана функция nvs_commit.

Поэтому добавьте вызов nvs_commit() сразу после nvs_set_u8():

ret = nvs_commit(handler);
log_e("nvs_commit CODE: %d", ret);
person Tarmo    schedule 09.02.2021
comment
Привет, я понял это и отредактировал свой вопрос. С nvs_commit () у меня такой же результат. Спасибо! - person SXN; 09.02.2021
comment
@SXN Возможно, лучше было бы совершить коммит сразу после операции записи (установки). Если вы зафиксируете после операции чтения (получения), это не повлияет на чтение. Я не понял, что вы выполняете коммит после получения в коде, но он был зарегистрирован до получения ???? Гммм странно! - person Peter Paul Kiefer; 09.02.2021
comment
Повторюсь: добавьте вызов nvs_commit () сразу после nvs_set_u8 ();) - person Tarmo; 09.02.2021
comment
Да, я отредактировал свой вопрос. Я добавил nvs_commit сразу после nvs_set_i8, но все тот же код ошибки. Я даже изменил свою таблицу разделов, добавил новый настраиваемый раздел NVS с настраиваемым именем и тем же результатом. Я просмотрел все темы и форумы, но не нашел решения или объяснения. Это усложняет задачу. - person SXN; 09.02.2021
comment
Ах хорошо. Я видел, как код NVS запутывался, если вы меняли схему разделов и повторно запускали приложение. Далее вы можете попытаться стереть всю флэш-память с помощью idf.py erase_flash, затем перепрограммировать и повторно запустить приложение. - person Tarmo; 09.02.2021
comment
Уже сделал это как из интерфейса командной строки, так и из кода: тот же результат. Вроде не находит ключ, что странно. Возможно, эта конкретная плата с флэш-памятью 16 МБ неисправна, хотя я в этом сильно сомневаюсь. - person SXN; 09.02.2021