Skip to content

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);

通信の流れ

  1. CS信号をLOWにする → スレーブ選択
  2. データをMOSI線で送信 → SCKクロックで同期
  3. MISOから応答を受信(必要に応じて)
  4. CS信号をHIGHにする → スレーブ解放

トラブルシューティング

データが正しく転送されない

  1. クロック周波数を確認
  2. コード内の設定値を確認
  3. スレーブが対応している周波数か確認

  4. ピン接続を確認

  5. MOSI/MISO/SCK/CS が正しく接続されているか
  6. ケーブルの接触状況を確認

  7. CS信号のタイミング

  8. データ送信前後でCS信号が正しく制御されているか
  9. CS信号の極性(アクティブHIGH/LOW)が正しいか

通信がタイムアウトする

  • クロック周波数が高すぎる可能性
  • ケーブル長が長い場合は周波数を下げる
  • 別のSPIスレーブが応答を妨害していないか確認

参考リンク