|
1、2、3線シリアル・インターフェース(連載 第4回)
1-Wire(Dallas One Wire)
今回は1-Wireについて説明します。前回までのI2C、SPIとは違い、1-Wireには同期用のクロック信号がないので、この通信方式は非同期式です。非同期式通信では、パルスの幅やタイミングで同期をとります。そのため、時間的な規格が厳密に決められていて、各通信デバイスは、その規格を守らなければなりません。
1-Wireでも一つのマスタ・デバイスに、複数のスレーブ・デバイスを接続できます。スレーブはROMコード(ネット・アドレス)という識別番号をもっています。マスタは通信対象のデバイスをこのROMコードで指定し、そのデバイスと通信します。
●1-Wireデバイスの特徴
スレーブ・デバイスがもつROMコード(ネット・アドレス)は、デバイス固有の64ビット長の識別番号です。このROMコードにはシリアル番号が含まれていて、同じものは二つとありません。したがって、同じ型番のデバイスでもROMコードは異なります。
マスタは通信に先立って、複数の中から特定のスレーブを選択するのにROMコードを指定する必要がありますが、このようなユニークなコードであるため、固定値のROMコードを使うようなプログラムを複数セットで共用するわけにはいきません。そこで、マスタはバスに接続されているスレーブのROMコードを一つずつ調べるために「ROM検索」という処理を実行します。

●バス・リセット
マスタはコマンドをスレーブへ送信する前に、スレーブ・デバイスにリセット・パルスを出力します。これは、マスタがスレーブの存在を確認すると同時に、スレーブに通信の始まりを知らせるという意味があります。
接続されているすべてのスレーブは、このリセット・パルスを受けて自らもプレゼンス・パルスを返します。マスタはこのプレゼンス・パルスを受け取って、スレーブが存在することを確認します。なお、このプレゼンス・パルスは複数のスレーブが同時に出力するため、マスタにはスレーブが存在することはわかっても、何が何個接続されているかということまでは分かりません。それを知るには「ROM検索」の処理が必要です。
●ROM検索
バスに接続されているすべてのスレーブに対して、「ROM検索コマンド」を発行し、ROMコードを検索します。このコマンドを受けて、全スレーブは同時に、最下位から順番にROMコードのnビット目のビット値と、それを反転したビット値の2ビットを返します。詳細は省略しますが、全デバイスが出力した、この2ビットの値をそれぞれANDした結果でバイナリ・ツリー検索を実行します。この操作を64ビット分繰り返して一つのデバイスのROMコードを特定します。
さらに、このような64ビットのバイナリ・ツリー検索をすべてのデバイスに対して実行します。なお、スレーブ・デバイスが一つしか接続されていない場合はROMコードを指定しない「スキップROMコマンド」を使えば、ROM検索なしにスレーブにアクセスできます。
●通信の手順
まず、マスタがリセット・パルスを出力すると、バス上にあるスレーブ・デバイスがプレゼンス・パルスを返してきます[図(a)参照]。複数のデバイスがある場合は、マスタは検索コマンドを出力して接続されているデバイスの数とそのROMコードを調べます。デバイスが一つしかないときや、あらかじめROMコードがわかっている場合はこの検索は省略できます。
デバイスにアクセスする際は、このROMコードでデバイスを特定します(ROMコマンド発行)。あとはデバイスごとに決められた機能コマンドを決められた手順で送受信して、目的の動作を実行させます。なお、ROMコマンドを実行する直前ごとにバス・リセットが必要です(バス・リセットせずに複数のROMコマンドを続けて発行することはできない)。
コマンドは、バス・リセット→ROMコマンド→機能コマンド(「リードROMコマンド」のように機能コマンドを伴わない場合もある)という組み合わせで発行します。
●スロット
データはスロットという単位で送受信されます。一つのスロットで1ビットのデータを送受信するので、1バイトを送受信するには8スロット必要です。各スロットの送受信は、マスタがスロット開始のパルスを出力したときに始まります。スレーブはこのパルスを受けてデータ・ビットを送受信します[図(b),(c)参照]。

●CRC(巡回冗長検査)
CRCとは送受信したデータやROMコードの内容が正しいかどうかを検証するための検査方法のことです。ビットをシフトして入力データや特定のビットとXOR(排他的論理和)をとりながらビットを循環させて結果を出力します。
CRCの計算は、ROMコードの場合は64ビットのうちの下位54ビット(CRC値を除いた部分)が対象です。この54ビットを下位から1ビットずつCRCジェネレータ(計算処理)に入れていきます。最後にスレーブから受け取ったCRC値の8ビットをCRCジェネレータに入れると、ROMコードの内容が正しい場合は計算結果は0になります(つまり、CRC値を含めたすべてのビットをCRCジェネレータに入れて結果が0になればよい)。
CRCは、ROM検索でROMコードが得られたときに、ROMコードの内容が正しいかどうかを調べる場合などに使用します。温度センサのDS18S20では読み出したスクラッチ・パッドにもCRCデータをもっています。
●1-Wireのコマンド
1-Wireデバイスには大きく分けて2種類のコマンドが存在します。一つはROMコマンド(ネット・アドレス・コマンド)、もう一つは機能コマンド(ファンクション・コマンド)です。
ROMコマンドはスレーブを制御するためのコマンドで、ROMコードを検索したり、ROMコードを読み出す、複数の中から一つのスレーブを特定するといった、マスタがスレーブ・デバイスにアクセスするための基本的なものです。このコマンドはデバイスの種類にかかわらず、すべてのデバイスが共通でもっています(一部異なるコマンドをもつものもある)。
機能コマンドはデバイス特有の機能を制御するためのもので、デバイスの種類ごとに実装されているコマンドは異なります。たとえば温度センサのDS18S20では、温度を測定してA-D値に変換する「温度変換コマンド」や測定した温度のA-D値などを読み出す「リード・スクラッチ・バッド・コマンド」などがあります。
今回は1-Wireについて、説明しましたが、このインターフェースは信号線が1本で済むという簡単な接続ながら、複数のスレーブと通信できるなど、興味深いインターフェースだと思います。デバイスによっては、電源さえも、この1本の信号線から供給できるものもあります(パラサイト・パワー、ストロング・プルアップによる)。
実際に1-Wireデバイスを使用する場合、専用のハードウェアを内蔵していないPICなどのマイコンでも、タイミングを守れば比較的簡単にソフトウェアで制御できます。
次回は最終回です。応用例などを紹介してまとめたいと思います。
タグ:
1-Wire
投稿者: yoshida 日時: 2007年4月27日 07:08 | パーマリンク |TOPページへ ▲画面上へ
トラックバック
このエントリーのトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/234
|