SPI(Serial Peripheral Interface)通信

目次

SPI(Serial Peripheral Interface)とは

SPIは、Serial Peripheral Interfaceの略でマイコンとその周辺機器(ペリフェラル)の間でよく使用される通信プロトコルの一つです。1つのマスターと1つのスレーブ、あるいは複数のスレーブとの間を通信するための方式の1つで、シリアル通信プロトコルになります。

ここで、マスターとは、通信を管理する側のでデバイスで、スレーブは管理される側のデバイスをいいます。スレーブは、センサであったり、SDカードなど様々なデバイスがスレーブとなり得ます。

SPIの位置付け

通信プロトコルはアプリケーションの要件によって、慎重に選択する必要があります。以下に様々なプロトコルの通信速度の特徴をまとめました。

プロトコル通信方式最大ライン長最大速度
USB 3.0全二重通信3m5 Gbps
USB 2.0半二重通信5m480 Mbps
Ethernet全二重通信100m10 Gpbs
I2C半二重通信6m3.4 Mbps
RS-232全二重通信15m20 kbps
RS-485半二重通信1200m10 Mbps
SPI全二重通信11~20Mbps
(CLK/2マイコン依存)

一般的にSPIプロトコルで通信する場合、マスターとスレーブの間で適切に動作する最大距離は1m以下と言われています。通信速度に関しては、1~20 Mbpsと幅広く、実質的にはマイコンが供給するクロックに依存します。例えば50MHzのくろっkうの場合、最大速度はその半分の25 Mbpsとなります。これがSPIプロトコルの利点です。

SPIと同じ、センサとの通信が主な利用先であるI2Cを見ると、最大速度は3.4M bpsとSPIプロトコルと比較して遅いです。I2Cは複雑なプロトコルで、多くの便利な機能が利用できるのが利点です。また、伝送距離は一般的にI2Cのほうが長いです。

このことから、SPIは大容量のセンサデータの取得や、シリアルフラッシュメモリとの通信などの大容量のデータをシリアル通信する場合によく用いられます。I2Cは、それよりも遅いセンサデータを取得するためによく利用されます。

つまり、SPIは基本的に短距離通信を対象とし、大容量のデータ送受信するためのプロトコルです。

SPIの通信バス

SPIは以下の4つの外部ピンを使用して通信をします。SPI通信をする場合、SPIインタフェースが送受信側のどちらのデバイスにもサポートされている必要があります。

  1. SCLK(あるいはSCK)ピン
    • 通信を同期するためのクロック信号(シリアルクロック)を伝送するためのピンです。
      SPIでは、常にマスター側からシリアルクロックを生成し、スレーブ側に送信します。
      全てのマスターとスレーブ間の送受信データはこのクロック信号に同期して行われます。
    • クロック信号がなければSPI通信は動作しないため、デバッグする際はまずクロックが生成され、スレーブに入力されていることを確認します。
  2. MOSI(Master Out Slave In)ピン
    • マスターがデータを送信するためのピンです。
      マスターからデータを送信し、スレーブでデータを受信するために使用します。
  3. MISO(Master Out Slave In)ピン
    • マスターがデータを受信するためのピンです。
      スレーブがデータを送信し、マスターでデータを受信するために使用します。
  4. SS(Slave Select)
    • マスターがどのスレーブに対して通信するのかを決定します。
      1つのマスターと1つのスレーブのような構成の場合、利用する必要はありませんが、複数のスレーブが存在する場合には必要になります。
    • このピンはアクティブローで、SPI通信の対象からスレーブを外したい場合にハイに設定します

SPIプロトコルの構成(1つのスレーブ)

以下に、マスターとスレーブの接続図を示します。ここでは、1つのマスター、1つのスレーブという構成で考えます。
ここで、矢印はデータが流れる方向を示していて、マスターからスレーブに送信するのはSCLK, MOSI, SSになります。MISOのみスレーブから送信されます。

マスターがスレーブのSSピンをLowに設定すると、そのスレーブデバイスがアクティブになることを意味します。この手順は重要で、スレーブ側のSSピンがLowになったときにのみ、SCLK, MOSI, MISOピンが有効になります。そのため、スレーブ側はSSピンがLowにならない限りスレーブ側のデータ通信はアクティブになりません。

実際には、SSがHighの場合、MOSI, MISOがハイインピーダンスになっています。Lowになった場合のみ、ハイインピーダンスから解除され、データの送受信が可能になります。

SPIプロトコルの接続構成(複数のスレーブ)

複数のスレーブを接続する場合は、以下のような構成になります。スレーブを選択するピンを1本さらに増加して、2つのスレーブを選択します。このように、SCLK, MOSI, MISOは各スレーブで共有したデータ線を利用しているため、スレーブ2つ同時にデータ送信することはできません。そのようなことをしたい場合は、別にMOSI, MISO, SCLKを用意してそれをスレーブに接続する必要があります。また、SS1, SS2は排他的な関係(どちらか一方のみがLow)で制御する必要があります。そのため、これらの制御はソフトウェアで行う必要があります。

SPIバスの構成(通信方式の観点)

SPIは全二重通信に対応可能なプロトコルです。データ用のピンがMOSI, MISOと2本存在するため、データの送信中にデータを受信することが可能です。一方で、全てのアプリケーションで全二重通信が強制されるわけではありません。SPIバスの構成を変更することで、柔軟に全二重通信、半二重通信、単方向通信と変更することができます。

全二重通信

これは上記で説明したすべてのピンを利用して、全二重通信を実現します。下図のように接続します。

半二重通信

半二重通信の場合、1つのデータ線で送信および受信をします。半二重通信の場合、下図のような構成となるため、ピンが1本節約することができます。

マスターとスレーブが交互に送信・受信を行うことで、一つのデータ線で送受信を実現します。

マスターが送信側のとき、スレーブ側は受信側となり、スレーブが送信側の場合、マスターは受信側と変化します。この送受信の切り替えはソフトウェアで実現する必要があるため、そのような制御プログラムを作成する必要があります。

単方向通信

単方向通信の場合、送信と受信がマスターとスレーブで常に固定になります。この方式では、下図のようになります。このとき、スレーブ側の送信ピンは無視するように設定します。

SPIのハードウェア要素の振る舞い

SPI通信は実際にはハードウェア的にはどのような振る舞いをしているのかを解説します。

SPIペリフェラルの中には、実際にはシフトレジスタが内蔵されています。マスター側に存在するM0がLSBで、M7がMSBになります。動作としては、1つめのクロックが立ち上がると、M0が押し出されて、スレーブ側のMSBであるS7に送信されます。それと同時にスレーブ側のLSBであるS0がマスター側に送信されます。このように、クロックが立ち上がるごとにシフトレジスタを介してデータの送受信を行います。LSBが最初に送受信されるため、LSBファーストと呼ばれたりします。

SPIフォーマット

SPIは大きく分けて以下の3つの設定項目によって通信フォーマットが決定されます。

  • SCLK POLARITY(CPOL):クロックの極性
  • SCLK PHASE(CPHA): クロックの位相
  • Data Frame Format(DFF):データフレームフォーマット

SPIはSCLK(シリアルクロック)で動悸して、シフトレジスタのデータのシフトとサンプリングを実行し、送受信が行われます。

SPIはマスターとスレーブを通信する場合、双方で上記3つの項目を一致させる必要があります。DFFは主に16ビットあるいは8ビットで構成されます。DFFは実際に送信するデータ値を意味しています。8ビットなら1バイトの信号、16ビットなら2バイトの信号をデータとして送受信しています。

CPOL

CPOLでは、データ線上のアイドル状態(データ線上にデータがなく、転送されていない状態)を定義します。
SCLKのクロック信号がHighあるいはLowのどちらの時間帯がアイドル状態になるかを決定します。

  • CPOL=0
    • クロックがLowで開始される
    • クロックがLowの時点が、アイドル状態、つまり、データの送受信がない時間帯になります。
  • CPOL=1
    • クロックがHighで開始される
    • クロックがHighの時点が、アイドル状態、つまり、データの送受信がない時間帯になります。

デフォルトでは、CPOL=0となります。

CPHA

CPHAは、SCLKの1番目、あるいは2番目のどちらのクロックエッジで制御するかを決定します。
CPOLとCPHAの組み合わせでデータとしての値が決定するタイミングが定義されます。

  • CPHA=1
    • 1番目のクロックエッジで各データ間の遷移タイミングを表し、このクロックエッジのタイミングでマスターから送信が実行されます。2番目のクロックエッジでデータがサンプリングされ、確定します。
  • CPHA=0
    • 2番目のクロックエッジで各データ間の遷移タイミングを表し、このクロックエッジのタイミングでマスターから送信が実行されます。1番目のクロックエッジでデータがサンプリングされ、確定します。

実際に一見これだけでは、なんのことか理解するのは難しいので、次のようにタイミングチャートを用いて具体的に見ていきます。

SPIタイミングチャート(CPHA = 1)

①1番目のクロックエッジがデータ間の遷移を表し、②2番目のクロックエッジがデータの切り替わりを表します。MSBファーストの場合、データは7ビットから送信され、LSBファーストの場合は0ビット目のデータから送信されます。このLSBファーストか、MSBファーストは設定することができます。MOSIやMISOのデータラインで表現している、図形はデータを表していて、実際には0か1のどちらかになることを意味していて、ディジタル回路などのタイミングチャートではよく用いられる記法です。データを表していると思っていれば大丈夫です。線が交差している時点で、データが変化していることを表しています。

CPHA=1のとき、CPOLとの関係を示すと以下のようになります。

  • CPOL=0
    • 1番目のクロックエッジはLow→Highへの遷移(データ間の遷移を表す)
    • 2番目のクロックエッジはHigh→Lowへの遷移(データのサンプリング)
  • CPOL=1
    • 1番目のクロックエッジはHigh→Lowへの遷移(データ間の遷移を表す)
    • 2番目のクロックエッジはLow→Highへの遷移(データのサンプリング)

SPIタイミングチャート(CPHA = 0)

CPHA=1のとき、CPOLとの関係を示すと以下のようになります。

  • CPOL=0
    • 1番目のクロックエッジはLow→Highへの遷移(データのサンプリング)
    • 2番目のクロックエッジはHigh→Lowへの遷移(データ間の遷移)
  • CPOL=1
    • 1番目のクロックエッジはHigh→Lowへの遷移(データのサンプリング)
    • 2番目のクロックエッジはLow→Highへの遷移(データ間の遷移)

SPIのモード

上記のことからSPIプロトコルは以下のように、4つのモードが存在します。

モードCPOLCPHA
000
101
210
311

CPOL=0, CPHA=0がデフォルト設定となります。

CPHA=0, CPOL=1では、SCLKがフォーリングエッジ(High→Lowへの遷移)でサンプリング
     CPOL=0では、SCLKがライジングエッジ(Low→Highへの遷移)でサンプリング

このようにSPIでは、2つのクロックエッジを使って、データの切り替わり、サンプリングのタイミングの制御をするため、伝送速度がクロック周波数の1/2になることもわかると思います。

これらの設定はアプリケーションやハードウェア要件に決定されるので、どのモードを利用すればいいかはケースバイケースになります。重要なポイントはCPHA=0は1番目のクロックエッジでサンプリング、CPHA=1は2番目のクロックエッジでサンプリングするということです。

まとめ

本記事では、SPI通信プロトコルについて解説しました。SPIは主に大容量のデータ転送に向いている、全二重通信可能な通信プロトコルで、全二重通信を行うためには4つのピンが必要なことを解説しました。

また、SPIプロトコルのタイミングチャートを示し、どのようなタイミングで実際に動作しているのかを解説しました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次