3.21. SPI の基礎

SPI(Serial Peripheral Interface)は、同一基板上の 1 つのコントローラと 1 つ以上のペリフェラルデバイスとの間で、近距離かつ高速なリンクを実現するために設計された同期式シリアルバスです。SD カード、ディスプレイ、フラッシュメモリ、ADC や DAC、そして幅広いセンサーで使われる標準的なインターフェースです。

UART には共有クロックがなく、データ線そのものからタイミングを復元していました。一方 SPI は、データ線に並んでクロック線を走らせます。コントローラは好きな速度でクロックを駆動し、バス上の他のすべてのデバイスはそのクロックに同期してデータをサンプリングします。ボーレートの推測も、フレーミングのオーバーヘッドもありません。あるのはクロックエッジとビットだけです。

3.21.1. 4 本の線

全二重の SPI バスは 4 本の線で構成されます。

  • SCK(シリアルクロック)。コントローラが駆動します。すべてのビットはこの信号のエッジでクロックイン/クロックアウトされます。

  • MOSI(コントローラ出力、ペリフェラル入力)。コントローラの出力線で、ペリフェラルはここからビットをサンプリングします。

  • MISO(コントローラ入力、ペリフェラル出力)。ペリフェラルの出力線で、コントローラはここからビットをサンプリングします。

  • CS(チップセレクト)。SS(ペリフェラルセレクト)と呼ばれることもあります。ペリフェラルごとに 1 本ずつ用意します。コントローラはトランザクションを開始するときに CS を Low に引き下げ、終了するときに再び High に戻します。CS がデアサートされたペリフェラルはバスを完全に無視し、自身の MISO 出力の駆動も停止します。

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

1 つの SPI バイト。CS が Low になってペリフェラルを選択し、SCK が 8 ビットをクロックし、MOSI と MISO が互いに逆方向にそれぞれ 1 バイトを転送します。

クロックエッジごとに、両方向へ同時に 1 ビットずつ移動します。1 つの SCK パルスは MOSI で 1 ビットを送信すると同時に MISO で 1 ビットを受信します。SPI は配線レベルで 全二重 です。ソフトウェアが両方向を使う必要はありません。書き込み専用や読み出し専用のトランザクションも一般的で、その場合、使わない線は無視されるか High に保たれます。

3.21.2. クロックの極性と位相

どのクロックエッジでデータが移動するかは、2 つの設定ビットによって正確に決まります。

  • クロック極性polarityCPOL とも呼ばれます)。SCK のアイドル状態を表します。0 はクロックが Low でアイドルし High にパルスすることを、1 はクロックが High でアイドルし Low にパルスすることを意味します。

  • クロック位相phaseCPHA とも呼ばれます)。どのエッジでデータをサンプリングするかを表します。0 は各クロックパルスの最初のエッジ(先行エッジ)でサンプリングし、1 は 2 番目のエッジ(後行エッジ)でサンプリングします。

これらを組み合わせると 4 つの モード が得られ、慣習的に Mode 0 から Mode 3 と呼ばれます。Mode 0(polarity=0, phase=0)が最も一般的で、未知のデバイスに対する安全なデフォルトです。

極めて重要なルールは、両端がモードについて一致していなければならないことです。クロック線とデータ線が正しく配線されていても、モードが食い違っているとデタラメなデータになります。最初のトランザクションでデバイスが意味不明な値を返したら、まず最初に確認すべきはモードです。

3.21.3. 複数のペリフェラル

コントローラが駆動する CS 線をそれぞれが個別に持っていれば、複数のペリフェラルが同じ SCK、MOSI、MISO の各線を共有できます。

  • すべてのペリフェラルは同じクロックとデータを見ますが、それぞれが自分の CS を監視します。CS がデアサート(High)されているとき、ペリフェラルは SCK と MOSI を完全に無視し、MISO をハイインピーダンス状態のままにして、他のデバイスと線の取り合いをしないようにします。

  • コントローラは一度にちょうど 1 本だけ CS をアサートし、トランザクションを実行し、CS をデアサートしてバスを解放します。

ハードウェア SPI ブロックを 1 つだけ持つマイクロコントローラでも、CS 線に割ける空き GPIO ピンがある限り、その本数だけペリフェラルと通信できます。バス自体にはアドレッシングの仕組みがありません。

3.21.4. 長所と短所

SPI の長所も短所も、いずれもその設計から生まれます。

  • 高速。 短い配線とシンプルなレベル変換があれば、数十メガヘルツが実現できます。SD カードリーダーや SPI ディスプレイはこれを活用しています。

  • 配線レベルでシンプル。 アドレッシングも、アクノリッジも、特別なスタート/ストップ条件もありません。あるのはクロックに同期した線上のビットだけです。

  • ピンを消費する。 共有線が 3 本に加えて、ペリフェラルごとに CS が 1 本必要です。SPI デバイスが 5 個ある基板では 8 本のピン(3 + 5)を使います。

  • 近距離。 SPI はクリーンで高速なエッジを前提としており、これは同一基板上の短い配線を意味します。より長いリンクには、I2C やフレーム化されたバスのいずれかのほうが適しています。