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 0 ロジック・ハイ データを立下がりエッジでサンプリング、立上がりエッジでシフト
3 1 1 ロジック・ハイ データを立上がりエッジでサンプリング、立下がりエッジでシフト

図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に設定しています。そのため、アイドル状態におけるクロック信号はハイになります。クロックの位相については0に設定しているので、データは、クロック信号の立下がりエッジ(橙色の点線)でサンプリングされ、立上がりエッジ(青色の点線)でシフトされます。

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

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

図5. SPIモード3のタイミング 図 。CPOL は1、CPHAは1、アイドル 状 態の CLK は ハ イです。データを立 上 がりエッジで サンプリングし、立下がりエッジでシフトします。
図5. SPIモード3のタイミング 図 。CPOL は1、CPHAは1、アイドル 状態の 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年にサンノゼ州立大学で電気工学の修士号を取得しています。