Суть проблемы
Сегодня я столкнулся с интересной проблемой, а именно ESP12-E не выходил из режима глубокого сна. Точнее, он как будто просыпался, но в последовательный порт выводил только надпись ets Jan 8 2013,rst cause:2, boot mode:(3,6). Конечно же, перед тестом, я соединил GPIO16 и RST, а значит, проблема не в этом. Интересно, что даже после reset(RST к GND) контроллер не включится с первого раза, если он находился в режиме сна. Однако со второго раза он успешно запускается.
В процессе активного гуглежа, я обнаружил, что подобная проблема характерна не только для моего ESP12-E, но и для готовых модулей, таких как Wemos D1 Mini и Lolin Nodemcu.
Решение
- Необходимо подключить пин MISO к 3.3В через резистор 10 кОм (некоторые предлагают использовать резистор 220 Ом, но можно попробовать разные значения, если нет резистора на 10 кОм. Я применил на 1кОм). https://github.com/esp8266/Arduino/issues/6007#issuecomment-1912701059 Мне помог этот способ, следующий не пробовал.
- Альтернативная функция глубокого сна(источник https://github.com/esp8266/Arduino/issues/6007#issuecomment-578811346)
#define ets_wdt_disable ((void (*)(void))0x400030f0)
#define ets_delay_us ((void (*)(int))0x40002ecc)
#define _R (uint32_t *)0x60000700
void nk_deep_sleep(uint64_t time)
{
ets_wdt_disable();
*(_R + 4) = 0;
*(_R + 17) = 4;
*(_R + 1) = *(_R + 7) + 5;
*(_R + 6) = 8;
*(_R + 2) = 1 << 20;
ets_delay_us(10);
*(_R + 39) = 0x11;
*(_R + 40) = 3;
*(_R) &= 0xFCF;
*(_R + 1) = *(_R + 7) + (45*(time >> 8));
*(_R + 16) = 0x7F;
*(_R + 2) = 1 << 20;
__asm volatile ("waiti 0");
}
Надеюсь, одно из предложенных решений поможет вам, если уж вы столкнулись с этой проблемой.