ESP32-WROOM-32E ボード フラッシュ IC 仕様とプログラミング

ESP32-WROOM-32E モジュールにおけるフラッシュ IC 仕様

組み込み製品開発において、ラボではクリーンにプログラムされたファームウェアイメージが、量産ラインでは起動に失敗するという問題が繰り返し発生します。症状としては、UART出力が空白になる、またはリセットループが繰り返されるといったことが挙げられます。エンジニアはまずRF干渉や電源シーケンスを追跡しがちです。多くの場合、実際の原因は、モジュールに搭載されているフラッシュICのバリアントと、コンパイル時に設定されたフラッシュサイズとの不一致です。ESP32-WROOM-32E ボードのフラッシュ IC を、単なる容量のヘッドラインだけでなく、パラメータレベルで理解することが、信頼性の高い量産設計と、スケールアップ時に断続的に失敗する設計とを分ける鍵となります。

GPIO割り当て、RF仕様、電源アーキテクチャなどの、より広範なモジュールコンテキストについては、 ESP32-WROOM-32 モジュールファミリー概要を参照してください。この記事では、フラッシュ IC レイヤーに完全に焦点を当てます。

1.1 デフォルトフラッシュ構成:容量、インターフェース、および電圧

ESP32-WROOM-32E module on PCB with decoupling capacitors near power pins

WROOM-32Eは、4MB(標準)、8MB、16MBの3つのフラッシュ容量バリアントで出荷されます。Espressifは、モジュール部品番号の接尾辞にバリアントをエンコードします — それぞれN4、N8、およびN16です。4MBバリアントは、ほとんどの流通在庫でデフォルトです。調達チームは、この接尾辞を確認せずにバッチ間で注文することがあり、これが生産実行における容量の不一致の原因となります。

3つのバリアントすべてが、デフォルトでquad-SPI(QIO)インターフェースを使用します。フラッシュICは、4つのデータライン(IO0–IO3)、およびCLKとCSを介してESP32に接続されます。QIOモードは、ファーストステージROMブートローダーからアクティブです。インターフェースはソフトウェアでQSPI(QOUTとも呼ばれる)または標準のデュアル/シングルSPIに構成できますが、新しい設計でダウングレードする理由はまったくありません。

フラッシュサプライレールは、モジュールの内部LDOからVDD3P3ピン経由で供給される3.3Vで実行されます。WROOM-32Eは、元のWROOM-32と比較して、より厳格なサプライフィルタリング要件を導入しました。Espressifのモジュール設計ガイドラインでは、モジュールの電源ピンの近くに10 µFのバルクコンデンサと100 nFのデカップリングコンデンサを指定しています。このフィルタリングを追加せずに元のWROOM-32レイアウトを引き継いだボードは、負荷下でのフラッシュ書き込み信頼性が低いことがよくあります。

32Eは、サプライフィルタリングの点で元のWROOM-32のドロップイン交換部品ではありません — PCBレイアウトは、コンポーネントフットプリントだけでなく更新する必要があります。

1.2 フラッシュIC電気的特性とタイミングパラメータ

下の表は、WROOM-32Eモジュールに通常出荷されるフラッシュICの主要な電気的および耐久性パラメータをカバーしています。これらは、Espressifが生産実行全体でプライマリおよび代替ソースとして使用してきたWinbond W25QシリーズおよびGigaDevice GD25Qシリーズに基づいた代表的な範囲です。

パラメータ 標準値/範囲 技術注記
動作電圧 2.7 V ~ 3.6 V 書き込み/消去中は範囲内に維持する必要あり。2.7 V未満のブラウンアウトはページを破損させる。
最大SPIクロック(QIOモード) 80 MHz ESP-IDFのデフォルトは40 MHz。80 MHzにはフラッシュICのサポート確認が必要。
書き込み耐久性 100,000サイクル (代表値) セクターごと (4 KB); OTAパーティションはリードオンリーパーティションよりも早く摩耗します
データ保持期間 10年 (@85°C) 高温で低下します。産業用筐体設計に関連します
ESD感受性 クラス 1C (HBM, JEDEC JS-001) ベアモジュール取扱時は、組立時にESD対策が必要です。
ページプログラム時間 0.4 ms – 3 ms (代表値) セクター消去時間は30~400 msです。OTAタイミング計算ではこの時間を考慮してください。

フラッシュICのHOLDピンとWPピンは、モジュール内部で配線されています。ほとんどのWROOM-32Eビルドでは、WPはハイ(書き込み禁止無効)に、HOLDはハイ(ホールドなし)に接続されています。設計上、フラッシュのハードウェア書き込み保護が必要な場合(例:工場パーティションの保護)、外部ピン制御ではなく、ステータスレジスタへの書き込みを通じてESP32ファームウェアレベルで処理する必要があります。

EspressifのドキュメントにあるSPIフラッシュの完全なタイミングパラメータおよびVDD3P3ピン許容誤差については、 公式ESP32電気的特性データシートを参照してください。

1.3 フラッシュメモリマップとパーティションスキームのデフォルト

ESP-IDF におけるデフォルトの 4 MB パーティションレイアウトでは、セカンドステージブートローダーがオフセット 0x1000、パーティションテーブルが 0x8000、メインアプリケーションが 0x10000 から開始されます。一般的な OTA 対応レイアウトでは、それぞれ約 1.8 MB のアプリケーションスロットを 2 つ、NVS パーティション(通常 16 KB ~ 24 KB)、OTA データパーティション(8 KB)を予約します。

「シリアルフラッシャー設定」→「フラッシュサイズ」の menuconfig (「Serial Flasher Config → Flash Size」の下)のフラッシュサイズ設定は、物理 IC と一致している必要があります。ファームウェアで 4 MB を設定し、モジュールが 8 MB IC を搭載している場合、ファームウェアは正常に動作します。上位 4 MB は単に使用されません。逆の場合は失敗モードになります。8 MB 用にビルドされたファームウェアが 4 MB IC で実行されると、存在しないアドレスにアクセスしようとし、上位パーティション範囲で読み取りエラーまたはサイレントデータ破損が発生します。

組み立て済みのボードで実際のフラッシュ IC を確認するには、次を実行します。

esptool.py --port /dev/ttyUSB0 flash_id

これにより、JEDEC メーカー ID、デバイス ID、および検出されたサイズが返されます。メーカー ID(例: Winbond は 0xEF、GigaDevice は 0xC8)をベンダーのデータシートと照合すると、そのバッチにインストールされているセカンドソース IC が確認できます。入荷検査時に(プログラミング前)このチェックを実行することで、調達の置き換えがフィールドに到達する前に検出できます。

ESP32-WROOM-32E ボードのフラッシュ IC の交換、プログラミング、および検証

2.1 互換性のあるフラッシュ IC の交換品の特定

WROOM-32Eモジュール内部のフラッシュICは、メタルシールドの下にはんだ付けされた8-SOICパッケージです。物理的なアクセスにはシールドの取り外しが必要ですが、ほとんどの製造コンテキストではこれは一方通行の操作です。ただし、例えば、キャリアボードを再設計せずに大きなOTAイメージをサポートするために、4 MBから8 MBへのアップグレード時など、リワークが必要になる場合もあります。

互換性のある交換品は、これらの基準を満たす必要があります。

  • SPI NORフラッシュ、8-SOICパッケージ、3.3 V電源
  • ESP32 ROMの期待値に一致するダミーサイクルカウントを持つQIO(Quad I/O)サポート
  • esptoolによる自動検出のためのJEDEC SFDPサポート
  • ターゲットファームウェアパーティションレイアウト以上の容量

Winbond W25Q64JV(8 MB)およびW25Q128JV(16 MB)は、十分に検証されたオプションです。GigaDevice GD25Q64CおよびGD25Q128Cは、一般的なEspressif承認のセカンドソースです。ISSI IS25LP064Aは、拡張温度範囲が重要となる一部の産業グレードモジュールビルドで使用されています。

任意に置き換える際のリスクは、ダミーサイクルカウントの不一致です。一部のフラッシュICは、ESP32 ROMブートローダーが期待するものとは異なる数のダミーサイクルをQIO高速読み出しコマンドで必要とします。これにより、フラッシュ書き込みは正常に見えますが、ROMが最初のキャッシュフェッチでガベージを読み取るため、ブートに失敗します。交換するICのデータシートにあるダミーサイクル構成は、交換を確定する前に必ず確認してください。

2.2 UART経由のフラッシュプログラミングとブートモード回路

Engineer connecting USB-UART bridge to ESP32-WROOM-32E board for flash programming

WROOM-32Eを使用したカスタムボードでダウンロードモードに入るには、EN(リセット)ピンが立ち上がる前にGPIO0をLOWにプルする必要がある。標準的なシーケンスは、GPIO0をLOWに保持し、ENをLOWからHIGHにパルスし、ROMがUART0でダウンロードモードプロンプトを出力した後にGPIO0をリリースする。ほとんどの開発ボードは、USB-UARTブリッジのDTRおよびRTSラインで駆動される2トランジスタ回路でこれを自動化している。

完全なキャリアボードコンテキストでこのブートモード回路を示す完全な回路図リファレンスについては、 ESP32-WROOM-32開発ボード回路図リファレンスを参照してください。

最小限の信頼性のあるプログラミング回路には、GPIO0に10kΩのプルアップ、ENに10kΩのプルアップ、フラッシュ電源レールに100nFのデカップリングが必要である。デカップリングコンデンサを省略すると、より高いボーレートでの間欠的な書き込み失敗が発生する。書き込み電流スパイク中にフラッシュ電源が低下し、ページ中間でブラウンアウトリセットがトリガーされるためである。

4MBモジュールでの完全なフラッシュ書き込みの典型的なesptoolコマンド:

esptool.py --port /dev/ttyUSB0 --baud 460800 \
write_flash --flash_mode qio --flash_size 4MB \
0x0 bootloader.bin 0x8000 partitions.bin \
0x10000 firmware.bin

一般的なプログラミングの失敗とその最初の診断ステップ:

  • 書き込み中のブラウンアウト: ボーレートを115200に下げる、電源デカップリングを確認する
  • GPIO0浮遊: モジュールがダウンロードモードではなく実行モードでリセットされる; プルダウン抵抗を追加する
  • フラッシュモードフラグが不正: 使用する --flash_mode keep ブートローダーが既にQIO設定で書き込まれている場合

2.3 フラッシュ整合性検証とプログラミング後検証

プログラミング後、プログラミング治具から基板を取り外す前に、書き込まれたイメージを検証してください。

esptool.py --port /dev/ttyUSB0 verify_flash \
0x10000 firmware.bin

これにより、プログラミングされた領域が読み戻され、ソースバイナリとバイト単位で比較されます。この段階での不一致は、フラッシュICの欠陥ではなく、書き込み中の電源供給の問題をほぼ常に示しています。

プログラミング前にJEDEC IDおよびSTATUSレジスタを読み取ることで、ICの健全性を早期に把握できます。予期しないビット、特にブロック保護ビットが設定されているSTATUSレジスタは、ICが出荷時に書き込み保護が有効になっていたことを意味します。esptoolでは、保護ビットのクリアは1コマンド操作ですが、この手順を省略すると、検証時にのみ表面化するサイレントな書き込み失敗が発生します。

OTAが多用されるデプロイメントでは、パーティションローテーション戦略が重要です。アップデートごとに同じOTAスロットに書き込むと、1つのセクター範囲に摩耗が集中します。ESP-IDFのOTAライブラリは、デフォルトでOTA_0とOTA_1を交互に使用するため、2つの領域に摩耗を分散させます。OTAアップデートが頻繁(1日数回)に実行される設計では、設計者は通常、100Kサイクルの耐久性を想定製品寿命に対して予算化し、パーティションレイアウトを最終決定する前にヘッドルームが存在することを確認します。

基板が出荷される前に、最低限の生産ラインフラッシュ検証シーケンスには、JEDEC IDの読み取りとバッチロギング、フルイメージの書き込み、verify_flashのパス、およびUART出力がキャプチャされたパワーサイクルブート確認を含めるべきです。産業用通信スタックを含むファームウェアの場合、 ファームウェアテスト用のModbus RTU CRC検証ツール は、フラッシュ後機能テストの一部としてプロトコルレベルの検証をサポートできます。

よくある質問:ESP32-WROOM-32E フラッシュIC

3.1 フラッシュICに関するよくある質問

ESP32-WROOM-32E のフラッシュICを4MBから8MBにアップグレードできますか?
物理的な交換は可能ですが、モジュールシールドを取り外し、W25Q64JVなどの互換性のある8MB ICをリフローする必要があります。再作業後、firmware を menuconfig で 8MB フラッシュサイズを選択して再構築し、再フラッシュする必要があります。モジュールシールドは取り外し後に工場出荷時の標準に戻すことはできないため、このアプローチはエンジニアリングビルドには実用的ですが、量産には適しません。

起動時にフラッシュICが検出されない場合はどうなりますか?
ROMブートローダーは、 flash read err, 1000 115200 baud の UART0 に出力し、その後停止またはリセットします。まず SPI データラインの導通を確認し、次にフラッシュ電源レールを負荷下で測定してください。アイドル時に 3.3 V を読み取るレールが、最初の読み取りバースト中に 2.7 V 未満に低下する場合は、IC の故障ではなく、デカップリング不足が原因です。

WROOM-32E は外部フラッシュからの XIP をサポートしていますか?
はい。ESP32 キャッシュコントローラーはフラッシュ読み取りを CPU アドレス空間に直接マッピングするため、コードは RAM にコピーされることなくフラッシュから実行されます。標準の WROOM-32E には PSRAM が含まれていないため、すべてのヒープとスタックは 520 KB の内部 SRAM に収まる必要があります。PSRAM を搭載したバリアントは、異なるモジュール部品番号で入手可能です。

モジュールのバッチに含まれるフラッシュICのバリアントをどのように確認しますか?
参照してください esptool.py flash_id セクション1.3に記載されている手順。これは受入検査時に実行し、JEDEC IDをバッチの購買発注番号に記録します。Espressif承認のセカンドソースは標準的な使用では機能的に同等ですが、実際のICを記録しておくことで、バッチがフィールドで障害を示した場合の将来のデバッグの曖昧さを回避できます。

フラッシュICの不一致は、組み込み製品開発全体で一貫したパターンに従います。問題は調達中に導入され、少量しか一致しないためラボテストを通過し、異なるバッチがラインに到達したときにのみ表面化します。受入検査時にこれを実行することは、通常、ボードあたり1分未満で検出できます。このステップをプログラミングフィクスチャスクリプトに追加したチームは、フィールドでブートループ障害モードに遭遇することはめったにありません。 flash_id 受入検査時に

STONE HMIエンジニアリングチームは、IEC 61508に準拠したプラクティスに従っています。製造ファームウェアの品質と納期スケジュールの両方にリスクがあるプロジェクトでは、フラッシュ検証、パーティション管理、OTA戦略に適用されるそのようなプロセスの規律は、出荷を遅延させる最終段階の障害の確率を低下させます。