ESP32のフラッシュへの書き込みエラー

久しぶりに、「PDMインタフェース MEMS 超音波マイク SPH0641LU4H-1 を ESP32のESP-IDF で試す」のプログラムを修正しようとした。まず、Visual Studio Code (Ver.1.45.0) の Platform IO の Espessif 32 プラットフォーム 1.12.1  (esp-idf 4.0.0)の環境でビルドできるようにして、ボードLolin D32 のフラッシュに書き込もうとしたところエラーになった。リセット回路の問題のようであり、リセットとGNDの間にキャパシタを追加して解消したが、備忘録として残しておく。

書き込みエラー

PlatformIO: Upload によって、プログラムをESP32のフラッシュにアップロードして書き込んだところ、 Connecting........_____....._____....._____....._____....._____....._____....._____

と接続ができず、最終的に次のエラーとなった。

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header *** [upload] Error 2

メッセージ全体は以下の通り。

原因調査

Lolin D32 ボードで使用されている CH340 USBシリアル変換のドライバが古いかと思って更新してみたが、エラーになるのは変わらなかった。

次に、ESP32 Boot Mode Selection の問題かどうかを確認した。

https://github.com/espressif/esptool/wiki/ESP32-Boot-Mode-Selection によれば、GPIO0がLowで、GPIO2がハイインピーダンス状態かLowであれば、リセットすることで bootloader mode となり、フラッシュへの書き込みがされる。

ボードに GPIO0をLowにするBoot のボタンがあればそれを押しておき、書き込みが始まったら、Bootボタンを放すということが試せる。しかし、使っているボードが、Lolin D32 で、Bootのボタンがない。

しかたがないので、ジャンパー線でGPIO0をGNDに落としておき、書き込みが始まるか試してみたところ、書き込みが始まったので、リセット時に Boot Mode にうまくなっていないことが原因と思われた。

https://docs.wemos.cc/en/latest/d32/d32.html にある回路図  (Schematic V1.0.0[PDF])を見たところでは、RESETとENが接続され、100nFのコンデンサがRESETとGNDとの間に入っている。RESET(EN)がシリアルのDTRとRTSで制御されるようになっており、また、GPIO0もシリアルのDTRとRTSで異なった論理で制御されるようになっている。

GPIO2は結線されておらずハイインピーダンス状態で、GPIO0がLowならば、Bootモードになる状態になっている。

以前、ESP8266のリセット回路 でみた問題と考えられた。つまり、Boot ModeにするためにDTRとRTSが制御されるが、プログラムでGPIO0をLowにするよりも前にRESETがHighになってしまい、Boot Modeにならない。

100nFのコンデンサがRESETとGNDとの間に入っており、RESETの立ち上がりを遅くしているが、容量が不足のようだ。

問題解消法と確認

ボードに入っている100nFだけでは容量不足と考えられることから、100nF(0.1μF)のコンデンサをさらに、RESETとGNDの間に入れてみたが、うまくいかなかった。

まだ不足と思われることから、1μFのコンデンサをRESETとGNDの間に入れてみたところBoot Modeになって、以下のように書き込みが正常に行われるようになった。