SPI(Serial Peripheral Interface)とは
SPIは、Serial Peripheral Interfaceの略でマイコンとその周辺機器(ペリフェラル)の間でよく使用される通信プロトコルの一つです。1つのマスターと1つのスレーブ、あるいは複数のスレーブとの間を通信するための方式の1つで、シリアル通信プロトコルになります。
ここで、マスターとは、通信を管理する側のでデバイスで、スレーブは管理される側のデバイスをいいます。スレーブは、センサであったり、SDカードなど様々なデバイスがスレーブとなり得ます。
SPIの位置付け
通信プロトコルはアプリケーションの要件によって、慎重に選択する必要があります。以下に様々なプロトコルの通信速度の特徴をまとめました。
プロトコル | 通信方式 | 最大ライン長 | 最大速度 |
USB 3.0 | 全二重通信 | 3m | 5 Gbps |
USB 2.0 | 半二重通信 | 5m | 480 Mbps |
Ethernet | 全二重通信 | 100m | 10 Gpbs |
I2C | 半二重通信 | 6m | 3.4 Mbps |
RS-232 | 全二重通信 | 15m | 20 kbps |
RS-485 | 半二重通信 | 1200m | 10 Mbps |
SPI | 全二重通信 | 1 | 1~20Mbps (CLK/2マイコン依存) |
一般的にSPIプロトコルで通信する場合、マスターとスレーブの間で適切に動作する最大距離は1m以下と言われています。通信速度に関しては、1~20 Mbpsと幅広く、実質的にはマイコンが供給するクロックに依存します。例えば50MHzのクロックの場合、最大速度はその半分の25 Mbpsとなります。これがSPIプロトコルの利点です。
SPIと同じ、センサとの通信が主な利用先であるI2Cを見ると、最大速度は3.4M bpsとSPIプロトコルと比較して遅いです。I2Cは複雑なプロトコルで、多くの便利な機能が利用できるのが利点です。また、伝送距離は一般的にI2Cのほうが長いです。
このことから、SPIは大容量のセンサデータの取得や、シリアルフラッシュメモリとの通信などの大容量のデータをシリアル通信する場合によく用いられます。I2Cは、それよりも遅いセンサデータを取得するためによく利用されます。
つまり、SPIは基本的に短距離通信を対象とし、大容量のデータ送受信するためのプロトコルです。
SPIの通信バス
SPIは以下の4つの外部ピンを使用して通信をします。SPI通信をする場合、SPIインタフェースが送受信側のどちらのデバイスにもサポートされている必要があります。
- SCLK(あるいはSCK)ピン
- 通信を同期するためのクロック信号(シリアルクロック)を伝送するためのピンです。
SPIでは、常にマスター側からシリアルクロックを生成し、スレーブ側に送信します。
全てのマスターとスレーブ間の送受信データはこのクロック信号に同期して行われます。 - クロック信号がなければSPI通信は動作しないため、デバッグする際はまずクロックが生成され、スレーブに入力されていることを確認します。
- 通信を同期するためのクロック信号(シリアルクロック)を伝送するためのピンです。
- MOSI(Master Out Slave In)ピン
- マスターがデータを送信するためのピンです。
マスターからデータを送信し、スレーブでデータを受信するために使用します。
- マスターがデータを送信するためのピンです。
- MISO(Master Out Slave In)ピン
- マスターがデータを受信するためのピンです。
スレーブがデータを送信し、マスターでデータを受信するために使用します。
- マスターがデータを受信するためのピンです。
- 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つのモードが存在します。
モード | CPOL | CPHA |
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
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プロトコルのタイミングチャートを示し、どのようなタイミングで実際に動作しているのかを解説しました。
コメント