今回問題になった現象
ESP32-WROOM-32Eでオーディオプレーヤーを作っているのですが、マイコン起動後にSetupも実行されず初期化を繰り返すことがありました。HSPIを使いSDカードを挿し込んでいる時だけこの現象が発生しました。その際以下のようなエラーメッセージが出ていました。
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
invalid header: 0xffffffff
invalid header: 0xffffffff
原因
この問題を調べると以下の記事と症状が同じだったため、これを参考に対応したところ解決しました。
https://chakoku.hatenablog.com/entry/2020/01/25/234359
ESP32はデフォルト設定ではフラッシュメモリの電源電圧を起動時のGPIO12の状態で設定できるようになっています。ESP32の起動時にGPIO12がHighになっているとフラッシュメモリの電源電圧が1.8Vに設定されてしまい、プログラムを正常に読み込めなくなることが原因でした。
解決策
GPIO12はHSPIのMISOで使用しSDカードに接続されているため、回路の変更なく対応するには先ほどの記事でも書かれているようにESP32のefuseを書き換えてフラッシュメモリの電源電圧を3.3Vに固定する必要があります。
以下の手順でefuseを書き換えることができます。
(事前にPython等のインストールが必要です)
➀まずコマンドプロンプトで以下のコマンドを入力しesptoolをインストールします。
pip install esptool
➁次に以下のコマンドを入力して現在の設定を読み出します。
COMxにはESP32のCOMポート番号を入れてください。
espefuse.py --port COMx summary
読みだした設定を見てXPD_XXXXX(XPD_SDIO_REG等)が0になっていれば次に進みます。
➂そして以下のコマンドでefuseの設定を書き換えます。
espefuse.py --port COMx set_flash_voltage 3.3V
書き込んで良いか聞かれるので"BURN"を入力すると設定が書き込まれます。
最後に
初めてQiitaで書いたので見にくいところなどあるかもしれませんが気に入っていただけたら今後も見ていただけると嬉しいです。主にESP32等のマイコンやオーディオ回路、自作ラジコンについて書きたいと考えています。