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では非常によく利用されるため、組み込み開発では必須級の知識である。