SPI
線 4 本、共有クロック、両方向へ同時に流れるデータ。
フラッシュの ID を読む
実際のトランザクションです。コマンド 0x9F を送り、ID の 3 バイトを読み返します。SPI モードを切り替えると、クロックのアイドルレベルと、どのエッジでデータを読むかが変わります。
フレーム全体
CS を Low にしている間に、両方向へ同時に 4 バイト(クロック 32 周期)が移動しました。モード 0 では受信側は立ち上がりでデータを読みます。マスタとスレーブでモードが食い違うと、全ビットが 1 エッジずれて読まれます。
CS を Low に
マスタがチップセレクト(CS、アクティブ Low)を Low に引きます。これで 1 台だけが目を覚まし、同じ SCK / MOSI / MISO を共有する他のデバイスは無視し続けます。SPI にはアドレスがなく、どの線を引くかでチップを選びます。
コマンド 0x9F(MOSI)
マスタが MOSI に 0x9F を MSB から順に送り出します。多くの SPI フラッシュで 0x9F は「JEDEC ID 読み出し」です。このバイトの間、MISO には意味のあるデータは載っていません。
メーカー ID 0xEF(MISO)
SPI は全二重です。1 バイト読むにはマスタも 1 バイト送らなければなりません。マスタはクロックを刻むためだけにダミーの 0x00 を MOSI に送り、フラッシュが MISO に 0xEF を返します。0xEF は Winbond のメーカー ID です。
メモリ種別 0x40(MISO)
2 バイト目の ID はデバイスの系列です(0x40 = Winbond W25Q シリーズの SPI NOR フラッシュ)。マスタはここでもダミーバイトでクロックを出し続けます。
容量コード 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)