ESP32 SPIピンのピン配置、仕様、設定
ESP32のSPIピンとは
ESP32のSPI — 4線バス、4コントローラー、1つのGPIOマトリクス
ESP32でSPI接続のディスプレイやセンサーを構築しているチームは、よくある問題に直面します。それは、デバイスがベンチ上では正しく初期化されるのに、本番環境では断続的に失敗するという問題です。症状は様々です—表示フレームの破損、数時間後に応答しなくなるセンサー、DMA負荷下でバスがロックアップする。根本原因は同じであることがよくあります。SPI信号をストラッピング機能と競合するピンに割り当てたり、IO_MUXパスが利用可能で必要な場合にGPIOマトリクス経由で40MHzクロックをルーティングしたりしたことが原因です。
ESP32は、STM32やAVRのような固定ピンMCUとは異なり、ほとんどのSPI信号をほぼすべてのGPIOにルーティングできます。この柔軟性はPCBレイアウトに非常に役立ちます。しかし、それはまた、間違った選択肢の余地を広げます。どのピンが安全か、どのピンがパフォーマンスのペナルティを伴うか、そしてどのピンが完全に禁止されているかを理解することが、信頼性の高いSPI設計の基礎となります。
このページでは、ESP32のSPIピンの全容を網羅します。主要なバリアントすべてのデフォルトピンテーブル、リマッピングルールとその制限、電気的特性、マルチデバイス配線、そして適切な設定を選択するための意思決定フレームワークについて説明します。
ESP32 SPI のハードウェアレベルでの動作
GPIO Matrix と ESP32 SPI ピンが固定されていない理由
ESP32 は、ペリフェラル信号用の 2 つの内部ルーティングパスを提供します。IO_MUX は、ペリフェラルと特定の GPIO パッド間の直接接続です。遅延を最小限に抑え、ペリフェラルが生成できるクロック速度のすべてをサポートします。GPIO Matrix は、任意のペリフェラル信号をほぼすべての GPIO に接続できるクロスバースイッチです。各方向に約 1 APB クロックサイクルの遅延が追加されます。
SPI の場合、この追加遅延は高クロック周波数で重要になります。Espressif のドキュメントでは、オリジナルの ESP32 での GPIO Matrix ルーティング SPI の実用的な制限を約 26 MHz としています。このしきい値を超えると、セットアップおよびホールドタイミングが劣化します。周波数依存で断続的なビットエラーが発生します。これは、熱ストレス下で発生したり、PCB トレースが予想よりも長くなった場合に発生したりします。
SPI クロックが 26 MHz を超える場合は、IO_MUX のデフォルトピンを使用してください。ほとんどの ESP32 バリアントでは、GPIO Matrix はこのしきい値を超えると十分に高速ではありません。
各 SPI コントローラーの IO_MUX デフォルトピンは、シリコンで固定されています。直接パスを維持したまま移動することはできません。ボードレイアウトにより、デフォルト以外のピンを使用する必要がある場合、GPIO Matrix が自動的にルーティングを処理しますが、クロック上限が低下します。ほとんどの SPI フラッシュ、ディスプレイ、センサーのデザインは 26 MHz をはるかに下回るため、Matrix パスは許容範囲内です。特に高速リフレッシュレートで大型 TFT ディスプレイを駆動する高速デザインでは、IO_MUX ピンが必要です。
ESP32 の SPI バス電気的特性

すべての ESP32 GPIO パッドは 3.3 V ロジックで動作します。出力ハイレベルは通常 2.64 V 以上です。入力ハイしきい値は約 0.75 × VDD、つまり約 2.48 V です。5 V SPI ロジックを必要とするデバイスは、レベル変換が必要です。これは、ESP32 を 5 V システム向けに設計された古い産業用センサーや SD カードモジュールに接続する際に、よく見落とされる点です。
GPIOごとにドライブ強度を設定可能です。デフォルト設定は最大20 mAです。長いトレースや複数のデバイスを並列に駆動するSPI信号では、ドライブ強度を40 mA設定に増やすことで、立ち上がり時間を短縮し、より高いクロックレートでの信号品質を向上させます。一方、短いトレースで高いドライブ強度を使用するとEMIが増加します。適切に配線されたPCB上のほとんどのデザインは、デフォルト設定で問題なく動作します。
CSラインは、ESP32がアクティブに駆動していないときにプルアップ抵抗が必要です。ブートおよびリセット中、GPIO出力はハイインピーダンス状態になります。浮遊したCSラインは意図せずアサートされ、デバイスの状態を破損させる可能性があります。各CSラインへの3.3 Vへの10 kΩプルアップは標準的な方法です。デバイスが明示的にアクティブハイのチップセレクトを必要としない限り、CSへのプルダウンは避けてください。
SPIの最大クロック周波数は、バリアントとルーティングパスによって異なります。オリジナルのESP32は、マスターモードでIO_MUXパス上で80 MHzに達します。ESP32-S3は、IO_MUX経由のSPI2およびSPI3で最大80 MHzをサポートします。ESP32-C3は、単一の汎用SPIコントローラーで最大60 MHzです。これらはシリコンの限界です。実際のボード設計では、トレースインピーダンスと負荷容量のマージンを確保するために、最大値より10〜20%低く設定して動作させることがよくあります。
コントローラーおよびバリアント別のESP32 SPIピン仕様
デフォルトSPIピン割り当て — ESP32 (WROOM / WROVER)

オリジナルのESP32には4つのSPIコントローラーがあります。SPI0およびSPI1は、内部フラッシュおよびPSRAMアクセス用に予約されています。Espressifは、これらをGPIO6からGPIO11(WROVERではPSRAM用にGPIO16〜17)に接続します。これらのピンは決して再割り当てしてはいけません。これらを汎用SPI信号として使用しようとすると、フラッシュ読み取りエラーまたはシステムクラッシュが発生します。多くの場合、ベンチで再現するのが難しいランダムな間隔で発生します。
ユーザーがアクセスできる2つのコントローラーは、HSPI (SPI2) および VSPI (SPI3) です。それらのデフォルトIO_MUXピン割り当ては次のとおりです。
| コントローラー | MOSI | MISO | CLK | CS0 |
|---|---|---|---|---|
| HSPI (SPI2) | GPIO13 | GPIO12 | GPIO14 | GPIO15 |
| VSPI (SPI3) | GPIO23 | GPIO19 | GPIO18 | GPIO5 |
GPIO34からGPIO39は入力専用パッドです。出力ドライバはありません。これらのピンのいずれかにMOSIまたはCLKを割り当てても、信号はワイヤ上に出力されません。これは、エンジニアがピン配置図から「利用可能な」GPIOを選択する際に、入力専用フラグを確認せずに犯しやすい間違いです。MISOはマスター側では常にインプットであるため、これらのピンを安全に使用できます。
SPIピン割り当て — ESP32-S3、ESP32-S2、ESP32-C3
ESP32-S3 WROOM-1は、SPI2およびSPI3を汎用コントローラーとして公開します。SPI2のデフォルトIO_MUXピンは、MOSIがGPIO11、MISOがGPIO13、CLKがGPIO12、CSがGPIO10です。SPI3のデフォルトは、MOSIがGPIO35、MISOがGPIO37、CLKがGPIO36、CSがGPIO34です。ESP32-S3は、WROOM-1モジュール上の内部Octal-SPIフラッシュインターフェイス用にGPIO26からGPIO32を予約しています。これらのピンはモジュールのエッジコネクタでは利用できず、ユーザーSPIバスに割り当てることはできません。
ESP32-S2は、プライマリユーザーアクセス可能なコントローラーとしてSPI2を提供します。デフォルトIO_MUXピンは、MOSIがGPIO35、MISOがGPIO37、CLKがGPIO36、CSがGPIO34です。ピン番号付けは元のESP32と大きく異なるため、ピンマッピングのレビューなしにボード設計を直接移植することはできません。
ESP32-C3には、単一の汎用SPIコントローラー(SPI2)があります。デフォルトIO_MUXピンは、MOSIがGPIO7、MISOがGPIO2、CLKがGPIO6、CSがGPIO10です。C3のRISC-Vコアと削減されたピン数は、コストに敏感なシングルペリフェラル設計に適していますが、単一コントローラーではマルチデバイスのトポロジーが制限されます。
本番HMIハードウェアを構築するチームにとって、バリアントにコミットする前に、これらのバリアントが完成品でどのように機能するかを確認することは有用です。 ESP32ペリフェラルを使用した本番HMIハードウェア SPI接続ディスプレイおよびペリフェラルの、ESP32モジュールの選択肢全体での統合方法を示しています。
| バリアント | ユーザーSPIコントローラー | 最大 IO_MUX クロック | 予約フラッシュピン |
|---|---|---|---|
| ESP32 | SPI2 (HSPI)、SPI3 (VSPI) | 80 MHz | GPIO6–GPIO11 |
| ESP32-S3 | SPI2, SPI3 | 80 MHz | GPIO26–GPIO32 |
| ESP32-S2 | SPI2 | 80 MHz | GPIO26–GPIO32 |
| ESP32-C3 | SPI2 | 60 MHz | GPIO12–GPIO17 |
ピン制約、ストラッピングピン、および禁止される割り当て
各ESP32バリアントには、SPI信号を伝送するGPIOに加えて、リセット時のブート動作を制御するデュアルロールを持つものがあります。Espressifはこれらをストラッピングピンと呼びます。チップは電源投入時にこれらのピンをサンプリングして、ブートモード、フラッシュ電圧、およびJTAG構成を決定します。これらのピンをSPI CSラインに割り当てると(起動時に外部デバイスがこれらを低くプルする可能性がある)、ハードウェア障害のように見えるブート失敗が発生します。
オリジナルのESP32では、重要なストラッピングピンは次のとおりです。
- GPIO0 — ブートモード選択(ロー = ダウンロードモード)
- GPIO2 — ダウンロードモード中はローまたはフローティングである必要があります
- GPIO5 — SDIOタイミング選択、およびVSPI CS0デフォルト
- GPIO12 — フラッシュ電圧選択 (MTDI)、HSPI MISOデフォルトとしても使用
- GPIO15 — JTAG信号、HSPI CS0デフォルトとしても使用
WROVERモジュールではGPIO12に特別な注意が必要です。起動時にGPIO12がハイの場合、ESP32は1.8 Vフラッシュを期待します。ほとんどのモジュールは3.3 Vフラッシュを使用しています。SPIデバイスの出力経由でGPIO12をハイにすると、フラッシュ電圧の不一致が発生し、モジュールは起動に失敗します。SPIデバイスが起動時にMISOを時折ハイにするだけであれば、この問題は断続的になり、一貫して再現するのが難しい起動障害の1つとなります。
ESP32-S3では、ストラッピングピンはGPIO0、GPIO3、GPIO45、GPIO46を含みます。ESP32-C3では、GPIO2、GPIO8、GPIO9がストラッピングピンです。CSラインを割り当てる前に、必ず関連するテクニカルリファレンスマニュアルのストラッピングピンリストを確認してください。
ESP32 SPIピンの設定と配線
ファームウェアでのSPIピンのリマップ — GPIOマトリクス割り当ての仕組み
ESP-IDFでSPIバスを初期化する際、 spi_bus_initialize()で、MOSI、MISO、CLK、およびオプションでCSのGPIO番号を指定する設定構造体を渡します。これらの番号が選択されたホストのIO_MUXデフォルトと一致する場合、ESP-IDFは信号を自動的にダイレクトパス経由でルーティングします。一致しない場合、ドライバは追加の設定なしにGPIOマトリクス経由でルーティングします。
代表的なバス初期化は次のようになります。
/* Illustrative only — not a production-ready snippet */
spi_bus_config_t buscfg = {
.mosi_io_num = 23, /* VSPI default — IO_MUX path */
.miso_io_num = 19,
.sclk_io_num = 18,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 4096,
};
spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO);
この SPI_DMA_CH_AUTO パラメータにより、ドライバーはDMAチャンネルを選択できます。ESP32では、SPI2とSPI3はDMAチャンネル1と2を共有しています。両方のバスに同じDMAチャンネルを割り当てると、転送競合が発生します。2つのSPIバスを同時に実行する場合、チャンネルを明示的に割り当てるか、 SPI_DMA_CH_AUTO の両方で、ドライバーが異なるチャンネルを割り当てていることを確認してください。
IO_MUXとリマップピンのどちらを選択するかは、クロック周波数によって決まります。26 MHz未満では、GPIO Matrixパスはすべてのバリアントで信頼性があります。それ以上では、IO_MUXのデフォルトピンを使用してください。SPIを超えるGPIO機能(ドライブ強度レジスタ、入力専用フラグ、RTC GPIOの動作など)の全体像については、 ESP32 GPIOピンの役割と電気的制限 を参照してください。
複数のSPIデバイスを個別のCSラインで接続する

共有SPIバスは、MOSI、MISO、CLKをすべてのデバイスで共通にします。各デバイスには独自のCSラインが用意されています。マスターはCSを低くしてデバイスを選択し、トランザクションを完了してから、別のデバイスを選択する前にCSを高くします。このトポロジは、CSラインが正しく管理されている限り、同じバス上のディスプレイ、フラッシュチップ、センサー、ADCに適しています。
CSピンの選択は、他の出力GPIOと同じルールに従います。ストラッピングピン、入力専用GPIO(元のESP32のGPIO34~GPIO39)、フラッシュ接続ピンを避けてください。これらの制約以外では、利用可能なGPIOはどれでも使用できます。CSトレース長を短くし、カップリングを減らすために、PCB上のデバイスに物理的に近いピンを選択してください。
ファームウェアでは、各デバイスを次のように登録すると、ESP-IDFがCSを自動的に管理します。 spi_bus_add_device() デバイス構成でCS GPIO番号を指定します。ドライバは、各転送の前後にCSをアサートおよびデアサートします。手動でのCSトグルは、標準以外のタイミング要件を持つデバイスにのみ必要です。たとえば、一部のセンサーは、ドライバのデフォルトのデアサート期間を超えるトランザクション間の最小CS高時間を必要とします。
2デバイスバスの配線説明:ESP32から両方のデバイスにMOSI、MISO、CLKを並列に接続します。2つの異なるGPIO出力から各デバイスのCSピンに個別の配線を引きます。各CSラインから3.3Vへの10kΩプルアップ抵抗を接続します。MISOトレースはできるだけ短く保ってください。複数のデバイスからの長いMISOトレースは、高クロックレートでの信号エッジを劣化させる容量負荷を作成します。
SPI配線および信号の問題の診断

ピン割り当ての間違いは、ハード障害を引き起こします。デバイスは応答せず、バスにクロックアクティビティが表示されず、ファームウェアが最初の転送でエラーを返します。バス構成のGPIO番号と実際のPCB接続を確認してください。次に、割り当てられたピンのいずれも、入力専用またはフラッシュ予約カテゴリに該当しないことを確認してください。
クロックスピードの問題は、異なる動作をします。バスは初期化され、最初の数回の転送は成功します。その後、エラーがランダムに表示されます。バイト破損、フレームの一部、またはCRCエラーです。これらのエラーは温度とともに増加し、クロックを半分に遅くすると消えることがよくあります。このパターンは、GPIOマトリックスによってルーティングされたピンが、信頼できる周波数上限を超えて実行されていることを示しています。修正は、クロックを下げるか、IO_MUXデフォルトピンに移動することです。
SPIデバッグに最も役立つツールはロジックアナライザです。以下の点を順に確認してください。
- CLKの極性(CPOL)と位相(CPHA)— ミスマッチは、すべてのバイトを不正にします
- CSのアクティブ状態 — ほとんどのデバイスはアクティブローです。アクティブハイCSは正しくアサートされません
- デバイスが選択されていないときのMISOラインの状態 — MISOがフローティング状態になると、ノイズが発生し、次の読み取りが破損します
- CSの非アサートタイミング — デバイスによっては、次のトランザクションの前にCSを最小期間ハイにする必要があります
フローティングMISOは、マルチデバイスバスで繰り返し発生する問題です。1つのデバイスが選択されている場合、他のデバイスはMISO出力をトライステートする必要があります。正しくトライステートしないデバイスは、CSがハイであってもMISOを駆動し、選択されたデバイスからの読み取りを破損します。非選択時のMISOの動作については、各デバイスのデータシートを確認してください。デバイスに適切なトライステート出力がない場合は、バススイッチまたは個別のMISOラインが必要です。
バスロック — SPIコントローラが応答しなくなりリセットが必要になる状態 — 通常、DMA設定エラーまたはCSがアサートされたままになり完了しなかったトランザクションに起因します。SPIタイムアウト時のウォッチドッグリセットを追加することは、本番ファームウェアの標準的なプラクティスです。100〜500ミリ秒の範囲のタイムアウトは、ほとんどの正当な長距離転送をカバーし、バスがハングアップする前にアプリケーションに影響を与えるのを防ぎます。
設計に最適なSPIピン構成の選択
決定フレームワーク — デフォルトピン vs カスタムリマッピング vs バリアント選択
ほとんどのESP32設計において、SPIピン構成の決定は4つの基準によって推進されます。
クロック周波数要件。 SPIペリフェラルに26MHzを超える周波数が必要な場合(高解像度TFTディスプレイや高速ADCによく見られます)、IO_MUXのデフォルトピンを使用する必要があります。ファームウェアによる回避策はありません。クロック周波数が20MHzを下回る場合、GPIO対応のピンであればどれでも機能し、基板レイアウトによって自由に選択できます。
SPIデバイス数。 専用バス上の単一デバイスは簡単です。共有バス上の2つ以上のデバイスは、CSピンの選択とMISOトライステート検証を慎重に行う必要があります。設計で3つ以上の独立したSPIバスが必要な場合(例:ディスプレイバス、センサーバス、SDカード)、元のESP32またはESP32-S3(どちらもユーザーSPIコントローラを2つ搭載)は、SPIコントローラを1つしか持たないESP32-C3よりもこれをうまく処理します。
バリアント機能。 設計でOctal-SPIフラッシュを大きなフレームバッファに使用する必要がある場合、または高ピンカウントSPIペリフェラルが関与する場合にESP32-S3を選択します。S3のより多くのGPIO数とデュアルSPIコントローラは、複雑なHMI設計の自然な選択肢となります。設計で単一のSPIペリフェラルがあり、コストが主な制約であり、クロック速度が40MHzを快適に下回る場合にESP32-C3を選択します。
基板レイアウトの柔軟性。 PCBの制約によりIO_MUXのデフォルトピンが使用できず、クロックが26 MHz未満に留まる場合、GPIO Matrixのリマッピングはクリーンなソリューションとなります。リマッピングはハードウェア設計ノートで明示的に文書化してください。後で基板のデバッグを行うエンジニアは、どのピンがSPI信号を伝送しているかを知る必要があります。データシートのデフォルトピンテーブルは、実際の設計とは一致しません。
SPI接続ディスプレイを駆動する設計で、選択したクロックと解像度がバス帯域幅内に収まるか確認する必要がある場合、 SPIディスプレイの帯域幅要件を計算してください クロック構成を最終決定する前に。
適切なSPIピン構成の選択は、積み重なる設計上の選択です。回路図段階での誤った決定—ストラッピングピン上のCSライン、マトリクスルーティングされたピン上の40 MHzクロック—は、診断に数時間かかり、時にはPCBの再設計を必要とします。これらの障害を引き起こすパターンは、組み込み製品開発チーム全体で繰り返されます。レイアウトを最終決定する前に、ピン制約テーブルを確認し、CS割り当てに対してストラッピングピンをチェックし、共有バス上のすべてのデバイスのMISOトライステート動作を検証してください。
量産に向かう設計では、技術的な正確さと同じくらいプロセスの規律が重要です。STONE HMIのエンジニアリングチームは、IEC 61508に準拠した実践に従っています。そのような構造化されたアプローチは、製造されたハードウェアにピン割り当てエラーが到達するリスクを低減します。そこでは、修正コストが設計レビューで問題を検出するよりもはるかに高くなります。