ESP32S3---WiFi连接时连接不上,报错“wifi:init nvs: failed, ret=101”\“Failed to deinit WI-FI driver(0x3001)“
首选方案:直接使用 Arduino IDE 的全部擦除工具,然后重新烧录程序。这能解决 99% 的此类问题。预防措施:将方案一中的代码擦除逻辑添加到您的setup()函数里,用于在开发阶段自动修复NVS错误。检查代码:确认您的代码没有在之前就调用任何 WiFi 相关函数。按照以上步骤操作,应该就能解决的错误。
好的,这是您提供的 ESP32 WiFi 初始化错误的中文详细解释和解决方案:
错误信息分析
您看到的错误日志表明 ESP32 在初始化 WiFi 时遇到了严重问题,核心原因是 NVS (Non-Volatile Storage,非易失性存储) 分区读取失败。
wifi:init nvs: failed, ret=101
: 这表示 WiFi 库尝试从 NVS 中读取之前保存的配置(如 SSID、密码等)时失败了。错误代码101
通常对应ESP_ERR_NVS_NOT_FOUND
或类似的错误,意味着它找不到需要的数据或 NVS 存储库本身已损坏。Failed to deinit Wi-Fi driver
和Failed to deinit Wi-Fi
: 因为初始的 NVS 读取失败,系统试图清理并退出初始化过程,但在这一步也失败了,形成了一个恶性循环。
问题根源
NVS 是 ESP32 的一块flash存储区域,用于保存键值对数据,WiFi配置、设备凭证等数据都会存储在这里。导致此错误的主要原因有:
- NVS 数据损坏:这是最常见的原因。可能由于:
- 意外断电或复位时正在写入数据。
- Flash 内存出现物理问题。
- 使用了不兼容的 NVS 库或分区表。
- 首次使用/未初始化:如果芯片是全新的,或者 NVS 分区从未被初始化过,里面没有有效数据,也会导致读取失败。
- 代码逻辑问题:在
setup()
函数中,WiFi 初始化代码(WiFi.begin()
,WiFi.mode()
等)在 NVS 初始化代码(nvs_flash_init()
)之前被调用。
解决方案
请按以下顺序尝试解决:
方案一:擦除并重新初始化 NVS(最有效)
使用esptool擦除ESP32S3的Flash区
这是解决 NVS 损坏最直接的方法。注意:这会清除所有保存在 NVS 中的信息,包括已配对的 WiFi 密码。
方法 A:使用 Arduino IDE 的 ESP32 擦除工具
- 打开 Arduino IDE。
- 确保您的 ESP32 开发板通过 USB 连接。
- 点击菜单栏的
工具
->擦除 Flash
->全部擦除
。 - 等待擦除完成,然后重新上传您的程序。
方法 B:在代码中初始化时加入擦除逻辑
您可以在 setup()
函数的最开始处添加以下代码,它在开发阶段非常有用,但产品化后应移除或谨慎使用。
#include <nvs_flash.h> // 确保包含这个头文件
void setup() {
Serial.begin(115200);
// 初始化 NVS,如果失败则擦除后重新初始化
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
// 如果 NVS 分区已满或找到新版本,擦除并重试
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
// 接下来再初始化 WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// ... 您的其他代码
}
void loop() {
// ...
}
方案二:检查代码初始化顺序
确保您的 setup()
函数中,NVS 的初始化总是在 WiFi 操作之前完成。正确的顺序应该是:
void setup() {
Serial.begin(115200);
nvs_flash_init(); // 1. 先初始化 NVS
initOtherComponents(); // 2. 初始化其他组件(如果有)
setupWiFi(); // 3. 最后再设置 WiFi
}
方案三:检查分区表(高级)
如果您自定义了 partitions.csv
文件,请确保 nvs
分区有足够的大小(通常至少 20KB)。如果分区太小,也容易导致数据损坏。尝试换回默认的分区表。
总结与步骤建议
- 首选方案:直接使用 Arduino IDE 的
全部擦除
工具,然后重新烧录程序。这能解决 99% 的此类问题。 - 预防措施:将方案一中的代码擦除逻辑添加到您的
setup()
函数里,用于在开发阶段自动修复NVS错误。 - 检查代码:确认您的代码没有在
nvs_flash_init()
之前就调用任何 WiFi 相关函数。
按照以上步骤操作,应该就能解决 wifi:init nvs: failed, ret=101
的错误。
更多推荐
所有评论(0)