SPI(Serial Peripheral Interface)とは?徹底解説!

1. SPIとは?

SPI(Serial Peripheral Interface)は、主にマイコンMCU)と周辺機器(センサー、メモリ、ディスプレイなど)を接続するためのシリアル通信プロトコルの一つです。モトローラ(現NXP)によって開発され、高速でフルデュプレックス通信が可能な点が特徴です。

2. SPIの基本構成

SPIは、マスター(Master)とスレーブ(Slave)の関係で動作し、以下の4本の信号線を使用します。

  1. MOSI(Master Out Slave In)
    • マスターからスレーブへデータを送信する線
  2. MISO(Master In Slave Out)
    • スレーブからマスターへデータを送信する線
  3. SCLK(Serial Clock)
    • マスターが生成するクロック信号
  4. SS(Slave Select)
    • スレーブを選択する信号(低電位で選択)

SPIの動作イメージ

マスター(MCU) ───> MOSI ───> スレーブ(センサー)
マスター(MCU) <─── MISO <─── スレーブ(センサー)
マスター(MCU) ───> SCLK ───> スレーブ(センサー)
マスター(MCU) ───> SS ───> スレーブ(センサー)

3. SPIの動作モード

SPIには4つの動作モードがあり、クロック極性(CPOL)とクロック位相(CPHA)の組み合わせで決まります。

モード CPOL CPHA クロックの立ち上がり/下がり
0 0 0 立ち上がりでサンプリング
1 0 1 下がりでサンプリング
2 1 0 下がりでサンプリング
3 1 1 立ち上がりでサンプリング

4. SPIのメリット・デメリット

メリット

高速通信(I²Cよりも速い)
フルデュプレックス通信(送受信を同時に行える)
ハードウェア制御がシンプル

デメリット

スレーブごとにSSピンが必要(複数スレーブを接続するとピン数が増える)
マルチマスターには不向き

5. SPIの活用例

6. ArduinoでSPIを使う

Arduinoでは、SPI.hライブラリを使うことで簡単にSPI通信を実装できます。

cpp
#include <SPI.h>
 
void setup() {
 SPI.begin(); // SPIを初期化
 SPI.setClockDivider(SPI_CLOCK_DIV16); // クロック速度を設定
 digitalWrite(SS, LOW); // スレーブ選択
 SPI.transfer(0xAA); // データ送信
 digitalWrite(SS, HIGH); // スレーブ解除
}
 
void loop() {}

7. まとめ

SPIは、高速・フルデュプレックス通信が可能な強力なインターフェースです。用途によってI²CやUARTと使い分けることで、より効率的なマイコン制御が可能になります。ぜひ、実際にSPI通信を試してみてください!