シリアル・ペリフェラル・インタフェース(SPI)とは
シリアル・ペリフェラル・インタフェース(SPI)は、
コンピュータ内部のデバイス同士を接続するために使用されるシリアルバス規格の一つです。従来のパラレルバスと比較して、接続に必要な端子数が大幅に少なく、省スペース化に貢献します。主に低速な
データ転送を必要とするデバイスに利用されています。
概要
従来のデータバス、
アドレスバス、制御信号を用いたデバイス接続では、多くの信号線が必要でした。しかし、メインメモリのような高速アクセスを必要とするデバイス以外では、そこまで高速な
データ転送を求められない場合が多く、ICの小型化と省ピン化が望まれていました。
このような背景から、I2C、SPI、MicroWireといったシリアルバス規格が提案されました。SPIは、
モトローラ(現NXPセミコンダクターズ)によって提唱された、省ピン接続を可能にするバス規格です。
接続仕様
SPIバスでは、マスター(親機)とスレーブ(子機)の間を、以下の4本の信号線で接続します。
SCK (Serial Clock): シリアルクロック信号
MOSI (Master Out Slave In): マスターからスレーブへのデータ送信線
MISO (Master In Slave Out): スレーブからマスターへのデータ送信線
SS (Slave Select): スレーブ選択信号
※MISO、MOSI、SSは、それぞれCIPO(Controller In Peripheral Out)、COPI(Controller Out Peripheral In)、CS(Chip Select)と表現されることもあります。
1つのマスターに対して複数のスレーブを接続する場合、SCK、MISO、MOSIの3線は共有できます。SS線はスレーブごとに独立して必要ですが、マスターがスレーブを区別する必要がない場合は、省略可能です。スレーブが1つしかない場合や区別が不要な場合は、SS線を省略し、3線で接続できます。この場合、スレーブ側のSS端子はアクティブ(通常はLOW)に常時接続します。
動作仕様
SPIバスは、単一のマスターと1つ以上のスレーブで構成されます。スレーブが単一の場合、またはスレーブが許可する場合は、SSピンを論理レベルLに固定できます。ただし、SS信号の立ち下がりエッジを動作開始のトリガーとするスレーブ(例:Maxim MAX1242 ADC)では、固定はできません。
複数のスレーブを使用する場合は、マスターから各スレーブへの独立したSS信号線が必要です。ほとんどのスレーブデバイスはトライステート出力に対応しており、選択されていない時はMISO信号が高インピーダンス状態(電気的に切断)になります。トライステート出力を持たないデバイスは、外部トライステートバッファを使用しない限り、SPIバスを他のデバイスと共有できません。
通信を開始するには、まずマスターが、スレーブがサポートする周波数(通常数MHz)のクロック信号を生成します。次に、マスターは該当するスレーブのSS線をLOWにして選択します。スレーブ側で待ち時間が必要な場合(例:A/D変換)、マスターはクロック信号を発信する前に、必要な時間だけ待機する必要があります。
SPIでは、各クロックサイクル中に全二重データ送信が行われます。マスターはMOSI線で1ビットを送信し、スレーブはそれを読み込みます。同時に、スレーブはMISO線で1ビットを送信し、マスターはそれを読み込みます。この双方向通信は、一方通行のデータ送信であっても維持されます。
通常、データ送信には、8ビットなどの特定のワードサイズの
シフトレジスタが用いられます。マスターとスレーブにそれぞれ
シフトレジスタが配置され、仮想的なリング状に接続されます。データは通常、最上位ビットから順番に送信されます。クロックエッジに応じて、マスターとスレーブはビットをシフトアウトし、伝送線上で対向する相手に出力します。次のクロックエッジで、各受信側は伝送線からビットをサンプリングし、
シフトレジスタの新しい最下位ビットとして設定します。レジスタの全ビットがシフトイン/アウトされると、マスターとスレーブはレジスタ値を交換した状態になります。この処理を必要な回数だけ繰り返すことで、データの送受信が完了します。
送信は任意のクロックサイクル数で継続でき、完了すると、マスターはクロック信号を停止し、スレーブの選択を解除します。
通常、送信データは8ビット単位ですが、16ビット(例:
テキサス・インスツルメンツ TSC2101)や12ビット(A/Dコンバータなど)などの異なるワードサイズも使用されます。
SS線で選択されていないスレーブは、入力クロックとMOSI信号を無視し、MISOを駆動してはなりません(トライステート出力が必要)。ただし、一部のデバイスでは、外部トライステートバッファが必要になる場合があります。
クロックの極性と位相
マスターは、クロック周波数に加えて、データに対するクロックの極性(CPOL)と位相(CPHA)を設定する必要があります。これらの設定により、クロック信号のエッジとデータの送受信タイミングが定義されます。これらの設定は、マスターとスレーブの両方に適用されます。
CPOL(Clock Polarity):
CPOL=0: アイドル状態では0、各サイクルは1のパルスで構成。パルスの立ち上がりエッジが先端エッジ、立ち下がりエッジが末尾エッジ
CPOL=1: アイドル状態では1、各サイクルは0のパルスで構成。パルスの立ち下がりエッジが先端エッジ、立ち上がりエッジが末尾エッジ
CPHA(Clock Phase):
CPHA=0: 出力側は前のクロックサイクルの末尾のエッジでデータを変更。入力側は現在のクロックサイクルの先端エッジでデータをキャプチャ。
CPHA=1: 出力側は現在のクロックサイクルの先端のエッジでデータを変更。入力側は現在のクロックサイクルの末尾のエッジでデータをキャプチャ。
MOSIおよびMISO信号は、通常、次のクロック遷移まで、半サイクルの間安定しています。マスターとスレーブは、この半サイクル内で異なるポイントでデータをサンプリングする可能性があります。
これらの設定により、マスターとスレーブ間の通信チャネルの柔軟性が向上します。
モード番号
CPOLとCPHAの組み合わせは、モード番号として識別されます。モード番号は2ビットで定義され、CPOLが上位ビット、CPHAが下位ビットとして使用されます。
例:
モード0: (CPOL=0, CPHA=0)
モード1: (CPOL=0, CPHA=1)
モード2: (CPOL=1, CPHA=0)
モード3: (CPOL=1, CPHA=1)
マイクロチップPICやARMベースのマイクロコントローラーでは、異なるビット(CKP, CKE, SMPなど)を使用してSPIモードを設定することがあります。また、(CPOL, CPHA)のような組でモードを表現することもあります。
アーキテクチャおよび通信タイミング
SafeSPIは、自動車の安全アプリケーションで使用するためのSPIを標準化しています。
主な利用例
SPIは以下のようなデバイスや用途に広く利用されています。
EEPROM (93C46/93C56/93C66)
A/Dコンバータ、D/Aコンバータ
リアルタイムクロック
スイッチやLEDなどのGPIO、ヒューマン・インタフェースデバイス
通信インタフェース
マルチメディアカード、
SDメモリーカード
関連項目
バス
シリアルバス
I2C
マイクロワイヤ
シフトレジスタ
1-Wire
外部リンク
SPIについて(個人のwebページ)
Using the Serial Peripheral Interface to Communicate Between Multiple Microcomputers (NXP/Application Note AN991)