chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

ESP32 ブート時のGPIO12によるFLASH電圧設定機能を無効化する

要約:
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