コンテンツにスキップ

SPI

SPIとは

SPI(Serial Peripheral Interface)は、マイコンと周辺機器を高速に接続するためのシリアル通信方式である。

主に以下のような機器との通信に利用される。

  • センサ
  • 液晶ディスプレイ
  • SDカード
  • EEPROM
  • ADC
  • DAC

STM32でも非常によく利用される通信方式の一つである。


特徴

SPIには以下の特徴がある。

メリット

  • 高速通信が可能
  • 通信方式が単純
  • 全二重通信に対応
  • ハードウェアサポートが豊富

デメリット

  • 配線が多い
  • 接続機器が増えると配線も増える
  • I2Cほど省配線ではない

SPIの構成

SPIでは通常4本の信号線を利用する。

信号 説明
SCK クロック
MOSI Master → Slave
MISO Slave → Master
CS(SS) 機器選択

配線例

STM32                    センサ

SCK  -----------------> SCK

MOSI -----------------> MOSI

MISO <----------------- MISO

CS   -----------------> CS

さらにGNDも共有する必要がある。


MasterとSlave

SPIでは通信を管理する側をMasterという。

Asterの場合

STM32
↓
Master

となる場合が多い。

一方、センサなどはSlaveとなる。

温度センサ
↓
Slave

クロック同期

SPIはクロック信号を利用して通信する。

Masterがクロックを生成し、

SCK

に出力する。

Slaveはそのクロックに合わせてデータを送受信する。


MOSI

MOSIは

Master Out Slave In

の略である。

MasterからSlaveへデータを送信する。

例

STM32 → センサ

MISO

MISOは

Master In Slave Out

の略である。

SlaveからMasterへデータを送信する。

例

センサ → STM32

CS

CS(Chip Select)は通信相手を選択するための信号である。

通常は

Low

で選択される。


例

CS = High

通信しない。

CS = Low

通信開始。


複数デバイス接続

SPIは複数のSlaveを接続できる。

                 Sensor1
                     │
                     └── CS1

STM32 ── SPI Bus ─── Sensor2
                     │
                     └── CS2

                     Sensor3
                     │
                     └── CS3

MOSI、MISO、SCKは共有できる。

CSのみ個別に必要となる。


通信例

STM32が

0x55

を送信するとする。

SPIでは

01010101

がクロックに合わせて送信される。

同時にSlave側もデータを返すことができる。


全二重通信

SPIは送信と受信を同時に行える。

STM32
 ↓↑
SPI
 ↓↑
センサ

UARTやI2Cより高速な理由の一つである。


SPIモード

SPIには4つのモードが存在する。

モード CPOL CPHA
Mode0 0 0
Mode1 0 1
Mode2 1 0
Mode3 1 1

CPOL

クロックの待機状態を決める。

0 → Low

1 → High

CPHA

どのタイミングでデータを読むかを決める。

0 → 最初のエッジ

1 → 次のエッジ

STM32での利用

STM32にはSPIペリフェラルが内蔵されている。

CubeMXで有効化するだけで利用できる。

例

SPI1

Master Mode

8bit

Mode0

STM32コード例

送信

uint8_t data = 0x55;

HAL_SPI_Transmit(
    &hspi1,
    &data,
    1,
    100
);

受信

uint8_t data;

HAL_SPI_Receive(
    &hspi1,
    &data,
    1,
    100
);

送受信同時

uint8_t tx = 0x55;
uint8_t rx;

HAL_SPI_TransmitReceive(
    &hspi1,
    &tx,
    &rx,
    1,
    100
);

SPIとUARTの比較

項目 SPI UART
通信速度 高速 普通
配線数 多い 少ない
クロック 必要 不要
全二重通信 ○ △
実装難易度 中 低

SPIとI2Cの比較

項目 SPI I2C
通信速度 高速 普通
配線数 多い 少ない
アドレス機能 無し 有り
実装難易度 中 中

よくあるトラブル

CSを制御していない

SPIでは通信相手を選択するためにCSが必要である。

CSが正しく制御されていないと通信できない。


SPIモード不一致

STM32とデバイスで

Mode0

Mode3

など異なる設定になっていると通信できない。


クロック速度が速すぎる

デバイスの仕様を超えたクロックを設定すると通信エラーが発生する。


GND未接続

UARTやI2Cと同様にGND共有は必須である。


Asterでの利用例

将来的に以下のような機器を追加する場合に利用できる。

  • 高速ADC
  • SDカード
  • TFT液晶
  • EEPROM
  • 高速センサ

構成例

ALEO
(STM32)
    │
    ├─ SPI ─ 温度センサ
    │
    ├─ SPI ─ SDカード
    │
    └─ SPI ─ 液晶ディスプレイ

まとめ

SPIは高速なシリアル通信方式である。

  • SCKでクロックを供給する
  • MOSIとMISOでデータを送受信する
  • CSで通信相手を選択する
  • 全二重通信が可能
  • I2CやUARTより高速

STM32では非常によく利用されるため、組み込み開発では必須級の知識である。