SPI(エス・ピー・アイ)は、マイコンとセンサー、ディスプレイ、SDカードなどを接続するためによく使われる通信方式です。
SPIでは主にSCLK・MOSI・MISO・CSという信号を使って通信します。I2Cより配線本数は多くなりますが、比較的高速にデータをやり取りできるのが特徴です。
この記事では、SPIとは何か、MOSI・MISO・SCLK・CSの役割、データを送受信する仕組み、SPIモード、I2Cとの違いまで、組み込み開発を始めたばかりの方にも分かるように解説します。
SPIとは?
SPI(Serial Peripheral Interface)は、マイコンと周辺デバイスとの通信によく使われる同期式のシリアル通信方式です。
例えば、次のようなデバイスでSPIが使われています。
- SDカード
- TFT・LCDディスプレイ
- ADコンバータ(ADC)
- DAコンバータ(DAC)
- フラッシュメモリ
- 加速度・ジャイロセンサー
- 無線通信モジュール
マイコンでよく使われる通信方式には、SPIのほかにI2CやUARTがあります。
SPIはI2Cより多くの信号線を使いますが、比較的高速な通信が必要な場面でよく利用されます。
SPIで使う4つの信号線
一般的なSPI通信では、主に次の4種類の信号を使用します。
| 信号 | 役割 |
|---|---|
| SCLK | 通信のタイミングを合わせるクロック信号 |
| MOSI | Controller側からPeripheral側へデータを送る信号 |
| MISO | Peripheral側からController側へデータを送る信号 |
| CS | 通信するデバイスを選択する信号 |
資料によっては、SCLKをSCK、CSをSS(Slave Select)などと表記する場合もあります。
また、従来はMaster / Slaveという名称が広く使われてきましたが、現在ではController / Peripheralなど別の名称を使う資料もあります。古いデータシートやライブラリではMaster / Slave表記も多いため、両方の表現を知っておくとよいでしょう。
MOSIとMISOとは?
SPIを初めて使うときに混乱しやすいのが、MOSIとMISOです。
従来のMaster / Slaveという名称で考えると、意味は次のようになります。
- MOSI(Master Out Slave In):マイコン側から周辺デバイス側へ送る
- MISO(Master In Slave Out):周辺デバイス側からマイコン側へ送る
例えば、マイコンからSDカードへコマンドを送る場合はMOSIを使い、SDカードから読み出したデータをマイコンへ返す場合はMISOを使います。
つまり、マイコンをControllerとして考えるなら、MOSIは出力方向、MISOは入力方向と覚えると理解しやすいでしょう。
SCLKとは?クロックに合わせてデータを送る
SCLK(Serial Clock)は、SPI通信のタイミングを合わせるためのクロック信号です。
Controller側がクロックを生成し、そのクロックに合わせてMOSIやMISO上のデータを送受信します。
例えば8ビットのデータを送る場合、クロックのタイミングに合わせて1ビットずつデータをやり取りします。
このように、別のクロック信号を使って送受信のタイミングを合わせる通信を同期式通信と呼びます。
CSとは?通信するデバイスを選択する
CS(Chip Select)は、複数のSPIデバイスの中からどのデバイスと通信するのかを選択するための信号です。
多くのSPIデバイスでは、CSをLOWにするとそのデバイスが選択され、通信可能な状態になります。
例えば、1台のマイコンにSPI対応のSDカードとディスプレイを接続する場合、SCLK・MOSI・MISOを共有しながら、それぞれに別のCSを接続できます。
通信したいデバイスのCSだけを有効にすることで、通信相手を切り替えます。
SPIにはI2Cのようなアドレスがない
I2Cを学んだあとにSPIを見ると、大きな違いの一つに気付きます。
I2Cでは、同じSDA・SCLに接続されたデバイスをI2Cアドレスによって識別します。
一方、一般的なSPIではI2Cのようなデバイスアドレスを使って通信相手を選択するのではなく、CS信号によって通信相手を選択します。
そのため、SPIデバイスを増やすと、一般的にはデバイスごとにCS用のGPIOが必要になります。
I2Cより配線が増えやすい一方、アドレスの重複を気にせずデバイスを選択できるという特徴があります。
SPIは送信と受信を同時に行える
SPIではMOSIとMISOが別々の信号線になっているため、送信と受信を同時に行うことができます。
このように、双方向へ同時に通信できる方式を全二重通信(Full Duplex)と呼びます。
SPIではクロックが動くたびに、Controller側とPeripheral側の双方でビットをシフトしながらデータを交換していく、と考えると仕組みを理解しやすくなります。
ただし、実際のデバイスでは常に送信と受信の両方を有効に使うとは限りません。ディスプレイへの書き込みなど、実質的に一方向の通信として利用するケースもあります。
SPI通信の基本的な流れ
SPI通信の具体的な手順はデバイスによって異なりますが、基本的なイメージは次のようになります。
- 通信したいデバイスのCSを有効にする
- ControllerがSCLKを出力する
- クロックに合わせてMOSIからデータを送信する
- 必要に応じてMISOからデータを受信する
- 通信が終了したらCSを無効にする
例えばSPI対応センサーから値を読み出す場合は、まずMOSIを使って「このレジスタを読みたい」というコマンドやアドレスを送り、その後MISOからデータを受け取る、といった処理が行われます。
SPI MODE 0~3とは?
SPIを実際に使い始めると、データシートやライブラリの設定でSPI MODE 0、MODE 1、MODE 2、MODE 3という表記を見ることがあります。
これは、クロックの極性と、どのクロックエッジでデータを読み取るかを組み合わせた設定です。
- CPOL(Clock Polarity):通信していないときのクロックレベル
- CPHA(Clock Phase):どのクロックエッジを基準にデータを取り込むか
| SPIモード | CPOL | CPHA |
|---|---|---|
| MODE 0 | 0 | 0 |
| MODE 1 | 0 | 1 |
| MODE 2 | 1 | 0 |
| MODE 3 | 1 | 1 |
ControllerとPeripheralでSPIモードが合っていないと、データを正しく読み取れません。
そのためSPIデバイスを使うときは、データシートで対応するSPIモードを確認することが重要です。
SPIの通信速度はどう決まる?
SPIにはI2CのStandard-modeやFast-modeのような、すべてのデバイスに共通する単一の通信速度が決められているわけではありません。
実際に使用できるSCLKの周波数は、接続するデバイスの仕様、マイコンの性能、配線条件などによって決まります。
高速なクロックを設定できるマイコンであっても、接続先デバイスの最大クロック周波数を超えて使用することはできません。
SPIを設定するときは、使用するデバイスのデータシートに記載された最大クロック周波数を確認しましょう。
SDカードもSPIで通信できる
SPIを使う代表的な例の一つがSDカードです。
SDカードには専用の通信方式がありますが、SPIモードにも対応しているため、マイコンからSPIを使ってアクセスすることができます。
例えばESP32などのマイコンにmicroSDカードモジュールを接続し、センサーから取得したデータをファイルとして保存するといった使い方ができます。
この場合も、SCLK・MOSI・MISO・CSを接続し、マイコンからSDカードへコマンドやデータを送受信します。
KUMITATE-C3でSPIを使う
SPIも、仕組みを読むだけでなく実際のデバイスを接続すると理解しやすくなります。
KUMITATE-C3は、ESP32-C3を搭載した電子工作・組み込みプログラミング学習用ボードです。
拡張コネクタを利用してSPI対応デバイスを接続すれば、SPI通信を使ったプログラムを実際に試すことができます。
例えばmicroSDカードを接続すれば、センサーで取得した値をSDカードへ保存するデータロガーなどへ発展させることもできます。
SPIとI2Cの違い
SPIとI2Cはどちらもマイコンと周辺デバイスの通信によく使われますが、仕組みには大きな違いがあります。
| SPI | I2C | |
|---|---|---|
| 主な信号線 | SCLK・MOSI・MISO・CS | SDA・SCL |
| 通信相手の選択 | CS | I2Cアドレス |
| 複数デバイス | デバイスごとにCSが必要になることが多い | 同じSDA・SCLを共有できる |
| 通信速度 | 比較的高速な通信に向く | SPIより低速な用途で使われることが多い |
| プルアップ抵抗 | 通常は不要 | SDA・SCLに必要 |
| 全二重通信 | 可能 | 基本的に同じSDA線を双方向で使用 |
配線を少なくして複数のセンサーを接続したい場合はI2C、高速に大量のデータを送受信したい場合はSPI、といったように用途に応じて使い分けます。
I2CのSDA・SCL・アドレス・ACKなどの仕組みについては、I2Cとは?SDA・SCL・アドレス・通信の仕組みを初心者向けに解説で詳しく解説しています。
SPIのメリット・デメリット
SPIのメリット
- 比較的高速な通信が可能
- MOSIとMISOが分かれており、全二重通信が可能
- 通信相手をCSで明確に選択できる
- I2Cのようなアドレス重複を基本的に気にする必要がない
- SDカードやディスプレイなど多くのデバイスで利用されている
SPIのデメリット
- I2Cより使用する信号線が多い
- デバイスが増えるとCS用のGPIOも増えやすい
- デバイスごとに対応するSPIモードや最大クロックを確認する必要がある
- 配線が長くなるほど高速通信が難しくなる場合がある
SPI通信がうまくいかないときの確認ポイント
SPIデバイスが動作しない場合は、ソフトウェアだけでなく配線や通信設定も確認しましょう。
- MOSIとMISOを逆に接続していないか
- SCLKが正しいピンに接続されているか
- CSのピン設定が正しいか
- CSのアクティブレベルが正しいか
- SPI MODE(CPOL・CPHA)がデバイスと一致しているか
- SCLKの周波数が高すぎないか
- マイコンとデバイスのGNDが共通になっているか
- 電源電圧やロジックレベルが適切か
信号の状態を詳しく確認したい場合は、ロジックアナライザを使うとSCLK・MOSI・MISO・CSの波形や送受信データを確認できます。
まとめ
- SPIはマイコンと周辺デバイスを接続する同期式シリアル通信
- 主にSCLK・MOSI・MISO・CSを使用する
- MOSIはControllerからPeripheral、MISOはPeripheralからControllerへのデータに使う
- 通信するデバイスはCSによって選択する
- SPIにはMODE 0~3があり、CPOLとCPHAの組み合わせで決まる
- I2Cより配線は増えるが、比較的高速な通信に向いている
SPIは、SDカードやディスプレイなどを扱うときに頻繁に登場する通信方式です。まずは「SCLKでタイミングを合わせ、MOSI・MISOでデータをやり取りし、CSで通信相手を選ぶ」という基本を押さえておきましょう。

