| タイプ | シリアル通信 バス | ||
|---|---|---|---|
| 生産履歴 | |||
| デザイナー | モトローラ | ||
| 設計 | 1980年代前半頃[注 1] | ||
| メーカー | 様々な | ||
| デイジーチェーン | デバイスによって異なります | ||
| コネクタ | 未指定 | ||
| 電気 | |||
| 最大電圧 | 未指定 | ||
| 最大電流 | 未指定 | ||
| データ | |||
| 幅 | 1ビット(双方向) | ||
| 最大デバイス数 | マルチドロップはチップ選択によって制限されます。デイジーチェーンは無制限です。 | ||
| プロトコル | 全二重 シリアル | ||
| ピン配置 | |||
| モシ | マスターアウト、スレーブイン | ||
| 味噌 | マスターイン、スレーブアウト | ||
| シリアル | シリアルクロック | ||
| CS | チップセレクト(1つ以上) | ||
| (ピンには別名がある場合があります) | |||
シリアル ペリフェラル インターフェイス( SPI ) は、同期シリアル通信の事実上の標準(多くのバリエーションがあります)であり、主に組み込みシステムで集積回路間の短距離有線通信に使用されます。
SPIはマスタースレーブアーキテクチャ[ 1] (ここではメインサブと呼ぶ)を採用しており、[注 2] [注 3]、 1つの[注 4]メインデバイスがクロックとチップセレクト信号を駆動して1つ以上のサブ(周辺)デバイスとの通信を調整します。
モトローラのオリジナル仕様 (1980 年代初頭) では、4 つの論理信号(ラインまたはワイヤとも呼ばれる) を使用して、全二重通信をサポートしています。これは、半二重の 3 線式バリアントや、2 線式のI²Cおよび1-Wireシリアル バスと対比して、 4 線式 シリアル バスと呼ばれることもあります。
代表的なアプリケーションとしては、セキュア デジタルカード、液晶ディスプレイ、アナログ/デジタルコンバータ、デジタル/アナログ コンバータ、フラッシュメモリ、EEPROMメモリ、さまざまな通信チップなど の周辺チップとマイクロコントローラとのインターフェイスが挙げられます。
SPIは同期シリアルインターフェースですが、[2]同期シリアルインターフェース(SSI)とは異なります。SSIは差動信号方式を採用しており、単一のシンプレックス通信チャネルのみを提供します。
手術

一般的に、SPI には 4 つのロジック信号があります。バリエーションによって名前が異なったり、信号が異なったりする場合があります。歴史的な用語は括弧内に表示されます。
メインの MOSI はサブの MOSI に出力されます。サブの MISO はメインの MISO に出力されます。
各デバイスは内部的にシリアル通信用のシフト レジスタを使用しており、これらが一緒にチップ間循環バッファを形成します。
サブデバイスはトライステート出力を使用する必要があるため、デバイスが選択されていないときは MISO 信号が高インピーダンス(電気的に切断) になります。トライステート出力のないサブは、外部トライステート バッファを使用せずに他のサブと MISO ラインを共有することはできません。
データ転送
通信を開始するには、まず SPI メインがCS を低くしてサブデバイスを選択します。(注: CSの上のバーはアクティブ ロー信号であることを示しているため、低電圧は「選択済み」を意味し、高電圧は「未選択」を意味します)
アナログからデジタルへの変換などの待機期間が必要な場合は、メインはクロックサイクルを発行する前に少なくともその期間待機する必要があります。[注 5]
各 SPI クロック サイクル中に、1 ビットの全二重送信が行われます。メインは MOSI ラインでビットを送信し、サブは MISO ラインでビットを送信し、それぞれが対応する受信ビットを読み取ります。このシーケンスは、一方向のデータ転送のみを意図している場合でも維持されます。
単一のサブを使用した送信 (図 1) では、メインに 1 つのシフト レジスタ、サブに 1 つのシフト レジスタが使用され、両方とも所定のワード サイズ (たとえば 8 ビット) を持ち、[注 6]仮想リング トポロジで接続されます。データは通常、最上位ビット(MSB) を先頭にしてシフト アウトされます。[注 7]クロック エッジで、メインとサブの両方が 1 ビットを相手側にシフト アウトします。次のクロック エッジで、各受信機は送信されたビットをサンプリングし、シフト レジスタに新しい最下位ビットとして格納します。すべてのビットがシフト アウトおよびシフト インされると、メインとサブはレジスタ値を交換します。さらにデータを交換する必要がある場合は、シフト レジスタが再ロードされ、プロセスが繰り返されます。送信は任意の数のクロック サイクルにわたって継続できます。完了すると、メインはクロック信号のトグルを停止し、通常はサブの選択を解除します。
単一のサブデバイスを使用する場合、サブが許可すれば、そのCSピンをロジック ローに固定できます。複数のサブデバイスを使用する場合、マルチドロップ構成ではサブデバイスごとにメインからの独立したCS信号が必要ですが、デイジー チェーン構成では 1 つのCS信号のみが必要です。
選択されていないバス上のすべてのサブは、入力クロックとMOSI信号を無視する必要があります。また、 MISOでの競合を防ぐために、選択されていないサブはトライステート出力を使用する必要があります。まだトライステートになっていないサブでは、これを保証するために外部トライステートバッファが必要になります。[3]
クロックの極性と位相
クロック周波数の設定に加えて、メインではデータに対するクロックの極性と位相も設定する必要があります。モトローラ[ 4] [5]は、これら2つのオプションをそれぞれCPOLとCPHA(クロック極性とクロック位相)と名付けており、ほとんどのベンダーもこの慣例を採用しています。

示されているSPIタイミング図については、以下でさらに詳しく説明します。
- CPOL はクロックの極性を表します。極性は簡単なインバータで変換できます。
- SCLK CPOL=0 は論理低電圧でアイドル状態になるクロックです。
- SCLK CPOL=1 は論理高電圧でアイドル状態になるクロックです。
- CPHA は、SCLK に対する各データ ビットの送信サイクルの
位相を表します。
- CPHA=0の場合:
- CS がアクティブになると、最初のデータ ビットがすぐに出力されます。
- 後続のビットは、SCLK がアイドル電圧レベルに遷移したときに出力されます。
- サンプリングは、SCLK がアイドル電圧レベルから遷移するときに発生します。
- CPHA=1の場合:
- 最初のデータ ビットは、CS がアクティブになった後の SCLK の最初のクロック エッジで出力されます。
- 後続のビットは、SCLK がアイドル電圧レベルから遷移したときに出力されます。
- SCLK がアイドル電圧レベルに遷移するとサンプリングが行われます。
- これら 2 つのフェーズ間の変換は簡単ではありません。
- 注: MOSI 信号と MISO 信号は通常、次のビットの送信サイクルが開始するまでの半サイクルの間 (受信ポイントで) 安定しているため、元の仕様に関わらず、柔軟性を確保するために、SPI メイン デバイスとサブ デバイスはその半サイクル内の異なるポイントでデータをサンプリングする場合があります。
- CPHA=0の場合:
モード番号
極性と位相の組み合わせは、CPOL を上位ビット、CPHA を下位ビットとする次の「SPI モード」番号で表されます。
注:
- よく使用される別の表記法では、モードを (CPOL、CPHA) タプルとして表します。たとえば、値 '(0、1)' は CPOL=0 および CPHA=1 を示します。
- 全二重動作では、メインデバイスは異なるモードで送信と受信を行うことができます。たとえば、モード 0 で送信しながら、同時にモード 1 で受信することができます。
- ベンダーによって、クロック エッジの場合は CKE、CPHA の反転の場合は NCPHA など、異なる命名スキームが使用される場合があります。
有効なコミュニケーション
一部のサブデバイスは、クロック パルスの数が指定値より大きい SPI 通信を無視するように設計されています。その他のデバイスは気にせず、余分な入力を無視し、同じ出力ビットをシフトし続けます。異なるデバイスが異なる長さの SPI 通信を使用することはよくあります。たとえば、SPI を使用して IC のスキャン チェーンにアクセスする場合、1 つのサイズ (おそらく 32 ビット) のコマンド ワードを発行し、異なるサイズ (おそらく 153 ビット、スキャン チェーンの各ピンに 1 つ) の応答を取得します。
割り込み
割り込みは SPI の範囲外です。割り込みの使用は禁止も指定もされていないため、オプションで実装できます。
メインからサブへ
サブデバイスとして構成されたマイクロコントローラは、データワードが受信されたとき、または受信FIFOバッファでオーバーフローが発生したときに、自身に割り込み信号を生成するためのハードウェアサポートを備えている場合があり、 [6]チップセレクト入力ラインがローまたはハイにプルダウンされたときに割り込みルーチンを設定することもできます。
サブからメインへ
SPIサブは、アウトオブバンド信号(別のワイヤ)を使用してメインに割り込み信号を送信することがあります。例としては、タッチスクリーンセンサーからのペンダウン割り込み、温度センサーからの温度制限アラート、リアルタイムクロックチップによって発行されるアラーム、SDIO [注8]、オーディオコーデックのオーディオジャック挿入などがあります。メインへの割り込みは、ポーリングを使用して偽装することもできます( USB 1.1および2.0と同様)。
ソフトウェア設計
SPI は、「バス ドライバー」ソフトウェア設計に適しています。接続されたデバイスのソフトウェアは、実際の低レベル SPI ハードウェアを処理する「バス ドライバー」を呼び出すように記述されます。これにより、接続されたデバイスのドライバー コードを他のハードウェアまたはビットバンギングソフトウェア実装に簡単に移植できます。
プロトコルのビットバンギング
以下の疑似コードは、SPI プロトコルのソフトウェア実装 (「ビットバンギング」) を、同時出力と入力を備えたメインとして概説しています。この疑似コードは CPHA=0 および CPOL=0 用であり、 CSがアクティブになる前に SCLK が低く引き下げられ、ビットは SCLK の立ち上がりエッジで入力され、ビットは SCLK の立ち下がりエッジで出力されます。
- SCLKを低く、CSを高く初期化する
- CSを低く引くとサブが選択されます
- 転送するバイト数に応じてループする: [注 9]
- CSをハイに引き上げてサブの選択を解除する
サブのプロトコルのビットバンギングは、上記と似ていますが異なります。実装には、CS が下がるまでビジー待機するか、 CS が下がったときに割り込みルーチンをトリガーし、その後、受信した SCLK が適切に変化したときに、転送サイズの長さに応じてビットをシフトインおよびシフトアウトすることが含まれる場合があります。
バストポロジー
前の操作セクションでは、単一のサブとの基本インターフェイスに焦点を当てましたが、SPI は、マルチドロップ、デイジー チェーン、またはエクスパンダー構成を使用して、複数のサブと通信できます。
マルチドロップ構成

マルチドロップ バス構成では、各サブは独自のCSを持ち、メインは一度に 1 つだけ選択します。MISO、SCLK、MOSI はそれぞれすべてのデバイスで共有されます。これは SPI の通常の使用方法です。
サブのMISOピンは相互に接続されているため、トライステートピン(高、低、または高インピーダンス)である必要があり、サブが選択されていないときは高インピーダンス出力を適用する必要があります。トライステートをサポートしていないサブデバイスは、CS信号によって制御されるトライステートバッファチップを追加することで、マルチドロップ構成で使用できます。[3](サブごとに1つの信号ラインのみをトライステートにする必要があるため、独立したゲート入力を持つ4つのトライステートバッファを含む1つの一般的な標準ロジックチップを使用して、最大4つのサブデバイスをSPIバスにインターフェイスできます)
注意: すべてのCS信号は、初期化メッセージをサブに送信する前にハイで開始する必要があります (チップが選択されていないことを示すため)。そうすることで、初期化されていない他のサブは、自分宛てではないメッセージを無視します。メインがCSに汎用入出力 (GPIO) ピン(デフォルトで未定義の状態になる場合があります)を使用し、メインが各デバイスを初期化するために別のソフトウェア ライブラリを使用する場合、これは懸念事項となります。1 つの解決策は、これらのソフトウェア ライブラリのいずれかから初期化コードを実行する前に、 CSに使用されるすべての GPIO がすべてのサブに高電圧を出力するように構成することです。もう 1 つの解決策は、各CSにプルアップ抵抗を追加して、すべてのCS信号が最初にハイになるようにすることです。[3]
デイジーチェーン構成

SPI を実装する製品の中には、デイジー チェーン構成で接続されるものがあり、最初のサブの出力が 2 番目のサブの入力に接続され、次のサブが同様に接続されて、最後のサブの出力がメインの入力に戻されます。これにより、各サブの個々の通信シフト レジスタが実質的に統合され、チェーンを通じてデータをシフトする 1 つの大きな統合シフト レジスタが形成されます。この構成では、サブごとに個別のCSラインではなく、メインからのCSラインが 1 つだけ必要です。[7]
SPI固有のサブを使用することに加えて、デイジーチェーンSPIには、より多くの入力ピン(例えば、パラレル入力シリアル出力74xx165を使用)[ 8 ]または出力(例えば、シリアル入力パラレル出力 74xx595を使用)[9]を無制限にチェーンするための個別のシフトレジスタを含めることができます。デイジーチェーンSPIと相互運用できる可能性のある他のアプリケーションには、SGPIO、JTAG、[10] 、およびI2Cがあります。
エクスパンダー構成
エクスパンダー構成では、SPI 制御のアドレス指定ユニット (バイナリ デコーダー、デマルチプレクサー、シフト レジスタなど) を使用してチップ選択を追加します。
例えば、1つのCSはSPI制御のデマルチプレクサに選択信号を制御するインデックス番号を送信するために使用でき、別のCSはそのインデックスに従ってデマルチプレクサを経由してルーティングされ、目的のサブを選択することができます。[11]
長所と短所
利点
- このプロトコルのデフォルトバージョンでは全二重通信
- プッシュプルドライバ(オープンドレインとは対照的に)は比較的良好な信号整合性と高速性を提供する。
- I²CやSMBusよりも高いスループット
- ただし、SPI のプロトコルには最大クロック速度はありません。
- 個々のデバイスは許容クロック周波数を指定します
- 配線と電子機器が周波数を制限する
- ただし、SPI のプロトコルには最大クロック速度はありません。
- 転送ビットの完全なプロトコル柔軟性
- 8ビットシンボルに限定されない
- メッセージのサイズ、内容、目的を任意に選択
- シンプルなハードウェアとインターフェース
- サブのハードウェア実装には選択可能なシフトレジスタのみが必要です
- サブはメインのクロックを使用するため、高精度の発振器は必要ありません。
- サブはI²CやGPIBやSCSIとは異なり、固有のアドレスを必要としません 。
- メイン電源には、クロック信号とCS信号の生成のみ追加で必要となる
- シンプルなビットバンギングソフトウェア実装を実現
- ICパッケージ上の4つのピンと、ボードレイアウトやコネクタ内の配線のみを使用するため、パラレルインターフェースよりもはるかに少ない
- デバイスごとに最大1つの固有信号(CS)。その他はすべて共有されます。
- 注: デイジーチェーン構成では、共有CSが1つ以上必要ありません。
- デバイスごとに最大1つの固有信号(CS)。その他はすべて共有されます。
- 回路が少ないため(プルアップ抵抗を含む)、通常はI²CやSMBusよりも電力要件が低くなります。
- シングルメインは、CANバスとは異なり、バス調停(および関連する障害モード)がないことを意味します。
- CANバスとは異なり、トランシーバーは不要です
- 信号は一方向なので、ガルバニック絶縁が容易です。
- サブのハードウェア実装には選択可能なシフトレジスタのみが必要です
デメリット
- 3線式バリアントでも、ICパッケージにはI²Cよりも多くのピンが必要です。
- RS-232、RS-485、CANバスに比べて短い距離しか扱えません(ただし、 RS-422などのトランシーバーを使用すれば距離を延長できます)。
- 異なるSPIモードを使用する複数のサブが必要な場合、拡張性が大幅に低下します。
- メインを頻繁に異なるモードで再初期化する必要がある場合、アクセスが遅くなります。
- 正式な基準はない
- したがって適合性を検証することは不可能である
- 既存のバリエーションが多すぎてサポートが複雑
- いくつかの利便性のための組み込みプロトコルサポートはありません:
- サブによるハードウェアフロー制御はありません (ただし、メインは次のクロックエッジを遅延させて転送速度を遅くすることができます)
- ハードウェア サブの確認応答なし (メインがどこにも送信していない可能性があり、それを認識していない)
- エラーチェックプロトコルなし
- ホットスワップ(ノードの動的追加)なし
- 割り込みはSPIの範囲外です(§割り込みを参照)
アプリケーション
SPIは、次のようなさまざまな周辺機器と通信するために使用されます。
- センサー:温度、圧力、ADC、タッチスクリーン、ビデオゲームコントローラー
- 制御デバイス:オーディオコーデック、デジタルポテンショメータ、DAC
- カメラレンズ: Canon EF レンズマウント
- 通信:イーサネット、USB、USART、CAN、IEEE 802.15.4、IEEE 802.11
- メモリ:フラッシュとEEPROM
- リアルタイムクロック
- LCD、時には画像データの管理にも使用される
- 任意のMMCまたはSDカード(SDIOバリアントを含む[注8])
- 追加I/O用のシフトレジスタ[8] [9]
パラレルバスと比較した場合、ボード面積と配線の節約は大きく、SPIは組み込みシステムで確固たる地位を築いています。これは、ARM、MIPS、PowerPCなどのハイエンド32ビットプロセッサと、 AVR、PIC、MSP430などのローエンドマイクロコントローラの両方を含むほとんどのシステムオンチッププロセッサに当てはまります。これらのチップには通常、メインモードまたはサブモードで実行できるSPIコントローラが含まれています。システム内でプログラム可能なAVRコントローラ(ブランクのコントローラを含む)は、SPIを使用してプログラムできます。[12]
チップまたはFPGAベースの設計では、内部コンポーネント間の通信に SPI が使用されることがあります。オンチップの面積は、オンボードの面積と同じくらい高価になることがあります。また、高性能システムの場合、FPGA は、ホストへのサブとして、センサーへのメインとして、または SRAM ベースの場合はブートストラップに使用されるフラッシュ メモリとして、SPI を使用することがあります。
全二重機能により、SPI はシングル メイン/シングル サブのアプリケーションに非常にシンプルで効率的になります。一部のデバイスでは、デジタル オーディオ、デジタル信号処理、または通信チャネルなどのアプリケーションに効率的で迅速なデータ ストリームを実装するために全二重モードを使用しますが、市販のチップのほとんどは半二重の要求/応答プロトコルに従います。
バリエーション
SPI 実装には、さまざまなプロトコル バリエーションがあります。デバイスの中には送信専用のものもあれば、受信専用のものもあります。チップ セレクトは、アクティブ ローではなくアクティブ ハイになる場合があります。デバイスによっては、最下位ビットを最初に送信します。信号レベルは、関係するチップによって完全に異なります。ベースライン SPI プロトコルにはコマンド コードはありませんが、デバイスごとに独自のコマンド コードのプロトコルを定義できます。バリエーションの中には、マイナーまたは非公式のものもありますが、公式の定義ドキュメントがあるものもあり、別個の関連プロトコルと見なすことができます。
元の定義
モトローラは1983年に 「シリアル周辺機器インタフェース」を統合した3つの6805 8ビットマイクロコンピュータをリストアップしました[13] 。その機能は1984年のマニュアルに記載されています。 [14]
AN991
モトローラの1987年アプリケーションノードAN991「シリアルペリフェラルインタフェースを使用した複数のマイクロコンピュータ間の通信」[15](現在はNXPの傘下、最終改訂2002年[5])は、非公式にSPIの「公式」定義文書として機能しています。
タイミングの変動
一部のデバイスでは、モトローラの CPOL/CPHA モードとは異なるタイミングが採用されています。サブからメインへのデータ送信では、メインからサブへの送信とは反対のクロック エッジが使用される場合があります。デバイスでは、最初のクロックの前、最後のクロックの後、またはコマンドとその応答の間に、追加のクロック アイドル時間が必要になることがよくあります。
一部のデバイスには 2 つのクロックがあり、1 つはデータを読み取るためのクロック、もう 1 つはデータをデバイスに送信するためのクロックです。読み取りクロックの多くは、チップ選択ラインから実行されます。
送信サイズ
異なる送信ワード サイズが一般的です。多くの SPI チップは、8 ビットの倍数のメッセージのみをサポートします。このようなチップは、JTAGまたはSGPIOプロトコル、または 8 ビットの倍数ではないメッセージを必要とするその他のプロトコルと相互運用できません。
チップセレクトなし
一部のデバイスではチップセレクトを使用せず、代わりに他の方法を使用してプロトコル ステート マシンのエントリ/終了を管理します。
コネクタ
SPI 用の外部コネクタが必要な人は、独自のコネクタを定義するか、UEXT、Pmod、さまざまなJTAG コネクタ、セキュア デジタルカード ソケットなど の別の標準接続を使用します。
フロー制御
一部のデバイスでは、データの準備ができたことを示すサブからメインへの追加のフロー制御信号が必要です。これにより、通常の 4 線式ではなく 5 線式プロトコルになります。このような準備完了または有効信号はアクティブ ローであることが多く、コマンドの後やワード間などの重要なポイントで有効にする必要があります。このような信号がないと、サブの応答時間の最悪のケースに対応するために、データ転送速度を大幅に遅くしたり、プロトコルにダミー バイトを挿入したりする必要がある可能性があります。例としては、ADC 変換の開始、フラッシュ メモリの適切なページのアドレス指定、デバイス ファームウェアが応答の最初のワードをロードできるほどのコマンドの処理などがあります。(多くの SPI メインは、その信号を直接サポートしておらず、代わりに固定遅延に依存しています。)
セーフSPI
SafeSPI [16]は自動車アプリケーションにおけるSPIの業界標準であり、主に異なるデバイス間でのセンサーデータの伝送に重点を置いています。
信頼性の高い改造
電気的ノイズの多い環境では、SPIは信号が少ないため、 SPIを低電圧差動信号方式に適応させることでコモンモードノイズの影響を減らすことが経済的です。[17]もう1つの利点は、制御対象デバイスをループバックして信号の整合性をテストするように設計できることです。[18]
インテリジェントSPIコントローラ
キュー型シリアル周辺機器インタフェース(QSPI ; § Quad SPIで説明されているQuad SPIとは異なりますが、略語は同じです)は、データキューを使用してSPIバスを介してデータを転送するSPIコントローラの一種です。 [19] CPUからの断続的な処理のみでキューとの間の連続転送を可能にするラップアラウンドモードがあります。その結果、周辺機器はCPUに対してメモリマップされた並列デバイスのように見えます。この機能は、 A/Dコンバータの制御などのアプリケーションで役立ちます。キュー型SPIの他のプログラム可能な機能には、チップセレクトと転送長/遅延があります。
異なるベンダーの SPI コントローラは、異なる機能セットをサポートしています。このようなダイレクト メモリ アクセス(DMA) キューは珍しくありませんが、マルチチャネル バッファ シリアル ポート( MCBSP )で使用されるものなど、SPI コントローラ自体ではなく別の DMA エンジンに関連付けられている場合があります。 [注 11]ほとんどの SPI メイン コントローラは、最大 4 つのチップ セレクトのサポートを統合していますが、[注 12]一部のコントローラでは、チップ セレクトを GPIO ラインを介して個別に管理する必要があります。
キューSPIはクアッドSPIとは異なり、一部のプロセッサでは単一の「QSPI」インターフェースがクアッドモードまたはキューモードのいずれかで動作することを許可しているという紛らわしい点に注意してください。 [20]
マイクロワイヤー
Microwire [21]は、しばしばμWireと綴られ、本質的にはSPIの前身であり、ナショナルセミコンダクターの商標です。これはSPIの厳密なサブセットであり、半二重でSPIモード0を使用します。Microwireチップは、新しいSPIバージョンよりも低いクロックレートを必要とする傾向があります。おそらく2MHz対20MHzです。一部のMicrowireチップは3線式モードもサポートしています。
マイクロワイヤー/プラス
Microwire/Plus [22]はMicrowireの拡張版であり、全二重通信とSPIモード0および1のサポートを特徴としています。シリアルクロック速度の改善は特にありませんでした。
3線式
半二重モードに制限された SPI の 3 線式バリアントは、SPI の 2 つの単方向ライン (MOSI と MISO) の代わりに、SISO (サブ出力/サブ入力) または MOMI (メイン出力/メイン入力) と呼ばれる単一の双方向データ ラインを使用します。3 線式は、システム起動時にのみ使用される小型 EEPROM、特定のセンサー、Microwire などの低パフォーマンスのパーツに使用される傾向があります。このモードをサポートする SPI コントローラはほとんどありませんが、ソフトウェアで簡単にビットバンギングできます。
デュアルSPI
SPI の全二重性が使用されていない場合、拡張機能は両方のデータ ピンを半二重構成で使用して、クロック サイクルごとに 2 ビットを送信します。通常、デュアル モードで応答を要求するコマンド バイトが送信され、その後、MOSI ラインは SIO0 (シリアル I/O 0) になり、偶数ビットを伝送し、MISO ラインは SIO1 になり、奇数ビットを伝送します。データは依然として最上位ビットから送信されますが、SIO1 は各バイトのビット 7、5、3、1 を伝送し、SIO0 はビット 6、4、2、0 を伝送します。
これは大量のデータを送信する必要があるSPI ROMで特に人気があり、2つのバリエーションがあります。[23] [24]
- デュアル読み取りは、シングル モードでメインから送信とアドレスをコマンドし、デュアル モードでデータを返します。
- デュアル I/O コマンドは、コマンドをシングル モードで送信し、次にアドレスを送信してデュアル モードでデータを返します。
クアッドSPI
クアッドSPI(QSPI ; § インテリジェントSPIコントローラで説明されているQueued-SPIとは異なりますが、略称は同じです)はデュアルSPIを超えており、さらに2つのI/Oライン(SIO2とSIO3)を追加し、クロックサイクルごとに4つのデータビットを送信します。これも特別なコマンドによって要求され、コマンド自体がシングルモードで送信された後にクアッドモードが有効になります。[23] [24]
- SQIタイプ1
- コマンドは1行で送信されますが、アドレスとデータは4行で送信されます
- SQI タイプ 2
- コマンドとアドレスは1行で送信されますが、データは4行で送受信されます。
QPI/SQI
クアッドSPIをさらに拡張したデバイスの中には、コマンドを含むすべての通信が4つのデータラインで行われる「クアッドエブリシング」モードをサポートするものもあります。 [25] これは「QPI」[24] ( Intel QuickPath Interconnectと混同しないでください)または「シリアルクアッドI/O」(SQI)[26]とも呼ばれます。
これには、デバイス内の構成ビットをプログラムする必要があり、リセット後に通信を確立するための注意が必要です。
ダブルデータレート
I/Oに複数のラインを使用することに加えて、一部のデバイスでは、2倍のデータレート伝送を使用して転送速度を上げています。[27] [28]
ジャンクション
SPIとJTAG (IEEE 1149.1-2013)プロトコルには類似点がいくつかありますが、互換性はありません。JTAGは、信号遅延とスキューパラメータの精度が低いオフボードコントローラからI/Oピンへの信頼性の高いテストアクセスを提供することを特に目的としていますが、SPIにはさまざまな用途があります。厳密にはレベルセンシティブなインターフェイスではありませんが、JTAGプロトコルは、クロックレートを下げるかクロックのデューティサイクルを変更することで、JTAGデバイス間のセットアップ違反とホールド違反の両方の回復をサポートします。したがって、JTAGインターフェイスは、非常に高いデータレートをサポートするようには設計されていません。[29]
SGPI01 の新機能
SGPIO は本質的に、特定のバックプレーン管理アクティビティ用に設計された SPI 用の別の (互換性のない) アプリケーション スタックです。[引用が必要] SGPIO は 3 ビットのメッセージを使用します。
Intel の拡張シリアル ペリフェラル インターフェイス
インテルは、 LPC ( Low Pin Count ) バスの後継として、拡張シリアル周辺機器インターフェイス (eSPI)バスを開発しました。インテルは、マザーボードに必要なピン数を減らして LPC に比べてスループットを向上させ、動作電圧を 1.8 ボルトに下げてチップ製造プロセスの小型化を促進し、eSPI 周辺機器がホストと SPI フラッシュデバイスを共有できるようにし (LPC バスでは LPC 周辺機器によるファームウェアハブの使用は許可されていませんでした)、以前の帯域外ピンを eSPI 経由でトンネルし、システム設計者がコストとパフォーマンスをトレードオフできるようにすることを目指しています。[30] [31]
eSPIバスは、ピンを節約するためにSPIデバイスと共有することも、特にeSPIデバイスがSPIフラッシュデバイスを使用する必要がある場合に、SPIバスから分離してパフォーマンスを向上させることもできます。[30]
この規格は、eSPI サブがメインにサービスを要求するために使用する Alert# 信号を定義します。パフォーマンス重視の設計または eSPI サブが 1 つだけの設計では、各 eSPI サブの Alert# ピンが各サブ専用の eSPI メインの Alert# ピンに接続され、eSPI メインは低レイテンシのサービスを許可できます。これは、eSPI メインがどの eSPI サブがサービスを必要としているかを認識し、どのデバイスがサービスを必要としているかを判断するためにすべてのサブをポーリングする必要がないためです。複数の eSPI サブを備えた低予算の設計では、サブのすべての Alert# ピンがワイヤード OR接続で eSPI メインの 1 つの Alert# ピンに接続されます。このため、サービスを必要とする 1 つ以上の周辺機器によって Alert# 信号が低く引き下げられた場合、メインはすべてのサブをポーリングして、サービスを必要とするサブを判断する必要があります。すべてのデバイスがサービスされた後にのみ、eSPI サブのいずれもサービスを必要としないため Alert# 信号が低く引き下げられ、Alert# 信号が高くなります。[30]
この規格により、設計者は20~66MHzの速度で1ビット、2ビット、または4ビットの通信を使用でき、パフォーマンスとコストのバランスをとることができます。[30]
汎用入出力(GPIO)やシステム管理バス(SMBus)などのLPCの帯域外通信はすべて、それぞれ仮想ワイヤサイクルと帯域外メッセージサイクルを介してeSPIを介してトンネリングされ、eSPIを使用するマザーボード設計からこれらのピンが削除されます。[30]
この規格は、1 バイトから 4 キロバイトのデータ長の標準メモリ サイクル、標準メモリ サイクルに比べてオーバーヘッドがはるかに少ない 1、2、または 4 バイトの長さの短いメモリ サイクル、および同様にオーバーヘッドが低い 1、2、または 4 バイトのデータ長の I/O サイクルをサポートしています。これにより、128 バイトのファームウェア ハブ読み取りサイクルを除くすべてのサイクルがバスのスループットと時間全体の半分以上をオーバーヘッドに費やしている LPC バスに比べて、オーバーヘッドが大幅に削減されます。標準メモリ サイクルでは、1 バイトから 4 キロバイトまでの長さが許可されているため、その大きなオーバーヘッドを大規模なトランザクションで償却できます。eSPI サブは、すべてのメモリ サイクルのバス マスター バージョンを開始できます。LPC バス仕様で導入されたバス マスター I/O サイクル、および LPC バス仕様で導入された 32 ビット バリアントを含む ISA スタイルの DMA は、eSPI には存在しません。したがって、この規格ではバスマスターメモリサイクルのみがDMAとして許可されています。[30]
eSPIサブは、eSPIメインをプロキシとして使用して、要求元のeSPIサブに代わって標準SPIフラッシュメモリサブ上でフラッシュ操作を実行することができます。[30]
64ビットのメモリアドレス指定も追加されましたが、同等の32ビットアドレスが存在しない場合にのみ許可されます。[30]
Intel Z170チップセットは、このバスか、ISAスタイルのDMA機能がなく、標準の33MHzではなく24MHzにアンダークロックされたLPCバスの変種のいずれかを実装するように構成できます。[32]
eSPI バスはAMD Ryzenチップセットにも採用されています。
開発ツール
シングルボードコンピュータ
シングルボードコンピュータは、 SPI ハードウェアユニットへのピンアクセスを提供する場合があります。たとえば、Raspberry Pi の J8 ヘッダーは、Linux ドライバーまたはPython経由で使用できる少なくとも 2 つの SPI ユニットを公開します。
USB から SPI へのアダプタ
USBを搭載したデスクトップPCやスマートフォンがSPIチップ(FT 221xs [33]など)と通信できるようにするUSBアダプタは多数あります。これらは組み込みシステム、チップ( FPGA、ASIC、SoC )や周辺機器のテスト、プログラミング、デバッグに使用されます。また、多くのアダプタはスクリプトやプログラミング機能も提供しています(Visual Basic、C / C++、VHDLなど)。
主要な SPI パラメータは、シリアル インターフェイスでサポートされる最大周波数、コマンド間の遅延、および SPI コマンドの最大長です。現在、市場では、事実上無制限のアクセス長で最大 100 MHz のシリアル インターフェイスをサポートする SPI アダプタを見つけることができます。
SPIプロトコルは事実上の標準であるため、一部のSPIホストアダプタは、従来の4線式SPI以外のプロトコルをサポートする機能も備えています(たとえば、Quad-SPIプロトコルやSPIから派生した他のカスタムシリアルプロトコルのサポート[34])。
プロトコルアナライザー
ロジック アナライザは、高速波形を収集、タイムスタンプ付け、分析、デコード、保存、表示してデバッグと開発を支援するツールです。ほとんどのロジック アナライザには、SPI バス信号を人間が判読できるラベル付きの高レベル プロトコル データにデコードする機能があります。
オシロスコープ
SPI波形はアナログチャンネル(および/またはミックスドシグナルオシロスコープのデジタルチャンネル経由)で見ることができます。[35]ほとんどのオシロスコープベンダーは、トリガー付きのSPIプロトコル解析(2線式、3線式、4線式SPIの両方)のオプションサポートを提供しています。
代替用語
4 つの一般的な SPI 信号には、さまざまな代替略語が使用されます。(このセクションでは、アクティブ ローを示すオーバーバーは省略します。)
- シリアルクロック
- SCK、SCLK、CLK、SCL
- メイン出力、サブ入力(MOSI)
- SIMO、MTSR、SPID - メインデバイスとサブデバイスの両方のMOSIに対応し、相互に接続します。
- SDI、DI、DIN、SI、SDA - サブデバイス上。シリアルデータ入力のさまざまな略語。メインのMOSIに接続します。
- SDO、DO、DOUT、SO - メインデバイス上。シリアルデータ出力のさまざまな略語。サブ上のMOSIに接続。
- COPI、PICO(周辺機器とコントローラ) [ 36] [37]、またはCOTI(コントローラとターゲット)[38]
- メイン入力、サブ出力(MISO)
- SOMI、MRST、SPIQ - メインデバイスとサブデバイスの両方のMISOに対応し、相互に接続します
- SDO、DO、DOUT、SO - サブデバイス上; メインのMISOに接続
- SDI、DI、DIN、SI - メインデバイス上; サブ上のMISOに接続
- CIPO、POCI、[36] [37]または CITO [38]
- チップセレクト(CS)
- CE (チップイネーブル)
- 履歴: SS (スレーブ選択)、SSEL、NSS、/SS、SS# (サブ選択)
マイクロチップ社はMOSIとMISOという略語を使いながらも、ホストとクライアントを使用している。 [39]
参照
注記
- ^ モトローラのマニュアルのビットセーバー アーカイブで「シリアル ペリフェラル インターフェイス」について最も明確に言及されているのは 1983 年のことです (§ 元の定義を参照)。Web 上のいくつかの情報源では、モトローラが 68000 が発表された 1979 年に SPI を導入したと主張していますが、その多くは人為的または推測であるように思われ、モトローラの 1983 年の 68000 マニュアルには「シリアル ペリフェラル インターフェイス」についての言及がないため、1979 年という日付は信頼できる情報ではないようです。その頃のモトローラからの明確な情報源がある場合のみ、特定の設計日付を追加してください。
- ^ main と sub を使用すると、行名と同期するために同じ最初の文字が維持されます。たとえば、MISO は「main in, sub out」と展開できます。
- ^ § 代替用語のセクションでは、提案されている代替用語についてさらに詳しく説明しています。進行中の議論についてはトークページを参照してください。
- ^ 特定のトランザクションでは、1 つのデバイスのみがメインになります。ただし、一部のデバイスでは、メインとサブの役割をオンザフライで変更できます。ほとんどのマイクロコントローラは SPI の役割を簡単に再構成でき、一部の Atmel および Silabs デバイスは外部ピンに応じて役割を変更できます。
- ^ 一部のサブウーファーでは、アクションを開始するためにチップセレクト信号の立ち下がりエッジが必要です。例としては、高→低遷移で変換を開始する Maxim MAX1242 ADC があります。
- ^ 送信は通常 8 ビット ワードで構成されます。ただし、他のワード サイズも一般的です。たとえば、Texas Instruments の TSC2101 などのタッチ スクリーン コントローラやオーディオ コーデックの 16 ビット ワード、多くのデジタル - アナログ コンバータやアナログ - デジタル コンバータの 12 ビット ワードなどです。
- ^ 元の仕様には、データを最下位ビット (LSB) から先に転送するか最上位ビット (MSB) から先に転送するかを制御する LSBFE (「LSB ファースト イネーブル」) があります。
- ^ ab SPI の半二重実装の SDIO (シリアル データ I/O) ライン (「3 線式」SPI とも呼ばれる) と混同しないでください。ここでは、たとえばメインの MOSI (抵抗器経由) と MISO (抵抗器なし) がサブの SDIO ラインに接続されます。
- ^ 周辺機器は、データシートに指定されているように、選択時に特定の数(または任意の数)の転送バイトを許可または要求する場合があります。
- ^ SPI は通常、最上位ビットを最初に送信するため、左シフトが使用されます。代わりに右シフトを使用して、最下位ビットを最初に転送することもできます。
- ^ Texas Instruments OMAP チップで使用されるマルチチャネル シリアル ポート インターフェイス (McSPI) など。(https://www.ti.com/product/OMAP3530)
- ^ at91sam9G20 のような Atmel AT91 チップ上の SPI コントローラは、TI の McSPI よりもはるかにシンプルです。
参考文献
- ^ Dhaker, Piyu (2018). 「SPI インターフェース入門」. Analog Dialogue . 2023-05-25 時点のオリジナルよりアーカイブ。2023-07-21取得。
- ^ 「シリアル同期インターフェース (SSI) とは何ですか?」2015 年 1 月 28 日閲覧。
- ^ abc 3ステップでSPIバス設計を改善
- ^ SPI ブロック ガイド v3.06; Motorola/Freescale/NXP; 2003 年。
- ^ ab 「AN991/D: シリアル周辺機器インタフェースを使用した複数のマイクロコンピュータ間の通信」(PDF)。NXP 。2004 [1994] 。2023-04-04 にオリジナルからアーカイブ(PDF) 。2021-10-14に取得。
- ^ 「TMS320x281x シリアル周辺機器インターフェースリファレンスガイド」。Texas Instruments。2002年。16~17ページ。
- ^ Maxim-IC アプリケーションノート 3947: 「SPI デバイスのデイジーチェーン接続」
- ^ ab Gammon, Nick (2013-03-23). 「Gammon Forum : Electronics : Microprocessors : Using a 74HC165 input shift register」. Gammon Forum . 2023-07-29 にオリジナルからアーカイブ。 2023-08-03に取得。
- ^ ab Gammon, Nick (2012-01-31). 「Gammon Forum : Electronics : Microprocessors : Using a 74HC595 output shift register as a port-expander」. Gammon Forum . 2023-07-14 にオリジナルからアーカイブ。 2023-08-03に取得。
- ^ インターフェース、1977年、80、84ページ
- ^ 「シリアル制御マルチプレクサが SPI チップセレクトを拡張」(PDF)。Premier Farnell 。 2001-07-01。 2019-08-19 のオリジナル(PDF)からアーカイブ。
- ^ 「AVR910 - インシステムプログラミング」(PDF)。2011年3月2日時点のオリジナル(PDF)からアーカイブ。
- ^ コンポーネント :: モトローラ :: データブック :: 1983 モトローラ 8 ビット マイクロプロセッサおよび周辺機器データ。
- ^ motorola :: dataBooks :: 1984 Motorola シングルチップ マイクロコンピュータ データ。
- ^ 「シリアル周辺機器インターフェースを使用した複数のマイクロコンピュータ間 の通信」(PDF) 。Bitsavers。
- ^ SafeSPI.org
- ^ 「LVDS インターフェースを介した SPI の送信」(PDF) . Texas Instruments . 2021 年2 月 14 日閲覧。
- ^ 「SPI マスター ループバックの例」。Nordic Semiconductor . 2021 年2 月 14 日閲覧。
- ^ 「Freescale Semiconductor, Inc. - QSM - Queued Serial Module - Reference Manual」(PDF) . NXP . 1996 [1991]. 2019年8月24日時点のオリジナル(PDF)からアーカイブ。
- ^ 「Quad-SPI が高速パラレルデータ伝送を実現」Cadence Design Systems 2023-01-11。2023-06-01 にオリジナルからアーカイブ。2023-06-30に取得。
- ^ MICROWIRE シリアル インターフェイス National Semiconductor アプリケーション ノート AN-452
- ^ COP800 ファミリー向け MICROWIRE/PLUS シリアル インターフェイス National Semiconductor アプリケーション ノート AN-579
- ^ ab 「W25Q16JV 3V 16Mビットシリアルフラッシュメモリ、デュアル/クアッドSPI搭載」(PDF) (データシート)。リビジョンD。Winbond 。 2016年8月12日。 2017年2月10日閲覧。
- ^ abc 「D25LQ64 1.8V ユニフォーム セクター デュアルおよびクアッド SPI フラッシュ」(PDF) (データ シート)。バージョン 0.1。GigaDevice。2011 年 2 月 11 日。2017年 2 月 12 日時点のオリジナル(PDF)からアーカイブ。2017 年 2 月10 日閲覧。
- ^ 「QuadSPI フラッシュ: Quad SPI モードと QPI モード」。NXPコミュニティ フォーラム。2014 年 12 月。2016 年 2 月 10 日閲覧。
- ^ 「SST26VF032B / SST26VF032BA 2.5V/3.0V 32 Mbit シリアルクアッドI/O (SQI) フラッシュメモリ」(PDF) (データシート)。バージョン E。Microchip , Inc. 2017 。 2017年2月10日閲覧。
- ^ Patterson, David (2012 年 5 月)。「Quad Serial Peripheral Interface (QuadSPI) モジュールのアップデート」(PDF) (アプリケーション ノート)。Freescale Semiconductor。2016年9 月 21 日閲覧。
- ^ Pell, Rich (2011 年 10 月 13 日). 「SPI-DDR NOR フラッシュ メモリを使用したパフォーマンスの向上」. EDN .
- ^ IEEE 1149.1-2013
- ^ abcdefgh 拡張シリアル周辺機器インターフェイス (eSPI) インターフェイス ベース仕様 (クライアントおよびサーバー プラットフォーム用) (PDF) (レポート)。リビジョン 1.0。Intel。2016 年 1 月。文書番号 327432-004。2017年 2 月 5 日に取得。
- ^ 拡張シリアル周辺機器インターフェイス (eSPI) インターフェイス仕様 (クライアント プラットフォーム用) (PDF) (レポート)。リビジョン 0.6。Intel。2012 年 5 月。文書番号 327432-001EN。2017年 2 月 5 日に取得。
- ^ 「Intel® 100 シリーズ チップセット ファミリー PCH データシート、Vol. 1」(PDF) 。2015 年4 月 15 日閲覧。
- ^ 「USB to SPI converter」. FTDI . 2020年8月2日. 2021年2月14日閲覧。
- ^ SPI Storm – カスタム シリアル プロトコルをサポートするシリアル プロトコル ホスト アダプター、Byte Paradigm。
- ^ 「Infiniium スコープ用 N5391B I²C および SPI プロトコル トリガーおよびデコード」。
- ^ ab SPI; OSHWA.
- ^ ab https://www.ti.com/lit/an/scea091a/scea091a.pdf [単なる URL PDF ]
- ^ ab 「シリアルペリフェラルインターフェース(SPI)デバイス」。NXP。2023年6月1日時点のオリジナルよりアーカイブ。2023年7月22日閲覧。
- ^ Stoicescu, Alin. 「シリアル ペリフェラル インターフェイス (SPI) 入門」。Microchip Technology。2023年 12 月 21 日時点のオリジナルよりアーカイブ。2023年 12 月 21 日閲覧。
外部リンク
- Intel eSPI (拡張シリアル周辺機器インターフェイス)
- SPIチュートリアル
