要約:
GPIO12(MTDI pin)にはFLASH電圧設定機能があり、起動時GPIO12がHになっていると、FLASH電源電圧が1.8Vに設定されてしまい正常に起動できない。ESP32のフューズを変更することでGPIO12の電源電圧設定機能を無効化した。
詳細:
ESP32のGPIO12はHSPIのMISO用に割りあてられていて、自分の場合はFIFO付きArducamのFIFO制御にHSPIを使っている。ArducamのFIFOにはCSも存在しているのだが、CSをHにしておいても、Arducamからの信号はハイインピーダンスにならないようで、、Hのままである。Hのままでブートしてしまうと、GPIO12のFLASH電源電圧切り替え機能により、FLASHの電源電圧が1.8Vで設定されてしまう*1
。この結果、FLASHが読めないとなって、以下のエラーが連発してブートされない(と自分は理解)
rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT) flash read err, 1000 ets_main.c 371 ets Jun 8 2016 00:22:57
HSPI直結の回路は変更したくないので、この問題を回避する方法を少し調べた結果、ESP32に内蔵されているフューズ領域を設定変更することで、GPIO12による電源電圧切り替え機能を無効化できることが分かった。これによりGPIO12のL/H状態に関わらず、FLASHへの供給電圧を3.3Vに固定することができるようである*2
。変更はフューズ書き換えソフトがありそれを使えばできるようだ。
espefuse.py set_flash_voltage 3.3V
変更を加える前にまず現状を確認。以下のように、XPD_XXXのフューズ類は0である。
$ espefuse.py -p /dev/ttyS3 summary *略* Config fuses: XPD_SDIO_FORCE Ignore MTDI pin (GPIO12) for VDD_SDIO on reset = 0 R/W (0x0) XPD_SDIO_REG If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset = 0 R/W (0x0) XPD_SDIO_TIEH If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V = 0 R/W (0x0) *略* Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).
以下のコマンドを実行して、GPIO12の切り替え機能を無効化して、FLASHへの供給電源の電圧を3.3Vに固定化する
$ espefuse.py -p /dev/ttyS3 set_flash_voltage 3.3V espefuse.py v2.8 Connecting.... Enable internal flash voltage regulator (VDD_SDIO) to 3.3V. The following efuses are burned: XPD_SDIO_FORCE, XPD_SDIO_REG, XPD_SDIO_TIEH. This is an irreversible operation. Type 'BURN' (all capitals) to continue. BURN VDD_SDIO setting complete.
再度フューズの設定を確認。ツールによる表示では、3.3V固定化したようである。。
$ espefuse.py -p /dev/ttyS3 summary *略* Config fuses: XPD_SDIO_FORCE Ignore MTDI pin (GPIO12) for VDD_SDIO on reset = 1 R/W (0x1) XPD_SDIO_REG If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset = 1 R/W (0x1) XPD_SDIO_TIEH If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V = 1 R/W (0x1) *略* Flash voltage (VDD_SDIO) set to 3.3V by efuse.
GPIO12にArducamのFIFOから出ているMISOを接続したままで、ESP32をOff/Onする→正常に起動。。というわけで、、GPIO12の電源電圧設定機能が無効化できた(ようである)。
■参考URL