SPIの基本を学ぶ

SPI(Serial Peripheral Interface)は、マイクロコントローラとその周辺ICの間でよく使用されるインターフェースの1つです。つまり、センサー、A/Dコンバータ、D/Aコンバータ、シフト・レジスタ、SRAMなどとマイクロコントローラの接続に広く採用されているということです。本稿では、まずSPIの基本について簡単に説明します。次に、アナログ・デバイセズが提供するSPI対応のスイッチ/マルチプレクサ製品を紹介します。更に、それらのICを利用することで、システムの基板設計において、必要なGPIO(General Purpose Input/Output)の本数を大幅に削減できることを示します。

SPIは、同期式/全二重のマスタ‐スレーブ型インターフェースです。マスタ(SPIマスタ)またはスレーブ(SPIスレーブ)からのデータは、クロックの立上がりまたは立下がりエッジによって同期がとられます。また、マスタとスレーブは、同時にデータを送信することが可能です。SPIには、3線式のものと4線式のものがあります。本稿では、より一般的な4線式のSPIを取り上げます。

SPIの概要

図1. SPIにおけるマスタとスレーブの関係
図1. SPIにおけるマスタとスレーブの関係

4線式のSPIデバイスには、次の4つの信号があります。

  • クロック(SPI CLK、SCLK)
  • チップ・セレクト(CS)
  • マスタ出力/スレーブ入力(MOSI)
  • マスタ入力/スレーブ出力(MISO)

2種類のデバイスのうち、クロック信号を生成する方がマスタと呼ばれます。マスタとスレーブの間で送信されるデータは、マスタによって生成されるクロックと同期しています。SPIデバイスは、I2Cインターフェースよりもはるかに高いクロック周波数に対応します。SPIに対応する製品を使用する場合には、必ずデータシートを参照し、SPIのクロック周波数に関する仕様を確認してください。

SPIでは、1つのマスタに対し、複数のスレーブを接続することができます。図1に、SPIマスタとSPIスレーブの間の接続を示しました。

マスタからのCS信号は、スレーブの選択に使用されます。通常、この信号はアクティブ・ローで、SPIバスからスレーブを切り離したい( 送受信の対象から外したい)ときにハイにします。複数のスレーブを扱いたい場合、最も基本的な使い方では、マスタから各スレーブに対して個別のCS信号を送信する必要があります。本稿では、CS信号はすべてアクティブ・ローであるという前提の下に話を進めていきます。

MOSIとMISOは、データを送受信するための信号線です。MOSIは、マスタからスレーブに対するデータの送信に使用されます。一方、MISOは、スレーブからマスタにデータを送信するために使われます。

データの送信

SPIによる通信を開始するには、マスタからクロック信号を送信すると共に、CS信号をイネーブルにすることによって、スレーブを選択する必要があります。CS信号がアクティブ・ローである場合、マスタはロジック・レベルのローを送信することで、スレーブを選択します。SPIは全二重インターフェースなので、マスタとスレーブはそれぞれMOSIとMISOによって、同時にデータを送信できます。つまり、MOSI/SDOバスに対してシリアルにデータをシフトさせて出力する送信動作と、MISO/SDIバスのデータをサンプリング(読み出し)する受信動作を同時に行うことが可能です。その際には、シリアル・クロックのエッジによって、データのシフト/サンプリング処理の同期がとられます。SPIでは、クロックの立上がりエッジと立下がりエッジのうちどちらでデータをサンプリング/シフトするかを、ユーザが自由に選択できます。SPIを介して送信されるデータのビット数については、各デバイスのデータシートを参照してください。

クロックの極性と位相

SPIマスタは、クロックの極性と位相を選択できます。CPOLビットは、アイドル状態におけるクロック信号の極性を設定するためのものです。アイドル状態というのは、送信を開始するためにCSがハイからローに遷移するまでの間と、送信を終了するためにCSがローからハイに遷移するまでの間のことです。CPHAビットは、クロックの位相を選択するためのものです。CPHAビットにより、データのサンプリング/シフトにクロックの立上がりエッジと立下がりエッジのうち、どちらを使用するのかを設定します。マスタでは、スレーブの要件に適合するように、クロックの極性と位相を選択する必要があります。表1に示すように、CPOLビットとCPHAビットの組み合わせ方によって、4つのSPIモードが存在することになります。

表1. 4つのSPIモード。CPOLビットとCPHAビットの組み合わせによってモードが決まります。
SPIモード CPOL CPHA アイドル状態のクロックの極性 データのサンプリング/シフトに使われるクロックの位相
0 0 0 ロジック・ロー データを立上がりエッジでサンプリング、立下がりエッジでシフト
1 0 1 ロジック・ロー データを立下がりエッジでサンプリング、立上がりエッジでシフト
2 1 1 ロジック・ハイ データを立下がりエッジでサンプリング、立上がりエッジでシフト
3 1 0 ロジック・ハイ データを立上がりエッジでサンプリング、立下がりエッジでシフト

図2~図5は、4つのSPIモードにおけるタイミング図の例です。各例において、データの値はMOSIとMISOの部分に示してあります。送信の開始と終了は緑色の点線、サンプリング用のエッジは橙色、シフト用のエッジは青色で示しています。なお、これらは、説明用に作成した簡単な例に過ぎません。SPIによる通信機能を適切に実装するには、製品のデータシートを参照して、タイミング仕様が満たされていることを確認する必要があります。

図2. SPIモード0のタイミング図。CPOLは0、CPHAは0、アイドル状態のCLKはローです。データを立上がりエッジでサンプリングし、立下がりエッジでシフトします。
図2. SPIモード0のタイミング図。CPOLは0、CPHAは0、アイドル状態のCLKはローです。データを立上がりエッジでサンプリングし、立下がりエッジでシフトします。

図3は、SPIモード1のタイミング図です。このモードでは、クロックの極性を0に設定しているので、アイドル状態におけるクロック信号はローになります。一方、クロックの位相については1に設定しているので、データは、クロック信号の立下がりエッジ(橙色の点線)でサンプリングされ、立上がりエッジ(青色の点線)でシフトされます。

図3. SPIモード1のタイミング図。CPOLは0、CPHAは1、アイドル状態のCLKはローです。データを立下がりエッジでサンプリングし、立上がりエッジでシフトします。
図3. SPIモード1のタイミング図。CPOLは0、CPHAは1、アイドル状態のCLKはローです。データを立下がりエッジでサンプリングし、立上がりエッジでシフトします。

図4は、SPIモード2のタイミング図です。このモードでは、クロックの極性を1に設定しています。そのため、アイドル状態におけるクロック信号はハイになります。クロックの位相については1に設定しているので、データは、クロック信号の立下がりエッジ(橙色の点線)でサンプリングされ、立上がりエッジ(青色の点線)でシフトされます。

図4. SPIモード2のタイミング図。CPOLは1、CPHAは1、アイドル状態のCLKはハイです。データを立下がりエッジでサンプリングし、立上がりエッジでシフトします。
図4. SPIモード2のタイミング図。CPOLは1、CPHAは1、アイドル状態のCLKはハイです。データを立下がりエッジでサンプリングし、立上がりエッジでシフトします。

図5は、SPIモード3のタイミング図です。このモードでは、クロックの極性を1に設定しています。したがって、アイドル状態のクロック信号はハイになります。クロックの位相については0に設定しているため、データは、クロック信号の立上がりエッジ(橙色の点線)でサンプリングされ、立下がりエッジ(青色の点線)でシフトされます。

図5. SPIモード3のタイミング図。CPOLは1、CPHAは0、アイドル状態のCLKはハイです。データを立上がりエッジでサンプリングし、立下がりエッジでシフトします。
図5. SPIモード3のタイミング図。CPOLは1、CPHAは0、アイドル状態のCLKはハイです。データを立上がりエッジでサンプリングし、立下がりエッジでシフトします。

マルチスレーブ構成

先述したように、SPIでは1つのマスタに対して、複数のスレーブを使用することが可能です。スレーブは標準モードまたはデイジーチェーン・モードで接続できます。

標準モード

図6. SPIによってマルチスレーブ構成を実現した例
図6. SPIによってマルチスレーブ構成を実現した例

標準モードでは、マスタから各スレーブに対して、個別にCS信号を送信する必要があります。マスタがCS信号をイネーブルにする(ローに引き下げる)と、選択されたそのスレーブに対して、クロックとMOSI/MISO上のデータが有効になります。複数のCS信号がイネーブルになると、MISO上のデータが壊れてしまいます。どのスレーブからデータが送信されているのか、マスタは識別できないからです。

図6に示すように、スレーブの数が増えるに連れて、マスタからのCS信号線の数も増えてしまいます。マスタに必要な入出力の数が著しく増加してしまうので、現実的には使用できるスレーブの数には限りがあるということになります。この問題については、いくつかの対処法があります。言い換えると、標準モードにおけるスレーブの数を無理なく増やすことも可能だということです。例えば、マルチプレクサを使用してCS信号を生成するという方法を採用すれば、この問題に対処できます。

デイジーチェーン・モード

図7. デイジーチェーン・モードでマルチスレーブ構成を実現した例
図7. デイジーチェーン・モードでマルチスレーブ構成を実現した例

マルチスレーブ向けのもう1つの接続方法がデイジーチェーン・モードです。この方法では、すべてのスレーブに対して、同一のCS信号を供給します。そして、1つのスレーブから次のスレーブへと順にデータが伝搬されるように、複数のスレーブを配置します。この構成では、すべてのスレーブが同じクロックを同時に受信します。マスタからのデータは1つ目のスレーブに引き渡され、そこから順次、次のスレーブへとデータが伝搬していきます。

この方法では、1つのスレーブから次のスレーブへと順にデータが伝搬されます。そのため、各スレーブにデータが到達するまでに必要なクロック・サイクルの数は、デイジーチェーンにおける各スレーブの位置に比例します。例えば、図7の例が8ビットのシステムであるとすると、3つ目のスレーブまでデータを送信するには、24個のクロック・パルスが必要になります。それに対し、標準モードであれば8個のクロック・パルスで済みます。図8に、デイジーチェーンにおけるクロック・サイクルとデータの伝搬の関係を示しました。なお、デイジーチェーン・モードは、すべてのSPIデバイスでサポートされているとは限りません。製品のデータシートで、同モードを使用できるかどうかを確認してください。

図8 . デイジーチェーンにおけるクロック・サイクルとデータの伝搬の関係
図8 . デイジーチェーンにおけるクロック・サイクルとデータの伝搬の関係

アナログ・デバイセズのSPI向けスイッチ/マルチプレクサ

アナログ・デバイセズは、SPIを使用する際に活用できるスイッチICを提供しています。特に、最新世代の製品を使用すれば、スイッチに起因する性能劣化を生じさせることなく、実装スペースを大きく削減することができます。以下では、SPIを最適な形で利用できるように設計されたスイッチ/マルチプレクサを活用することによって、システム・レベルの設計を大幅に簡素化する方法を説明します。具体的には、GPIOの必要本数に注目して、その効果を示すことにします。

まずは、シンプルなスイッチICを使用した場合にどのようなことが起きるのかというところから説明します。「ADG1412」は、クワッド・タイプのSPST(単極単投)スイッチICです。図9は、マイクロコントローラに1個のADG1412を接続する場合の概念図です。この例では、マイクロコントローラの4本のGPIOを各スイッチの制御入力に接続しています。

図9 . マイクロコントローラのGPIOをスイッチの制御信号として使用する例
図9 . マイクロコントローラのGPIOをスイッチの制御信号として使用する例

このようなシンプルな方法を採用した場合、基板上のスイッチの数が増えるに連れ、必要なGPIOの本数が激増してしまいます。例として、テスト用の計測システムを設計するケースを考えます。その場合、システムのチャンネル数を増やそうとすると、非常に多くのスイッチが必要になります。仮に、4個のADG1412を使用して、4 × 4のクロスポイント・マトリクスを構成するとしましょう。そうすると、必要なGPIOの数は16本に達します。標準的なマイクロコントローラを使用したい場合、このことが足かせになってしまうかもしれません。つまり、システム全体として見た場合、GPIOの数が不足してしまう可能性があるということです。図10に、マイクロコントローラの16本のGPIOを使用して、4個のADG1412を制御する例を示しました。

図10 . マルチスレーブ構成の例。この方法では、スイッチの数を増やすと、必要なGPIOの数が激増します。
図10 . マルチスレーブ構成の例。この方法では、スイッチの数を増やすと、必要なGPIOの数が激増します。

必要なGPIOの数を減らすための1つの方法は、図11に示すように、シリアル‐パラレル変換器を使用することです。この回路では、同変換器をSPIのシリアル・インターフェースによって設定し、出力されるパラレル信号をスイッチの制御入力として使用します。この方法の欠点は、追加のコンポーネントが必要になるため、部品点数(BOM:Bill of Material)が増加してしまうことです。

図11. シリアル‐パラレル変換器を利用したマルチスレーブ構成
図11. シリアル‐パラレル変換器を利用したマルチスレーブ構成

この問題については、有用な代替策があります。それは、SPIによってスイッチを制御する機能を備えたスイッチIC(SPI対応スイッチIC)を採用することです。SPI対応スイッチICを使用すれば、必要なGPIOの数を減らせるだけでなく、シリアル‐パラレル変換器も追加しなくて済みます。「ADGS1412」は、アナログ・デバイセズが提供している代表的なSPI対応スイッチICです。図12では、同ICを4個使用しています。それぞれの制御は、マイクロコントローラからSPIの信号を供給することによって行います。そのために必要なGPIOの数は、16本からわずか7本に削減されます。

図12 . SPI対応スイッチICを利用したマルチスレーブ構成。同ICを使用することにより、必要なGPIOの本数を節約することができます。
図12 . SPI対応スイッチICを利用したマルチスレーブ構成。同ICを使用することにより、必要なGPIOの本数を節約することができます。

また、ADGS1412をデイジーチェーン・モードで使用すれば、必要なGPIOの数を更に減らすことができます(図13)。同モードでは、マイクロコントローラがSPIマスタとして機能するために必要なGPIOの数は、システムで使用するADGS1412の数にかかわらず、わずか4本で済みます。

図13. SPI対応スイッチICをデイジーチェーン・モードで使用する例。この方法を採用すれば、GPIOの必要本数を更に削減できます。
図13. SPI対応スイッチICをデイジーチェーン・モードで使用する例。この方法を採用すれば、GPIOの必要本数を更に削減できます。

図13は、ADGS1412の使い方を説明するための概念図です。実際には、同ICのデータシートに記載されているように、SDOピンにはプルアップ抵抗を付加することが推奨されます。ADGS1412をデイジーチェーン・モードで使う方法については、同ICのデータシートをご覧ください。なお、図13では、回路を簡素化するためにスイッチの数を4個としました。実際には、システムで使用するスイッチの数が増えるに連れ、基板の簡素化とスペースの削減という面で得られる効果が非常に大きくなります。例えば、SPI対応スイッチICの製品群の中からクワッド・タイプのSPSTスイッチを選択し、それを8個使って4 × 8のクロスポイント構成を実現するとします。6層基板を使用してそのような回路を構成した場合、基板上の占有面積を20%削減できます。なお、高精度のSPI対応スイッチICを使用してチャンネル密度を高める方法については、「高精度のSPIスイッチにより、チャンネル密度を高める」を参照してください

アナログ・デバイセズは、SPI対応スイッチICと同マルチプレクサICを数多く提供しています。詳細については、こちらをご覧ください。

参考資料

ADuCM3029 データシート「パワー・マネージメントを統合した超低消費電力ARM Cortex-M3 MCU」AnalogDevices、2017年3月

Stephen Nugent「高精度の SPI スイッチにより、チャンネル密度を高める」Analog Dialogue、AD51-05

Miguel Usach、AN-1248、アプリケーション・ノート「SPIインターフェース」Analog Devices、2015年9月

Piyu Dhaker

Piyu Dhaker

Piyu Dhakerは、アナログ・デバイセズの北米セントラル・アプリケーション・グループに所属するアプリケーション・エンジニアです。2017年6月に同グループに加わりました。それ以前には、車載パワー・トレイン・グループやパワー・マネージメント・グループに所属していました。2007年にサンノゼ州立大学で電気工学の修士号を取得しています。