Q. A/Dコンバータ(ADC)とD/Aコンバータ(DAC)を限られたスペースに実装する必要に迫られています。そのための方策としては、シリアル・インターフェースを採用するのが有効なのではないかと考えています。この選択に関連して知っておくべきこととしては、どのようなものがありますか?
A. まずは、シリアル・インターフェースとパラレル・インターフェースの違いについて押さえておきましょう。それにより、シリアル・インターフェースを採用したデータ・コンバータ(ADCやDAC)の特徴について理解できるはずです。
上に示したのは、ADCとDSPの接続方法の例です。ADCとしては、分解能が12ビットで8チャンネルを備えるマルチプレクス製品「AD7890」を使用しています。一方、DSPとしては「ADSP-2105」を採用しています。ご覧のように、両者はシリアル・インターフェースで接続されています。併せて、両者の間の通信に使用するタイミング・シーケンスも示してあります。ADCの変換結果であるデジタル・データのビット数は12ビットとなります。それらが、シリアルのデータ・ストリームとして1本のライン(信号線)を介して伝送されます。そのデータ・ストリームに含まれるのは、変換結果だけではありません。AD7890のマルチプレクサによってどの入力チャンネルが選択されていたのかを表す3ビットのデータも含まれています。シリアルのデータ・ストリームにおいて、各ビットを互いに区別するためには、クロック信号(SCLK)が使用されます。通常、SCLKはDSP側から供給することになります。ただ、SCLKを出力として供給するADCも存在します。DSPは、通常(必ずというわけではありません)、フレーミング・パルスも供給します。多くの場合、フレーミング・パルスは、通信を開始する際の1サイクルの間だけ送信されます。ただ、図のTFS/RFSのように、通信期間を通して常にロー(アクティブ)で維持されるものも存在します。
この例では、DSPのシリアル・ポートは、ADCが備える5ビットのレジスタをプログラムする目的でも使用されます。それらのレジスタの各ビットにより、変換の対象とするチャンネルの選択、ADCのパワーダウン・モードへの移行、A/D変換の開始といった制御が行われます。この場合、シリアル・インターフェースは双方向のものでなければならないことは明らかです。
一方、パラレル型のADCの場合、そのインターフェースは通信相手となるプロセッサのデータ・バスに直接(あるいはバッファを介して)接続されます。下の図は、12ビットのADC「AD7892」とDSP製品である「ADSP-2101」の接続を示したものです。この場合、AD7892はA/D変換が完了したらADSP-2101に割り込みをかけます。同DSPはそれを受けて、ADCが備えるメモリ・アドレスからデコードされたデータを1回読み出します。
シリアル型のデータ・コンバータとパラレル型のデータ・コンバータの最大の違いは何でしょうか。それは、インターフェースに必要となるラインの数です。当然のことながら、シリアル方式の方がピン数を抑えられます。そのため、実装面積の節約という観点からは明らかなメリットが得られます。例えば、シリアル型であれば、12ビットのデータ・コンバータでもパッケージとして8ピンのDIP/SOを使用できます。より重要なポイントは、シリアル・インターフェースを採用した場合、プリント基板上でトレースの数を抑えられるということです。その結果、基板上の実装面積を節約することが可能になります。
Q. あるDACを、中央のプロセッサや他のDACから離れた位置に配置しなければならないケースがあります。そのような場合には、どのような方法が最善策になりますか?
A. 最初に、シリアル型とパラレル型のうち、どちらのDACを使用するのかを決定する必要があります。パラレル型のDACの場合、下の図に示すように、それぞれをメモリマップドI/Oのロケーションに対応づけることができます。このようにすれば、適切なI/Oロケーションに対する書き込み(Write)コマンドを実行するだけで、各DACを簡単にプログラムすることが可能です。但し、この構成には重大な欠点があります。それは、複数の制御信号に加え、すべてのリモート・ロケーションに対するパラレル・データ・バスが必要になることです。それに対し、シリアル・インターフェースを使用する場合、配線はわずか2本で済みます。実装面積などの観点から言えば、シリアル・インターフェースを使用する方が明らかに有利です。
一般に、シリアル型のデータ・コンバータはプロセッサのメモリには対応づけられません。ただ、プロセッサのシリアルI/Oポートには複数のシリアルDACを接続することが可能です。そしてプロセッサの他のポートは、DACを個別にイネーブルにするチップ・セレクト信号の生成に使用できます。同信号を送信するには、各デバイスとインターフェースをつなぐラインが必要です。プロセッサによっては、同信号の送信に利用可能なラインの数に制限があるかもしれません。
上記の問題を回避するための1つの方法は、デイジーチェーン接続が可能なシリアルDACを使用することです。上の図は、複数のDACを1つのI/Oポートに接続する方法を表しています。この方法では、各DACのシリアル・データ出力(SDO)ピンを、チェーン内の後続のDACのシリアル・データ入力(SDI)ピンに接続します。LDACとSCLKは、チェーン内のすべてのDACに並列に供給されます。クロックを使用してSDIに入力されたデータは、しばらくすると(Nクロック・サイクル後)SDOに現れます。そのため、1つのI/Oポートで複数のDACに対応することが可能です。但し、ポートから出力されるデータ・ストリームは相応に長くなります([Nビット]×[チェーンを構成するDACの数])。一方、この構成では、デバイス用のデコードが不要であるというメリットが得られます。すべてのデバイスは、実質的に同じI/Oロケーションに存在します。一方、デイジーチェーン構成の最大の欠点としては、アクセシビリティ(遅延)が挙げられます。1つのDACの状態を変更する場合でも、プロセッサは、データ・ストリーム全体をI/Oポートから出力する必要があります。
Q. シリアル型のデータ・コンバータを使えば、実装面積と配線を大きく節約できるわけですね。では、なぜスペースに制約のあるすべてのアプリケーションでその方法を採用しないのですか?
A. シリアル・インターフェースの欠点の1つは、高いデータ転送速度を実現するのが簡単ではないことです。例えば、パラレルDACをプログラムする際には、データ・バス向けにデータを用意し、それをシングル・パルス(クロック)でDACに入力するだけで済みます。一方、シリアルDACにデータを書き込むには、クロックを使用してビット・データをシーケンシャルに入力し(Nビットのコンバータの場合はN個のクロック・パルスが必要)、その後にロード(Load)パルスを付加する必要があります。つまり、シリアル・インターフェースを使用する場合、プロセッサのI/Oポートがデータ・コンバータと通信する時間が相対的に長くなるということです。そのため、500kspsを超えるスループット・レートを備えるシリアル型のデータ・コンバータ製品はさほど多くありません。
Q. 現在、使用している8ビットのプロセッサはシリアル・ポートを備えていません。「AD7893」のような12ビットのシリアルADCを、このプロセッサのパラレル・バスに接続する方法はありませんか?
A. 当然のことながら、外付けのシフト・レジスタを使用すれば実現可能です。シフト・レジスタからのデータをシリアル(かつ非同期)に読み出し、プロセッサのパラレル・ポートにクロック・ベースで入力すればよいということです。ただ、いただいた質問には「外付けのロジック回路を使うことなく」という前提条件があるのかもしれません。そういう意味であれば、シリアルADCを、1ビットのパラレルADCのように接続するという方法が考えられます。その場合、パラレルADCのSDATAピンをプロセッサのデータ・バスのうち1本に接続します。下の図では、データ・バスのD0に接続しています。ここで、何らかのデコード用のロジック回路を使用すれば、プロセッサのメモリ・ロケーションのうち1つにADCを対応づけることができます。そうすれば、読み出し(Read)コマンドを12回連続的に使用することで、ADCの変換結果を読み出すことが可能です。追加のソフトウェア・コマンドによって、12バイトのLSBを統合することにより、1つの12ビットのパラレル・ワードとして読み込むことができます。
この手法は、ビット・バンギング(Bit Banging)とも呼ばれます。これはソフトウェアの観点から言うと、非常に効率の悪い手法です。しかし、プロセッサがデータ・コンバータよりもはるかに高速に動作するアプリケーションであれば、その問題を許容できる可能性があります。
Q. 上の例では、ゲートを介してプロセッサの書き込み信号を入力することで、AD7893の変換を開始するよう構成しているようですね。この方法には問題はないのですか?
A. よく気づいてくれました。この例では、AD7893のマップド・メモリ・ロケーションにダミーの書き込みを行うことによって、変換を開始しています。データの交換は行いませんが、プロセッサからは変換の開始に必要な書き込み(write)パルスを供給しています。ハードウェアの観点から言えば、この構成では変換信号を生成する必要がないので非常にシンプルだと言えます。しかし、例えばデータ・アクイジションのように、AC信号を周期的にサンプリングする必要があるアプリケーションには、この手法は適していません。周期的にADCに書き込みを行うようにプロセッサをプログラムしたとしても、書き込みパルスの位相ジッタによって、達成可能なS/N比が大きく低下するからです。ゲートを経由することで書き込み信号のジッタは更に大きくなります。例えば、サンプリング・クロックの位相ジッタがわずか1ナノ秒程度だったとしても、100kHzの理想的な正弦波のS/N比は約60dBまで低下します(有効分解能は10ビット未満)。また、サンプリング信号のオーバーシュートやノイズにより、A/D変換の質が更に低下するおそれもあります。
Q.非同期のシリアル・インターフェースを備えるデータ・コンバータを選択すべきなのは、どのような場合ですか?
A. 非同期のリンクがあれば、デバイスはクロックを使用することなくデータを交換することができます。その場合、同一のデータ形式を使用するよう最初にデバイスをプログラムする必要があります。そのためには、特定のデータ・レート(単位は通常、ボーまたはビット/秒)を設定しなければなりません。また伝送の開始方法と終了方法も定義する必要があります。通常、それにはスタート・ビットとストップ・ビットという識別可能なデータ・シーケンスを使用します。伝送するデータには、エラーの検出を可能にするためにパリティ・ビットが付加されるケースもあります。
上の図は、デジタイジング・シグナル・コンディショナ「AD1B60」とPCの非同期COMポートの接続を示したものです。この例では、3線式/双方向のインターフェースを実現しています(図ではグラウンドの線は省略しています)。途中で、受信ラインと送信ラインの役割を入れ替えている点に注意してください。
非同期のデータ・リンクは、デバイスが散発的にしか通信を実施しないアプリケーションに有用です。すべての伝送データにはスタート・ビットとストップ・ビットが含まれています。そのため、デバイスは単にデータを出力することにより、任意のタイミングで通信を開始することができます。クロック信号と制御信号が不要なので、デバイス間の接続数を抑えられます。
Q. ADC製品のデータシートを見ていると、シリアル・インターフェース上で非連続なクロックを使用することが推奨されているものがあります。これはなぜでしょうか?
A. その仕様では、おそらくA/D変換の実行中にクロックを非アクティブにすることが求められているのでしょう。一部のADCでは、データ用のクロックがデバイスのアナログ・ブロックに連続的に供給されると、A/D変換の質に悪影響が及ぶことがあります。それを避けるための推奨事項だと思われます。I/Oポートでフレーミング・パルスを使用できれば、A/D変換の実行中に連続的なクロック信号を停止することが可能です。データ・コンバータに対するシリアル・クロックを、データ転送を実施するときだけ有効にするゲート信号としてフレーミング・パルスを使用するということです。
Q. データ・コンバータを、SPIまたはMICROWIREに対応させる方法はありますか?
A. SPI(Serial Peripheral Interface)とMICROWIREは、それぞれMotorolaとNational Semiconductorが開発したシリアル・インターフェース規格です。ほどんどの同期型/シリアル型のデータ・コンバータには、それらのポートに簡単に接続することができます。但し、グルー・ロジックを追加しなければならないケースもあります。
Q. いろいろと理解することができました。先入観を持つことなく、現行の設計でシリアルADCを使用することにします。ところで、データシートで定められているとおりに配線を完了し、マイクロコントローラによってA/D変換の結果を読み出したところ、ADCの出力が常にFFFHEXになっているようです。いったい何が起きているのでしょうか?
A. おそらく、通信上の問題が発生しています。ADCとプロセッサの間の接続や、タイミングと制御信号の設定を確認する必要があります。割り込みについても確認しなければなりません。Part 2では、シリアル・インターフェースを採用した設計において直面する可能性のある問題について説明することにしましょう。