ESP32 GPIOピン 電気仕様とSPIマッピング
SPI割り当てピンに特有のGPIO電気的制約
SPI接続のディスプレイやセンサーを扱うエンジニアは、次のようなよくあるパターンに遭遇します。バスは、ベンチテスト中は10MHzで安定して動作しますが、最終的なPCBレイアウトでは40MHzでトランザクションがドロップし始めます。原因はSPIペリフェラル自体にあることはほとんどありません。これはGPIOの電気的特性と、負荷下で検証されていなかったルーティング選択に起因します。
SPI GPIOラインにおける電圧許容範囲、駆動能力、および電流制限
ESP32 GPIOは3.3Vロジックで動作します。どのGPIOピンも5Vトレラントではありません。レベルシフタなしで5V SPIデバイスを直接接続すると、システムが初期には機能しているように見えても、時間の経過とともに保護ダイオードが損傷します。
GPIOあたりの絶対最大出力電流は40mAです。持続的なSPI動作では、実用的には12mAが上限となります。これを超えると、出力電圧が低下し、高クロックレートでのSCLKおよびMOSIの信号エッジ品質が低下します。
各GPIOには4段階(0~3)のドライブ強度レジスタがあります。デフォルト強度(設定2)では、SCLKの立ち上がり/立ち下がり時間は通常、約20 MHzまで十分です。それ以上では、ドライブ強度を設定3に上げるとエッジがシャープになり、セットアップ時間違反が減少しますが、EMIが増加し、隣接するGPIOラインにノイズが結合する可能性があります。SPIラインがADC入力の近くに配線された高密度PCBでは、このトレードオフが重要になります。
MISOは特に注意が必要です。MISOは入力ラインであるため、ドライブ強度は直接適用されません。重要なのは、内部プルアップ抵抗とバス容量との相互作用です。ESP32 GPIOの内部プルアップは約45 kΩです。数センチメートルのトレースと10~20 pFの出力容量を持つデバイスのバスでは、そのプルアップがRC時定数を作成し、高速でのクリーンなMISOサンプリングを制限します。20 MHz以上では、外部10 kΩプルアップが適切な修正方法です。
GPIOマトリクスルーティングのオーバーヘッドとSPIパスの信号インテグリティ

ESP32 GPIOマトリクスは、任意のGPIOを任意のペリフェラル信号に接続できます。この柔軟性にはコストが伴います。マトリクスを経由するルーティングは、直接IO MUXパスと比較して、伝搬遅延が約4~6 ns増加します。
40 MHz SPIクロックでは、1クロック周期は25 nsです。6 nsのルーティングペナルティは、信号がチップを離れる前に、その予算のほぼ4分の1を消費します。
直接IO MUXパスは、マトリクスを完全にバイパスします。WROOM-32モジュールでは、このパスは次のセクションに記載されているデフォルトのSPIピン割り当てでのみ利用可能です。再マッピングされたGPIOはすべてマトリクスを経由し、遅延ペナルティが発生します。
実際の結果として、SCLKジッタが蓄積します。80 MHzでは、マトリクスでルーティングされたSCLKジッタにより、セットアップ/ホールド要件が厳しいSPIデバイスが不正なデータをラッチする可能性があります。エンジニアリング上の決定は簡単です。クロッククリティカルな設計にはデフォルトのSPI GPIO割り当てを使用し、マトリクス再マッピングは、数ナノ秒の遅延増加がタイミングマージンに影響しない低速バスまたはCSラインのために予約します。
ESP32モジュールバリアント間のGPIOピン割り当て
ESP32 WROOM-32 および WROVER のデフォルト SPI GPIO 番号
| SPI 信号 | HSPI (SPI2) GPIO | VSPI (SPI3) GPIO |
|---|---|---|
| SCLK | GPIO 14 | GPIO 18 |
| MOSI | GPIO 13 | GPIO 23 |
| MISO | GPIO 12 | GPIO 19 |
| CS0 | GPIO 15 | GPIO 5 |
GPIO 6~11 は、WROOMモジュールでは内部フラッシュインターフェイス用に予約されています。これらをSPIまたは外部ペリフェラルに割り当てると、フラッシュアクセスが破損し、予期せぬクラッシュを引き起こします。これはハード制約であり、推奨事項ではありません。
GPIO 12 はストラッピングピン(MTDI)としても機能します。起動時の状態がフラッシュ供給電圧を設定します:LOWは3.3 V、HIGHは1.8 Vを選択します。GPIO 12をHSPI MISOとして使用するには、リセット中にLOWを保持するためのプルダウン抵抗が必要です。これを誤るとフラッシュアクセスがブリックします。
GPIO 15 はUART0のブートログ出力を制御します。これをLOWにプルするとブートログがサイレントになり、デフォルトのプロダクションフラッシングワークフローが壊れます。HSPI CS0でGPIO 15を使用する必要がある場合は、必要なプル状態を文書化し、それに応じてフラッシング手順を更新してください。
ESP32-S3 WROOM-1 GPIOとSPIペリフェラルの違い
S3は標準モジュールフットプリントでGPIO 0~21を公開します。-N16R8バリアントはGPIO 26~48を追加します。S3のSPI2デフォルトピンは、SCLK GPIO 12、MOSI GPIO 11、MISO GPIO 13、CS GPIO 10です。
SPI3はS3に存在しますが、すべてのモジュールバリアントでブレークアウトされているわけではありません。ファームウェアでSPI3を割り当てる前に、必ず特定のモジュールのデータシートを確認してください。
S3のGPIO 19および20は、USB D+およびD−を伝送します。USB CDCがアクティブな場合、これらはSPIラインとして機能できません。S3にWROOM-32設計をポートし、同じGPIO番号付けを再利用するエンジニアは、しばしばこの競合にサイレントに遭遇します。SPIバスはエラーなく初期化されますが、USBアクティビティが発生するとトランザクションが断続的に失敗します。
S3は、WROOM-32 GPIOマトリックスよりもルーティングペナルティの低いフルIO MUXを使用しています。デフォルト以外のSPI GPIO割り当ては、S3では元のESP32よりもタイミングリスクが低くなります。SPIスループットが重要なディスプレイ中心の設計では、当社をご利用ください 表示インターフェイス帯域幅とSPIスループットの推定 リフレッシュレート要件に対するクロック周波数選択を検証するツール。
入力専用GPIOの制限とそのSPI CSおよびMISO割り当てへの影響
ESP32 WROOM-32のGPIO 34〜39は入力専用です。内部プルアップ/プルダウン抵抗がなく、出力能力もありません。これらのいずれかをCSまたはSCLKに割り当てると、サイレント初期化エラーが発生します。ESP-IDF SPIドライバはエラーを報告しませんが、CSラインはアサートされません。
GPIO 36(VP)およびGPIO 39(VN)はADC1センサー入力ピンです。ADC1がアクティブなときにこれらをSPI MISOとして使用すると、ADCサンプルパスとSPIバス間でノイズが結合します。症状として、SPIトランザクションが発生するとADCの読み取り値がシフトします。これらの機能を異なるGPIOラインに分離すると、問題が完全に解消されます。
SPI動作のためのGPIOモードの設定
SCLK、MOSI、およびCSラインのGPIOドライブモード選択
SCLKおよびMOSIは〜を使用する必要があります GPIO_MODE_OUTPUT プッシュプル構成で。プッシュプルは最も速いエッジレートを提供し、シングルマスターSPIに適しています。オープンドレインMOSIは、プルアップ抵抗によるRC遅延を追加し、最大クロック周波数を制限します。バスのトポロジーが特に要求しない限り、避けてください。
CSラインはより慎重な検討が必要です。複数のSPIデバイスがバスを共有し、一部のデバイスが内部プルアップ付きのアクティブローイネーブルを備えている場合、プッシュプルCSがデバイスの内部プルアップに対してLOWを駆動すると、バスの競合が発生します。外部プルアップ付きのオープンドレインCSでこれを解決します。このケースでは GPIO_MODE_INPUT_OUTPUT_OD を使用します。
MISOは、バスがアイドル状態のときにプルアップが必要です。フローティングMISOは、トランザクション間でランダムなロジックレベルをサンプリングするため、ドライバがトランザクションを開始する前にラインが安定しない場合、次の読み取りを破損する可能性があります。内部45kΩプルアップは、20MHz未満で実行されるバスでは許容範囲です。それ以上では、PCB上に10~22kΩの外部抵抗を取り付けます。
IO MUXおよびGPIO Matrixを使用したSPI GPIOピンのリマップ
GPIOをSPI信号に接続するには2つのパスがあります。IO MUXパスは、H3 2.1のデフォルトピン割り当てに固定されており、ルーティング遅延はありません。GPIO Matrixパスは、任意の有効なGPIO番号を受け入れますが、H2 1で説明されているように4~6nsの遅延を追加します。
ESP-IDFでは、 spi_bus_config_t 構造体は任意のGPIO番号を受け入れます。 mosi_io_num、 miso_io_num、および sclk_io_num フィールド。デフォルト以外のピンが指定されている場合、ドライバは自動的にマトリクスをルーティングします。ドライバはマトリクスルーティングによってタイミングヘッドルームが削減されても警告しないため、開発者はタイミングマージン計算で追加遅延を考慮する必要があります。
完全なSPIバス初期化コンテキストとドライバレベルの構成については、 ESP32 SPIペリフェラルバスアーキテクチャと構成 ページを参照してください。WROOM-32モジュールでは、マトリクスが技術的にルーティングできるかどうかにかかわらず、GPIO 6~11はこれらのフィールドに絶対に使用してはなりません。
個別のCS GPIOラインを使用した複数のSPIデバイスの管理
ESP-IDFは、個別の spi_device_handle_t インスタンス。各デバイスは、デバイスハンドルが作成される前に、出力として構成された専用のCS GPIOを必要とします。ドライバは、構成されると、トランザクションごとにCSを自動的にアサートおよびデアサートします。
3つ以上のSPIデバイスを持つ設計では、利用可能なGPIOが不足することがよくあります。3つのGPIOラインで駆動される74HC138 3-to-8デコーダは、最大8つのCS信号をアドレッシングします。これにより、ピン制約のあるレイアウトでのGPIO消費を大幅に削減できます。
この cs_ena_pretrans パラメータは、 spi_device_interface_config_t 最初のSCLKエッジの前にCSセットアップ時間を制御します。ターゲットデバイスのデータシートで最小CS-to-SCLKセットアップ要件を確認してください。多くのフラッシュおよびディスプレイコントローラでは、SCLKが開始される前にCSホールドの少なくとも半クロックサイクルが必要です。
量産ボードでよく見られる障害モード:CSラインが電源投入中にHIGHにフローティングし、その後、ファームウェアがGPIOを初期化する前にSPIデバイスが自身を有効にします。PCB上のCSラインの10kΩプルアップにより、これを防ぐことができます。設計サイクルの後半でこれを検出すると、通常はボードの再スピンを意味します。
起動およびリセット中のGPIOピン状態の動作
ストラッピングピンとSPI GPIO割り当ての競合
ESP32の5つのGPIOピンがリセット時にサンプリングされ、ブート動作が構成されます:GPIO 0、2、5、12、15です。リセットパルス中のそれらの状態が、フラッシュ電圧、SDIOタイミング、UARTログ出力を決定します。これらのピンに割り当てられたSPI信号は、リセット中に正しいロジックレベルを維持する必要があります。そうしないと、チップは予期しないモードでブートします。
GPIO 12はフラッシュVDD_SDIO電圧を設定します。GPIO 5はSDIOタイミングに影響し、正しいVSPI CS動作のためにはブート時にHIGHである必要があります。GPIO 15はUART0ログ出力を制御します。これらのそれぞれには、PCB上に明示的なプル抵抗が必要です。ストラッピングサンプリングウィンドウ中はアクティブでない内部プル抵抗に依存しないでください。
最も安全な量産アプローチは、CSラインにストラップピンを一切使用しないことです。レイアウト制約により使用が強制される場合は、明示的なプル抵抗を追加し、最初のプロトタイプでロジックアナライザを使用してブート動作を確認し、ハードウェア設計ノートに必要なボード状態を文書化してください。これらの制約が既に解決されているプラットフォームを評価しているチームにとっては、 ESP32ベースの産業用HMIディスプレイモジュール が検証済みの出発点となります。
GPIOデフォルト状態とリセット後のSPIバスアイドル動作

リセット後、すべてのGPIOはプル抵抗がアクティブでない入力モードにデフォルト設定されます。ファームウェアがGPIOドライバを構成するまで、すべてのSPIバスラインはフローティング状態になります。高速で起動するSPIデバイスを持つバスでは、フローティングSCLKがデバイスにとってクロックエッジのように見え、ファームウェアが実行される前に誤ったトランザクションをトリガーする可能性があります。
修正はPCB上で行います。SCLKの10kΩプルダウンと、すべてのCSラインのプルアップは、電源が投入された瞬間から安全なアイドル状態を定義します。これは数個のパッシブコンポーネントで済み、間欠的な起動障害のクラス全体を排除します。
ライトスリープを使用する設計では、 gpio_hold_en() スリープサイクル中にGPIO出力状態を保持します。これがなければ、スリープ中にCSラインがフローティング状態になり、SPIデバイスが部分的に有効になる可能性があります。ディープスリープでは、明示的に呼び出されない限り、GPIO状態は保持されません。 gpio_deep_sleep_hold_en() が明示的に呼び出されない限り、GPIO状態は保持されません。スリープ時の動作が不確かな場合は、外部プルアップ/プルダウン抵抗が信頼できるフォールバックとなります。
最初のSPIトランザクションの前にGPIO設定を正しく行うことが、ベンチで動作する設計と確実に量産できる設計を分ける鍵となります。STONE HMIは、産業用HMIシステム向けのプロダクショングレードのファームウェアを開発しています。このようなプロセス規律(量産前にブート状態、ストラッピングピンの動作、スリープモードGPIOハンドリングを検証すること)は、フィールドでの故障リスクを直接低減します。フィールド故障は、診断にコストがかかり、リモートでパッチを適用することが不可能です。