SPI通信¶
SPI とは¶
SPI(Serial Peripheral Interface)は、マイコンと周辺機器(DAC、メモリ、センサーなど)の間で高速にデータをやり取りする同期通信方式です。
UARTと異なり、クロック信号を使用して送受信タイミングを厳密に同期させるため、より高速で確実な通信ができます。
「同期通信」とは何か¶
SPIは「同期(Synchronous)」通信です。これは:
- 送信側と受信側が共通のクロック信号で同期する
- 専用のクロック線が必須
- タイミングが正確で高速通信に適している
- 短距離通信向け(同一基板内など)
UART との違い¶
| 項目 | SPI(同期) | UART(非同期) |
|---|---|---|
| クロック線 | 必要 | 不要 |
| ケーブル本数 | 3本以上 | 2本(TX/RX) |
| セットアップ | クロック周波数を統一 | ボーレートを合わせる |
| 通信速度 | 高速(MHz オーダー) | 低速(kbps オーダー) |
| 距離 | 短距離向け | 長距離向け |
SPI の仕組み¶
4本の信号線¶
SPIには最低4本の信号線があります:
| ピン | 意味 | 機能 | 方向 |
|---|---|---|---|
| MOSI | Master Out, Slave In | マスター→スレーブへのデータ | 送信 |
| MISO | Master In, Slave Out | スレーブ→マスターへのデータ | 受信 |
| SCK | Serial Clock | クロック信号(同期用) | マスター出力 |
| CS | Chip Select | スレーブ選択(複数スレーブ対応) | マスター出力 |
マスター・スレーブ関係¶
マスター(ESP32) スレーブ(DAC)
MOSI ────────────────→ MOSI
MISO ←──────────────── MISO
SCK ────────────────→ SCK
CS ────────────────→ CS(アクティブ時のみ通信)
重要:
- SPIではマスター側(ESP32)がクロックを生成する
- マスターがスレーブを選択(CS信号)して通信開始
- 複数のスレーブを接続する場合、それぞれ独立したCS線が必要
クロック周波数¶
通信速度を「クロック周波数」で指定します。単位はHz(ヘルツ)です。
| 周波数 | 用途 |
|---|---|
| 1MHz | 低速、ノイズに強い |
| 10MHz | 標準的なSPI通信 |
| 25MHz | 高速通信 |
| 50MHz以上 | 高速デバイス向け |
Kurikintons での使用¶
概要¶
Kurikintons では、SPI通信を使用してDAC(デジタル・アナログ変換器)を制御しています。
- 制御対象: DAC(アナログ出力値を調整)
- スレーブ: 3つの独立したDACチャネル
- クロック周波数: 100kHz(低速、安定性重視)
- 実装: src/spi_control.cpp
ピン接続¶
ESP32のSPIピン配置:
| ESP32 ピン | SPI信号 | 用途 |
|---|---|---|
| GPIO5 | MOSI | DAC Ch.1 CS |
| GPIO13 | MISO | DAC Ch.2 CS |
| GPIO15 | SCK | DAC Ch.3 CS |
| GPIO18 | SCK | クロック信号 |
注: Kurikintons では各DACチャネルが独立したCS線で制御されています。
初期化例¶
// SPI制御の初期化
spi_control_init();
// DAC値を設定(0-255 の範囲)
spi_set_dac_value(DAC_CHANNEL_1, 128);
通信の流れ¶
- CS信号をLOWにする → スレーブ選択
- データをMOSI線で送信 → SCKクロックで同期
- MISOから応答を受信(必要に応じて)
- CS信号をHIGHにする → スレーブ解放
トラブルシューティング¶
データが正しく転送されない¶
- クロック周波数を確認
- コード内の設定値を確認
-
スレーブが対応している周波数か確認
-
ピン接続を確認
- MOSI/MISO/SCK/CS が正しく接続されているか
-
ケーブルの接触状況を確認
-
CS信号のタイミング
- データ送信前後でCS信号が正しく制御されているか
- CS信号の極性(アクティブHIGH/LOW)が正しいか
通信がタイムアウトする¶
- クロック周波数が高すぎる可能性
- ケーブル長が長い場合は周波数を下げる
- 別のSPIスレーブが応答を妨害していないか確認