Baud
プロトコル一覧

SPI

線 4 本、共有クロック、両方向へ同時に流れるデータ。

フラッシュの ID を読む

実際のトランザクションです。コマンド 0x9F を送り、ID の 3 バイトを読み返します。SPI モードを切り替えると、クロックのアイドルレベルと、どのエッジでデータを読むかが変わります。

CS#SCKMOSIMISOCS1b70b60b51b41b31b21b11b01b71b61b50b41b31b21b11b00b71b60b50b40b30b20b10b00b70b60b51b41b30b20b10b0CSC…コマンド 0x9F(MOSI)メーカー ID 0xEF(MISO)メモリ種別 0x40(MISO)容量コード 0x18(MISO)C…区分MOSIMISOMOSI → コマンド71605041312111010x9F159MISO → 無視70605040302010000x000MOSI → ダミー70605040302010000x000MISO ← フラッシュの返答71615140312111010xEF239MOSI → ダミー70605040302010000x000MISO ← フラッシュの返答70615040302010000x4064MOSI → ダミー70605040302010000x000MISO ← フラッシュの返答70605041312010000x1824

フレーム全体

CS を Low にしている間に、両方向へ同時に 4 バイト(クロック 32 周期)が移動しました。モード 0 では受信側は立ち上がりでデータを読みます。マスタとスレーブでモードが食い違うと、全ビットが 1 エッジずれて読まれます。

  1. CS を Low に

    マスタがチップセレクト(CS、アクティブ Low)を Low に引きます。これで 1 台だけが目を覚まし、同じ SCK / MOSI / MISO を共有する他のデバイスは無視し続けます。SPI にはアドレスがなく、どの線を引くかでチップを選びます。

  2. コマンド 0x9F(MOSI)

    マスタが MOSI に 0x9F を MSB から順に送り出します。多くの SPI フラッシュで 0x9F は「JEDEC ID 読み出し」です。このバイトの間、MISO には意味のあるデータは載っていません。

  3. メーカー ID 0xEF(MISO)

    SPI は全二重です。1 バイト読むにはマスタも 1 バイト送らなければなりません。マスタはクロックを刻むためだけにダミーの 0x00 を MOSI に送り、フラッシュが MISO に 0xEF を返します。0xEF は Winbond のメーカー ID です。

  4. メモリ種別 0x40(MISO)

    2 バイト目の ID はデバイスの系列です(0x40 = Winbond W25Q シリーズの SPI NOR フラッシュ)。マスタはここでもダミーバイトでクロックを出し続けます。

  5. 容量コード 0x18(MISO)

    3 バイト目の ID は容量を 2 のべき乗で表します。0x18 = 24 なので 2^24 バイト = 16 MiB(W25Q128、128 Mbit)です。

概要

SPI(Serial Peripheral Interface)は同期式のバスです。マスタがクロック(SCK)を出し、クロック 1 周期ごとに MOSI から 1 ビット出ていき、MISO から 1 ビット入ってきます。クロックが明示されているのでスタートビットもストップビットも不要で、数十 MHz の速度が普通に出ます。

アドレスも応答(ACK)もありません。デバイスごとに専用のチップセレクト線があり、マスタが 1 本を Low にして話しかけます。バイトの意味はデバイスのデータシートだけが決めます。

基本情報

信号線
SCK, MOSI, MISO, CS#
クロック
マスタが SCK を出力
よくある速度
1 – 50 MHz
ビット順
MSB ファースト(通常)
モード
0, 1, 2, 3 (CPOL, CPHA)
接続形態
マスタ 1 台・スレーブ N 台(CS は台数分)

使われる場面

  • フラッシュメモリ、SD カード(SPI モード)、EEPROM
  • ディスプレイ(OLED・TFT・電子ペーパー)や LED ドライバ
  • ADC / DAC、IMU、nRF24 や LoRa などの無線チップ

つまずきやすい点

  • SPI で最も多い不具合はモードの食い違いです。CPOL/CPHA がデータシートと違うと 1 エッジずれて読まれ、ビットがずれた値になります。
  • 読むには書く必要があります。データを受け取るために、マスタはダミーバイトを送ってクロックを出し続けます。
  • CS を戻すとトランザクションが終わります。1 つのコマンドの途中で CS を戻すと、たいていコマンドが中断されます。
  • CS が High のスレーブは MISO をハイインピーダンスにしておく必要があります。そうしないと複数のデバイスが線を取り合います。

出典・規格

  • Motorola M68HC11 Reference Manual (SPI)
  • Winbond W25Q128 datasheet (JEDEC ID)

関連するプロトコル