ESP32 WROOM 32 ディスプレイインターフェースと制約

ESP32 WROOM 32 ディスプレイ統合:インターフェース、制約、および実装

ESP32 WROOM 32 設計にディスプレイを追加するエンジニアは、よくあるパターンに遭遇します。ハードウェアは起動し、SPIラインはオシロスコープでアクティブに見えますが、パネルは空白のままか、破損した出力が表示されます。直感的にはディスプレイコントローラーを疑います。ほとんどの場合、問題は別の場所にあります。SPIモード設定、リセットタイミング、または内部フラッシュと競合するバス割り当てです。この記事では、WROOM 32ディスプレイ統合が最初の起動で成功するか、デバッグに1週間を費やすかを決定する電気的制約、ハードウェアペアリング、およびドライバー構成手順を解説します。

ESP32 WROOM 32 のディスプレイインターフェース電気的制約

Engineer probing SPI clock line on ESP32 WROOM 32 board with oscilloscope on development bench

GPIOドライブ強度とディスプレイコントローラーとの3.3Vロジック互換性

WROOM 32は3.3Vで動作します。多くの低コストTFTモジュールは5Vロジック用に設計されており、制御ラインで3.3V信号に正しく応答しません。双方向(MISOを伝送するSPIライン用)のレベルシフターが、モジュールと5Vディスプレイコントローラーの間に必要です。この手順を省略すると、予測不能な動作が発生します。一部のディスプレイは部分的に応答し、他のディスプレイはコマンドを完全に無視します。

WROOM 32 GPIO のドライブ強度(出力電流能力)は、レジスタで設定可能です。 GPIO_DRIVE_CAP 4 段階の設定が可能です。weak(約 5 mA)、medium(約 10 mA)、strong(約 20 mA)、strongest(約 40 mA)です。基板上のディスプレイコネクタへの短い PCB トレースの場合、通常は medium ドライブで十分です。長いフレキシブルケーブルや外部ディスプレイボードでは、20 MHz 以上の SPI クロックレートでクリーンな信号エッジを維持するために strong ドライブが有利です。

ドライブ強度を上げるとエッジはシャープになりますが、シールドされていないフレキシブルケーブルでの放射エミッションが増加します。これは、CE/FCC のプリコンプライアンス試験で考慮すべきトレードオフです。

完全な絶対最大定格および I/O 電気的特性については、 ESP32 モジュール電気仕様およびデータシートを参照してください。

フレームレート要件に対する SPI 対 I2C バススループット上限

WROOM 32 SPI マスターは、標準モードで最大 80 MHz のクロックレートをサポートします。実際には、ILI9341 や ST7789 などのディスプレイコントローラーは、特定の部品や PCB レイアウトに応じて 10~66 MHz で定格されています。多くの場合、40 MHz の SPI クロックでの動作が可能であり、オーバーヘッドを考慮すると約 40 Mbps の生スループットが得られます。

フレームレートの計算は単純です。16ビットカラーの320x240ディスプレイでは、1フレームあたり150 KBが必要です。SPIクロック40 MHz、効率約70%の場合、フルフレーム転送には約27 msかかり、CPU処理時間を考慮する前にリフレッシュレートは約37 FPSに制限されます。128x128ディスプレイに縮小すると、1フレームあたり5 ms未満になります。

I2Cは、ファストモードで最大400 kHz、ファストモードプラスで1 MHzです。1 MHzの場合、150 KBの転送には1.2秒以上かかります。エンジニアは、I2Cでカラーディスプレイを駆動できるか尋ねることがあります。スループットは、128x64モノクローム以上のものには実用的ではありません。SSD1306をI2C経由で使用するOLEDステータスパネルは妥当ですが、カラーTFTはそうではありません。以下を使用してください。 ディスプレイ帯域幅とフレームレート計算機 特定の解像度とターゲットFPSのSPIクロック要件を検証するために。

SPI0/SPI1上のフラッシュおよびPSRAMとディスプレイが共存する場合のバス競合

WROOM 32の内部フラッシュはSPI0およびSPI1を介して接続されます。これらのバスはESP-IDFキャッシュコントローラによって管理されており、ユーザーペリフェラルには使用できません。SPI1にディスプレイを割り当てようとすると、フラッシュアクセスフォルトまたは予測不能なロックアップが発生します。

ディスプレイはVSPI (SPI3) またはHSPI (SPI2) を使用する必要があります。VSPIは一般的な選択肢であり、デフォルトのIOMUXピンにマッピングされます。HSPIは同等に高性能ですが、一部の開発ボードペリフェラルとピン割り当てを共有するため、使用する前にボードレイアウトを確認してください。

DMA競合は、より微妙な問題です。CPUがフラッシュから読み取る場合(コード実行中またはOTA中)、DMAコントローラは一時的にバス帯域幅を競合します。これは、時折発生するフレームティアリングまたはSPIトランザクション遅延として現れます。修正策は、ディスプレイドライバコードとルックアップテーブルをフラッシュではなくIRAMに配置し、転送中のフラッシュ読み取りを削減することです。フレームバッファ割り当てについては、WROOM 32の520 KB内部SRAMが唯一の選択肢です。WROVERバリアントはPSRAMを追加しますが、標準のWROOM 32には含まれていません。150 KBを超えるフルフレームバッファを必要とする設計では、WROVERを評価するか、タイルベースのレンダリングアプローチを使用する必要があります。

WROOM 32ベースの設計におけるディスプレイハードウェア構成

WROOM 32リソースプロファイルに適合するディスプレイ技術

WROOM 32設計におけるディスプレイの選択は、インターフェイス帯域幅、SRAM予算、および電力エンベロープの3つの変数に集約されます。下の表は、一般的なディスプレイ技術とWROOM 32のリソースプロファイルをマッピングしたものです。

ディスプレイタイプ コントローラー インターフェイス フレームバッファ用SRAM 最適な適合
モノクロOLED SSD1306 / SH1106 I2CまたはSPI 約1 KB ステータスパネル、低消費電力ノード
カラーTFT LCD ILI9341 / ST7789 SPI 150 KB(フル)/ 20~40 KB(タイル) UI対応HMI、Wi-Fiデバイス
電子ペーパー 各種(SPI) SPI 約15~30 KB バッテリーデバイス、低速更新ディスプレイ

OLEDパネルは、ディスプレイがステータステキストやシンプルなアイコンを表示するデザインに適しています。SRAMはほとんど必要なく、I2Cでうまく機能するため、SPIを他の周辺機器に解放できます。カラーTFTは、製品にグラフィカルなUIが必要な場合に適した選択肢ですが、150 KBのフルフレーム上限内に収まる設計でない限り、タイルバッファ戦略が必要です。電子ペーパーは、1〜数秒のリフレッシュ遅延が許容できるバッテリー駆動のWROOM 32設計に適しています。産業用資産タグや環境センサーが一般的な例です。

STONE HMI は、産業用 HMI システム向けのプロダクショングレードのファームウェアを開発しています。

ESP32 WROOM 32 におけるディスプレイ ドライバの実装

WROOM 32 ディスプレイ接続のためのピン マッピングと SPI バス割り当て

VSPI のデフォルト ピンは、GPIO 18 (SCK)、GPIO 19 (MISO)、GPIO 23 (MOSI)、および GPIO 5 (CS) です。これらは IOMUX を介して直接マッピングされ、GPIO マトリックスを通過しないため、より高いクロック レートで信号インテグリティをクリーンに保ちます。カスタム ピン割り当ては GPIO マトリックスを介して可能ですが、わずかな伝播遅延が発生します。これは 40 MHz 以上で関連します。

DC (データ/コマンド) および RST は、ほぼすべての利用可能な GPIO を使用できますが、ストラップピンは避ける必要があります。GPIO 0、2、12、および 15 はブート モードの選択に影響します。RST を GPIO 0 に割り当てると、プログラミング シーケンスに干渉します。GPIO 12 は一部のモジュールでフラッシュ電圧のストラップに影響します。実際には、GPIO 4、13、14、16、17、21、22、25、26、27、および 32 ~ 39 は、ボードの他のペリフェラル割り当てに従って、DC および RST の安全な選択肢です。完全な GPIO 機能テーブルについては、 ESP32 WROOM 32 開発ボードのピン リファレンス を参照してください。

バックライト制御では、PWM を介して GPIO を駆動する LEDC (LED コントロール) チャネルを使用します。他の PWM ペリフェラルとの競合を回避するために、専用の LEDC タイマーとチャネルを割り当てます。一般的な構成では、視覚的なちらつきを回避し、スイッチング損失を低く抑えるために、8 ビット分解能を 1 ~ 5 kHz で使用します。

フレームバッファ戦略とSRAM割り当て(カラーディスプレイ向け)

ILI9341(320x240、16ビットカラー)用のフルフレームバッファには150KBが必要です。WROOM 32には520KBの内部SRAMがありますが、その総容量はFreeRTOSタスクスタック、ヒープ割り当て、Wi-Fiバッファと共有されています。Wi-Fiだけで設定に応じて約60~100KBを予約します。スタックとWi-Fiオーバーヘッド後の典型的な作業予算では、約200~280KBの空きヒープが残ります。これはフルフレームバッファには十分ですが、アプリケーションデータ構造のための領域は限られます。

タイルバッファは、そのメモリのごく一部を使用します。40x240のタイル(ディスプレイの1列ストリップ)には19.2KBが必要です。CPUはフレームごとに複数のSPIトランザクションを送信します(幅320のディスプレイでは8つ)。これによりCPU負荷は増加しますが、メモリ使用量は低く抑えられます。LVGLは、このモデルを lv_conf.h buffer_size パラメータでサポートしています。PSRAMなしのWROOM 32で一般的な設定は、それぞれ10~20KBのタイルバッファを2つ使用することです。これにより、レンダリングフェーズと送信フェーズ間でDMAによるダブルバッファリングが可能になります。

設計上の決定は、メモリサイズだけではありません。タイルバッファはSPIトランザクションのオーバーヘッドを追加し、フルフレームDMA転送と比較して実効フレームレートを30~50%低下させる可能性があります。静的または低速で更新されるUIの場合、タイルバッファは適切なトレードオフです。スムーズなアニメーションには、厳密なヒープ管理を行ったフルフレームバッファが、メモリ予算の制約を考慮する価値があります。

ディスプレイ初期化シーケンスのタイミングと一般的な失敗モード

Logic analyzer clip leads on VSPI lines of ESP32 WROOM 32 board during display initialization debug

最初の電源投入時にディスプレイが真っ白になるのは、ハードウェア障害ではなく、ほとんどの場合タイミングまたはシーケンスのエラーです。最初の起動失敗の大多数は、3つの原因によって説明されます。

  • RSTパルス幅の不足。 ほとんどのディスプレイコントローラでは、10 µs以上のハードウェアリセットパルスが必要であり、最初のSPIコマンドの前に120 msの遅延が必要です。RSTをLowにし、1 ms待機してから初期化シーケンスをすぐに送信するファームウェアでは、パネルが空白または部分的にしか初期化されません。
  • SPIモードの不一致。 ディスプレイコントローラは通常、SPIモード0(CPOL=0、CPHA=0)またはモード3(CPOL=1、CPHA=1)を使用します。ESP32 SPIマスターを間違ったモードで設定すると、すべてのバイトが誤って読み取られます。ディスプレイはコマンドを受け付けますが、ゴミが表示されるか、何も表示されません。コントローラデータシートを確認してください—ILI9341はモード0を使用し、一部のST7789バリアントは両方を受け付けます。
  • SPIクロックより前のVCC。 ディスプレイのVCCレールが安定する前にSPIクロックを起動すると、コントローラが未定義の状態にラッチされる可能性があります。VCCが定格電圧に達してから最初のSPIトランザクションまでの10〜50 msの電源シーケンス遅延は、これを防ぎます。

初期化シーケンスが疑わしい場合、VSPIライン上のロジックアナライザが最も迅速なデバッグツールです。CSが最初のクロックエッジの前にLowアサートされているか、コマンドバイトがコントローラの初期化コマンド(通常はソフトウェアリセット用に0x01)と一致しているか、DCラインがコマンドバイト中はLowでデータバイト中はHighになっているかを確認します。これにより、数秒で完全なトランザクションシーケンスがキャプチャされ、マルチメータでは表示できないタイミングエラーが特定されます。

ESP32 WROOM 32 ディスプレイ — よくある質問

WROOM 32 デザインのディスプレイ統合に関する質問

Q1: ESP32 WROOM 32はタッチスクリーンディスプレイを駆動できますか?
はい。XPT2046などの抵抗膜方式タッチコントローラはSPIを使用し、ディスプレイとVSPIバスを共有できます。この場合、CSラインを別に用意します。FT6206などの静電容量方式タッチコントローラは、I2Cを別のGPIOピンで使用します。どちらの場合も、起動時の干渉を防ぐために、タッチ割り込みピンはストラッピングGPIOを避けるべきです。

Q2: Wi-FiがアクティブなときにWROOM 32ディスプレイがちらつくのはなぜですか?
Wi-Fi割り込み処理は、フレーム中盤でSPI DMA転送をプリエンプトすることがあります。ディスプレイリフレッシュを、Wi-Fiドライバのコールバックタスクより優先度の高い専用FreeRTOSタスクに割り当て、ダブルバッファリングを使用して、レンダリングフェーズとSPI送信フェーズを独立して実行します。これにより、ディスプレイタイミングとWi-Fiイベントのレイテンシが分離されます。

Q3: WROOM 32はパラレル(8080/6800)ディスプレイインターフェースをサポートしていますか?
WROOM 32にはネイティブのパラレルディスプレイペリフェラルがありません。8080インターフェースディスプレイの駆動にはGPIOのビットバンギングが必要ですが、一般的な解像度では毎秒1~3フレーム程度が限界です。このスループットは、実用的なアニメーションUIには低すぎます。このモジュールにはSPIベースのディスプレイが適しています。

Q4: WROOM 32が現実的に駆動できる最大ディスプレイ解像度は?
PSRAMなしの場合、タイルバッファを使用した16ビットカラーの320×240が実用的な上限です。フレームバッファ戦略とメモリ割り当ての詳細は、上記の「実装」セクションで説明しています。より高い解像度には外部PSRAMが必要ですが、これはWROVERバリアントにはありますが、標準のWROOM 32にはありません。

WROOM 32でのディスプレイ統合は、ほとんどの組み込みペリフェラルよりも、事前の慎重な計画が重要となります。バス割り当て、メモリ予算、リセットシーケンスは、レイアウト前に正しく決定しておけば容易ですが、基板製造後に修正するのは困難です。SPIクロックマージンとフレームバッファ割り当てをハードウェアにコミットする前にシミュレーションで検証したチームは、通常、1〜2回の基板リビジョンで動作するディスプレイを実現します。物理ハードウェアでバス競合やSRAM不足を発見したチームは、リバイスや回避策に数週間多く費やすことになります。本番グレードのファームウェア規律(構造化された初期化シーケンス、テスト済みの電源投入タイミング、文書化されたピン割り当て)は、製品の開発タイムライン全体で測定可能な違いを生み出します。