複数の周辺機器を制御するSPI/I2Cバスライン
要約
このアプリケーションノートでは、ほとんどのアナログICで使用される2つの一般的なシリアルディジタルインタフェース、SPI™すなわち3線式とI2Cすなわち2線式を比較します。各シリアルインタフェースには、多くの設計に対して長所と短所があり、必要なデータレート、スペースの可用性、およびノイズの検討事項などの基準に応じて決まります。このアプリケーションノートでは、これら2つのシリアルインタフェースの違いについて考察し、例を挙げて各インタフェースについて詳しく説明します。
はじめに
実世界の信号は常にアナログになりますが、現在、ますます多くのアナログICがディジタルインタフェースを経由して通信を行っています。シリアルインタフェースは、マスタ(シリアルクロックを提供)とスレーブ/周辺機器の間で通信を行います。今日、ほとんどのマイクロコントローラに見られるSPI (3線式)とI2C (2線式)のポートは、データの送受信によく使われる手段です。このようにマイクロコントローラは、複数のバスラインで通信を行い、アナログ-ディジタルコンバータ(ADC)、ディジタル-アナログコンバータ(DAC)、スマートバッテリ、ポートエキスパンダ、EEPROM、および温度センサなどの周辺機器を制御します。パラレルインタフェースを経由して送信されるデータとは異なり、シリアルデータは、通常は2、3、または4つのデータライン/タイミングライン上で、連続して多数のビットが送信されます。パラレルインタフェースでは速さが長所ですが、シリアルインタフェースでは、制御ラインとデータラインがはるかに少ないという点が長所です。
シリアルインタフェースの基本
シリアルインタフェースは、3線、2線、および単線の3種類で利用可能です。この記事では、3線式と2線式のインタフェースを中心に取り上げます。シリアル周辺機器インタフェース(SPI)、キュー付きシリアル周辺機器インタフェース(QSPI™)、およびMICROWIRE™ (またはMICROWIRE PLUS™)規格は、3線式インタフェースを通じて通信を行います。IC間バス(I2C)およびシステムマネジメントバス(SMBus™)規格は、2線式インタフェースを経由して通信を行います。どちらのタイプのシリアルインタフェースにもそれぞれ長所と短所があります。下記の表1を参照してください。
3線式インタフェース
3線式インタフェースは、チップセレクトライン(アクティブローCSまたはアクティブローSS)、クロックライン(SCLK)、およびデータ入力/マスタ出力ライン(DINまたはMOSIと呼びます)を使用します。これらのインタフェースには、データ出力/マスタ入力ライン(DOUTまたはMISOと呼びます)が含まれることもあるため、この場合には4線式インタフェースと呼ばれることもあります。わかりやすくするためにこの記事では、3線式と4線式インタフェースの両方を3線式と呼びます。
3線式インタフェースはより高いクロック周波数で動作し、プルアップ抵抗を必要としません。また、SPI/QSPIおよびMICROWIREインタフェースはフルデュープレックス動作(データを同時に送受信することができます)も特徴としており、ノイズの多い環境で問題の発生が少なくなります。3線式インタフェースは、レベルトリガではなくエッジトリガになります。
3線式インタフェースの主な短所は、図1に示すように、スレーブがデイジーチェーン方式の構成でない限り、バス上の各スレーブに別々のアクティブローCSラインを必要とすることです(デイジーチェーンについては、以下で詳しく考察します)。また、3線式インタフェースでは、データが正確に送信または受信されていることを示す肯定応答は送出されません。ソフトウェアの見地からは、3線式インタフェースは、単一マスタ/単一スレーブのアプリケーションのための2線式インタフェースよりも簡単で効率的です。
図1. 3線式インタフェースは、データ入力、データ出力、クロック、およびチップセレクトラインを利用します。
2線式インタフェース
2線式インタフェースは、データライン(SDAまたはSMBDATA)とクロックライン(SCLまたはSMBCLK)のみを使用します。1つまたは2つのラインしか使用しないため、携帯電話や光ファイバアプリケーションなどのコンパクト設計に特に有効です。2線式インタフェースによって、チップセレクト信号を必要とせずに、同じバス上の複数のスレーブを接続することも可能です。各スレーブはそれぞれ専用の固有アドレスを持つため、この設計が可能です。また、2線式インタフェースは、正常な読出しが完了した後、アクノレッジビットを送信します。2線式インタフェースには1つのデータラインしかないため、ハーフデュープレックスモードでのみ動作することができます(つまり、データをある一定のサイクルで送信または受信することは可能ですが、同時に送受信することはできません)。2線式インタフェースはレベルでトリガされますが、データビットが不正確に識別された場合、ノイズの多い環境で問題が生じる可能性があります。
Interface | Advantages | Disadvantages |
3-Wire: SPI, QSPI, and MICROWIRE PLUS | 1. Speed 2. No pullup resistors required 3. Full-duplex operation 4. Noise immunity |
1. Larger number of bus line connections 2. Individual chip-select lines required to communicate with more than one slave at a time 3. No acknowledgment of received data |
2-Wire: I2C and SMBus | 1. Fewer bus line connections 2. Multiple devices share the same bus 3. Received data is acknowledged |
1. Speed: SMBus limited to 100kHz; I2C limited to 3.4MHz 2. Half-duplex operation 3. Open-drain bus lines require pullup resistors 4. Reduced noise immunity |
マスタとスレーブは、シリアルインタフェース上で、複数のバスラインを経由して通信を行います。書込みサイクル時に、マスタは専用のクロックとデータ信号を使用してデータをスレーブに送信します。読出しサイクル時に、スレーブはデータをマスタに送信します。
SPI、QSPI、MICROWIREの設計
Motorola®によって開発されたSPIインタフェースは、MAXQ2000などの一般的なプロセッサやマイクロコントローラで利用可能です。上述のとおり、SPIの設計には2つの制御ライン(アクティブローCSおよびSCLK)と2つのデータライン(DIN/SDIおよびDOUT/SDO)が必要です。MotorolaのSPI/QSPI規格では、DIN/SDIデータラインをMOSI (マスタアウトスレーブイン)と呼びます。したがって、DOUT/SDOデータラインはMISO (マスタインスレーブアウト)であり、アクティブローCSラインはSS (スレーブセレクト)です。簡単でわかりやすくするため、この記事ではスレーブから見た3線式のデータラインについて説明します。つまり、DINはスレーブのデータ入力で、DOUTはスレーブのデータ出力です。また、この記事では、3線式バスラインをアクティブローCS、SCLK、DIN、およびDOUTと呼びます。マキシムの周辺機器がこれらのピン名称を使用しているからです。
ほとんどのSPIインタフェースには、スレーブがいつデータをサンプリングするかを決定する2つの構成ビット、クロック極性(CPOL)、およびクロック位相(CPHA)があります。CPOLは、切り替え中でないときに、SCLKがハイ(CPOL = 1)またはロー(CPOL = 0)でアイドリングするのかどうかを決定します。CPHAは、どのSCLKのエッジでデータがシフトインおよびシフトアウトされるかを決定します。CPOL = 0の状態で、CPHAを0に設定すると、SCLKの立上りエッジでデータをスレーブにシフトします。CPHAを1に設定すると、SCLKの立下りエッジでデータをスレーブにシフトします。CPOLとCPHAの2つの状態によって、クロック極性およびクロック位相の4種類の組み合わせが可能です。つまり、各設定は他の3つの設定と互換性がありません。マスタおよびスレーブの両方とも、互いに通信するためにCPOLおよびCPHAを同じ状態に設定する必要があります。
その最も基本的な形式では、SPIインタフェースは同時に8ビット(1バイト)のデータを送信しますが、一部のマイクロコントローラは同時に2バイト以上を送信します。たとえば、MAXQ2000のマイクロコントローラは、同時に8または16ビットを送信することができます。CPOL = 0、CPHA = 0の状態では、ハイからローへのアクティブローCS遷移によって、マスタからスレーブに送信が開始されます。SCLKが全8サイクルの間にハイとローをパルス出力する間、アクティブローCSはローで保持する必要があります。DINデータは、SCLK立上りエッジでラッチされます。ローからハイへのアクティブローCS遷移の後、データバイトがスレーブにロードされます。データは、同じ8ビットサイクルの間、SCLKの立下りエッジでスレーブのDOUTラインから利用可能です。図2aは、CPHA = 1のときの3線式SPIのタイミングを示しています。図2bは、CPHA = 0のときの3線式SPIのタイミングを示しています。
図2a. 3線式インタフェースのタイミング(CPHA = 1)。CPHA = 1、CPOL = 1の状態で、3線式インタフェースは、クロックの立上りエッジで周辺機器にデータを同期入力し、クロックの立下りエッジで周辺機器からデータを同期出力します。
図2b. 3線式インタフェースのタイミング(CPHA = 0)。CPHA = 0、CPOL = 1の状態で、3線式インタフェースは、クロックの立下りエッジで周辺機器にデータを同期入力し、クロックの立上りエッジで周辺機器からデータを同期出力します。
バス上のすべてのICにはそれぞれのチップセレクトラインが必要となるため、アクティブローCSのバスラインは、各スレーブのイネーブル信号として使用します。4つのスレーブが同じバス上にある場合、適切なスレーブを選択するのに4つのチップセレクトラインが必要です。スレーブのアクティブローCSラインがハイ(非アクティブ)の場合、スレーブはSCLKの遷移を無視し、DOUTラインをハイインピーダンス状態に保ちます。
一部の3線式インタフェース周辺機器は、デイジーチェーン接続と呼ばれる方式でプログラムすることができます。個別のアクティブローCSラインを各周辺機器に接続するのではなく、デイジーチェーン接続では、単一のアクティブローCSとSCLKラインによって直列に接続された複数の周辺機器を制御することが可能です。この方法で周辺機器をデイジーチェーン接続するには、3線式インタフェースにDOUTラインを組み込む必要があります。図1に示すように、周辺機器#1のDOUTラインは、周辺機器#2などへのDINラインとなります。
SPI規格は、最大データレートを指定しません。その代わりに周辺機器は、MHz範囲の最大レートを(ほとんどの場合、MHzの範囲で)指定します。マイクロコントローラは、広範囲のSPI速度に対応することができます。ただし、SPIバス上で通信を行うと、スレーブは、マスタの速度を遅くしたり正しいデータ転送に肯定応答したりすることはできません。
QSPI規格はSPI規格とほぼ同じです。実際のところ、周辺機器は、QSPIバスとSPIバスを区別することができません。ただし、SPIマスタとは異なり、QSPIマスタによって、プログラム可能なチップセレクトを用いたデータ転送が可能です。さらに、SPIデバイスが通常8ビットのみ転送するのに対し、これらのQSPIマスタは、同時に8ビット~16ビットを転送することができます。連続して最大16データワード(最大256ビット)を転送するように、QSPIデバイスを構成することができます。この転送は、QSPIインタフェースによって完全に処理され、マイクロコントローラの介入を必要としません。SPIと同様、QSPI規格は、最大データレートを指定しません。
National Semiconductorによって開発された以前のMICROWIRE規格は、SPIと非常によく似ています。ただし、MICROWIREには、固定のクロック極性と固定のクロック位相があります(CPOL = 0、CPHA = 0)。DINのデータは、常にSCLKの立上りエッジでスレーブにラッチされます。データは、SCLKの立下りエッジでスレーブのDOUTピンからシフトされます。SPIと同様、MICROWIRE規格は、最大データレートを指定しません。
Inter-Integrated Circuit (I2C)のインタフェース
フルデュープレックスの3線式シリアルインタフェースとは異なり、Philipsによって開発されたI2C規格は、1つのデータライン(SDA)と1つの制御ライン(SCL)上でハーフデュープレックスモードにて通信を行います。I2C規格は、単純なマスタ/スレーブ双方向インタフェースを定義しています。この方式では、マイクロコントローラがマスタとして動作するか(書込みモード)、あるいはスレーブとして動作するか(受信モード)を指定します。各スレーブには専用の固有アドレスがあるため、チップセレクト信号なしでマスタが同じバス上のさまざまなスレーブと通信することが可能です。図3を参照してください。スレーブの数は、最大許容バスライン容量(400pF)によってのみ制限されます。I2Cのプロトコルは、7ビットまたは10ビットのアドレスを利用していますが、7ビットアドレスの方が一般的です。7ビットプロトコルの場合、最大127種類の周辺機器をバスに接続することができます。SCLとSDAはオープンドレインのラインであるため、適正に動作するためにはハイ状態でアイドリングする必要があります。3V電源を使用するときには、1kΩ以上のプルアップ抵抗をこれらのラインに接続し、5V電源を使用するときは1.6kΩ以上のプルアップ抵抗を接続します。
図3. 2線式インタフェースには、データ入力/出力およびクロックラインがあります。
I2C通信は、開始コマンドで始まります。このコマンドは、SCLがハイの状態でSDAがハイからローに遷移するときに発生します。図4aを参照してください。各SCLクロックサイクルの間に1つのデータビットが転送されます。つまり、1バイトをスレーブに対して入力または出力するには、最小で9ビットが必要です。書込みサイクルには8データビットが含まれ、その後にACKまたはNACKの信号が続きます。図4bを参照してください。データがI2Cバス上で転送されるとき、データはSCLの立上りエッジでスレーブにラッチされ、SCLの立下りエッジでスレーブから読み出されます。SCLクロックパルスがハイの間、SDAのデータを安定させておく必要があります。停止コマンドまたは再開始コマンドの後、SCLがハイの状態でSDAがローからハイに遷移するポイントで転送は完了します。バスがビジーでないときには、SDAとSCLの両方ともハイのままです。
図4a. 開始と停止の状態。2線式インタフェースは、開始コマンド、再開始コマンド、および停止コマンドを使用して、マスタとスレーブの間でデータを転送します。
図4b. I2Cアクノリッジビット。2線式インタフェースは、データがアクノリッジされるとSDAラインをローにプルダウンします。
I2C書込みサイクルは開始コマンドで始まり、その後7ビットのスレーブアドレスと、書込みコマンドか読出しコマンドかを通知する8番目のビットが書き込まれます。書込みコマンドの場合には8番目のビットをローに設定し、読出しコマンドの場合にはハイに設定します。8番目のクロックサイクルの後、マスタはバスラインを解放します。スレーブが正しい転送に対して応答する場合、スレーブは9番目のクロックサイクルにてSDAラインをローに保ちます。スレーブが正しい書込みコマンドに対して応答しない場合、スレーブはSDAライン(このときプルアップ抵抗によってハイに保たれています)を解放します。
その後マスタは8ビットコマンドバイトを書き込み、その後に2番目のACK/NACKビットが続きます。次にマスタは8ビットデータバイトを書き込み、3番目のACK/NACKビットが続きます。データバイトの最後のアクノリッジビットによって、読出し/書込みサイクルが完了し、周辺機器の出力が更新されます。図5aは、書込みサイクルの例を示しています。
I2C読出しサイクルは開始コマンドで始まり、その後スレーブアドレスが書き込まれます。続いて、ハイにプルアップされた8番目のビットが続き、読出しコマンドであることを通知します。その後ACK/NACKビットが続き、マスタはコマンドバイトを書き込み、新しいスレーブレジスタにアクセスします。2番目のACK/NACKビットの後、マスタはスレーブアドレスを再書き込みします。その後3番目のACK/NACKビットに続き、スレーブがバスを制御し、同時に8つのデータビットを書き出します。図5bを参照してください。前の読出しと同じスレーブレジスタから読み出すとき、マスタはそのスレーブからデータを読み出す前にスレーブのアドレスを書き込むだけでよいのです。
図5. 2線式インタフェースは、同時に8つのデータビットを転送します。図5aは、I2Cの書込みサイクルの例です。図5bは、I2Cの読出しサイクルの例です。
I2Cインタフェースは、低速(最大100kHz)、中速(最大400kHz)、および高速(最大3.4MHz)のプロトコルをサポートしています。I2Cは、ハイとローの信号をCMOS電圧レベルに基づいて認識します。ロー信号は0.3 x 電源電圧未満で、ハイ信号は0.7 x 電源電圧以上です。
システムマネジメントバス(SMBus)
Intel®は低速通信のためのSMBus規格を確立しています。SMBusインタフェースはI2Cと似ています。I2Cと同じようにSMBusは、データライン(SMBDATA)とクロックライン(SMBCLK)を含んだ2線式インタフェースを使用します。SMBCLKおよびSMBDATAラインにもプルアップ抵抗が必要です。3V電源では8.5kΩ以上のプルアップ抵抗、5V電源では14kΩ以上のプルアップ抵抗を使用します。SMBusは3V~5Vの電源電圧で動作し、2.1Vを上回るとハイ信号と認識し、0.8Vを下回るとロー信号と認識します。
タイムアウトと最大/最小クロック速度は、I2CとSMBusのインタフェースで最も大きな違いがあります。I2CバスはDCまで機能し、バスの非アクティビティによってタイムアウトしません。ただし、SMBusインタフェースはタイムアウトすることがあります。タイムアウト期間(最大35ミリ秒)よりも長い間クロック信号がローになった後、スレーブデバイスがそのインタフェースをリセットしたときにタイムアウトが発生します。SMBusのタイムアウト期間によって、クロックに対して最小速度19kHzが要求されます。適正な通信を行うためには、SMBCLKを10kHz~100kHzの間に設定する必要があります。ただし、I2Cバスに接続されたマスタまたはスレーブのいずれかは、データを処理するために必要な限りクロックをローに保つことができます。
周辺機器の例
マイクロコントローラは、ほとんどの場合、シリアルインタフェースを経由してその周辺機器と通信します。マイクロコントローラは、3線式または2線式のインタフェースを使用して、周辺機器の内部レジスタに対して読出しと書込みを行います。次に周辺機器はバイアスをかけ、アナログとディジタルのさまざまな出力を制御します。たとえば、周辺機器は、バッテリの充電電流と電圧をプログラムし、温度センサを使用してファンを制御し、さらに、DACのアナログ出力電圧およびさまざまな回路のバイアス条件を同様に設定します。
図6は、2線式インタフェースを経由して8ビットDAC (MAX5115)と通信するマイクロコントローラを示しています。このDACには、4つのアドレス選択ピンがあって16の固有のスレーブアドレスを生成可能なため、最大16のDACを並列に接続することができます。MAX6641は別のスレーブアドレスを持つため、同じ2つのバスラインによって、SMBusの温度センサ/ファンコントローラ(MAX6641)のバイアス条件を設定することもできます。このファンコントローラは、MOSFETのゲート電圧を調整してファンの電源をオン/オフします。
図6. このマイクロコントローラはI2Cインタフェースを使用するため、多数の周辺機器と通信するのに2つのバスラインだけが必要です。また、このDACや温度センサと同様、並列に接続されます。
3線式インタフェースが、並列に接続されたマイクロコントローラと複数のIC間の通信に個別のチップセレクトラインを必要とするのに対し、より簡単な2線式インタフェースは、同じクロックとデータラインを使用してバス上の各デバイスと通信します。各周辺機器に異なるスレーブアドレスを設定することによって、複数のICを並列に配置することができます。ほとんどのI2C周辺機器にはアドレス選択ピンがあり、各周辺機器を異なるスレーブアドレスに設定することができます。以前は、周辺機器がそれ自体を識別することができるスレーブアドレスの数は、2の累乗に限定されていました。たとえば、周辺機器に2つのアドレス選択ピンがあった場合、4つの固有のスレーブアドレスによってバス上のその周辺機器を識別することができました。
新しい設計では、少ないアドレス選択ピンからより多くのスレーブアドレスを提供することができます。たとえば、MAX7319の入出力ポートエキスパンダは、わずか2つのアドレス選択ピン(AD2とAD0)から16の固有のスレーブアドレスをプログラムすることができます。これらのピンは、GND、電源電圧(VCC)、SDA、またはSCLに接続することができます。表2は、利用可能な16のスレーブアドレスを示しています。ビットA6、A5、およびA4は110に設定する必要がありますが、ビットA3~A0は、AD2とAD0の4種類の設定によってプログラムすることができます。
Pin Connection | Device Address | |||||||
AD2 | AD0 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
SCL | GND | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
SCL | VCC | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
SCL | SCL | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
SCL | SDA | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
SDA | GND | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
SDA | VCC | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
SDA | SCL | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
SDA | SDA | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
GND | GND | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
GND | VCC | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
GND | SCL | 1 | 1 | 0 | 1 | 0 | 1 | 0 |
GND | SDA | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
VCC | GND | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
VCC | VCC | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
VCC | SCL | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
VCC | SDA | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
今後の展開
今日の3線式インタフェースは、2線式インタフェースとは異なるニーズを対象としており、それぞれに独自の長所があります。今後、いずれか1つのインタフェースが他のインタフェースに完全に取って代わることはありえません。I2Cデバイスは、必要な場合に電源を切ることができるタイムアウトリセットのようなSMBusの機能を実装し始めており、急速に進化しています。新しいI2Cのスレーブアドレスは、7ビットではなく10ビットの長さがあり、さらなる柔軟性をユーザに提供しています。
3線式と2線式のインタフェースの両方が共存しますが、多くのマイクロコントローラが2線式インタフェースに対応するにつれて、I2Cが市場を拡大することになるでしょう。I2Cは使いやすく、そのバスラインが少ないため、SPIよりもI2Cを成長させることになると思われます。
詳細については、アプリケーションノート3967「シリアルバスの選択」、およびアプリケーションノート3438「シリアルのディジタルデータネットワーク」を参照してください。
同様の記事が2006年3月の「Portable Design」のウェブサイトに掲載されています。