HOME > ソフテックだより > 第101号(2009年11月4日発行) 技術レポート「1-Wireインターフェイス(読み書き編)」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第101号(2009年11月4日発行)
技術レポート

「1-Wireインターフェイス(読み書き編)」

1. 1-Wireとは

1-Wireとは元ダラスセミコンダクター社(現在、米マキシム社の子会社)が開発した1線式の非同期シリアルインターフェイスです。次のような特徴があります。

  • 信号線一本で送信と受信をおこなう。
  • 信号線一本にもかかわらず、複数のスレーブデバイスを接続できる。(マルチドロップ)
  • 各デバイスに固有IDを出荷時にレーザ書込みされている。(ROMコード)
  • 通信レート(16kbps:スタンダードモード 142kbps:オーバードライブモード)
  • 信号バスから給電可能(寄生電源)

製品には、温度センサ、タイマー、電圧センサ、電流センサ、バッテリーモニタ、メモリなどがありマキシム社のホームページ(※1)には製品シリーズが紹介されています。
今回は、1-Wire製品の初歩的な使用方法とマイコンを利用して実際にバスの読み書きする方法のご紹介をいたします。
マイコンを使い始めた技術系新入社員が、その機能(ポート割り込み、ハードウェアタイマ、タイマー割り込みなど)を組み合わせて、ハードウェアを制御することを学習するのにちょうどよい題材だと思います。シリアル通信としてまずは、RS-232を学習されると思いますが、他にもいろいろな特徴をもったインターフェイスがありますので、RS-232にとどまらずに他のインターフェイスにも積極的に挑戦してみてください。なお、今回のレポートは参考文献(※2)を主に参考しています。

2. 1-Wireの機能

2-1. ROMコード

製品にはすべてROMコードとよばれる各デバイスに固有の64ビットIDを持っています。ROMコードはファミリーコード(8ビット)、シリアル番号(48ビット)、 CRC(8ビット)から成り立ちます。ファミリーコードはデバイスの型式で共通です。シリアル番号はすべてのデバイスで異なるユニークなIDになっています。CRCとは読み出したIDが正しいかどうか検査するための付属的なデータです。複数のデバイスが1-Wireバスに接続されている場合には、マスタはROMコードを指定して応答するスレーブを特定する必要があります。

2-2. スレーブ検索

複数のデバイスにアクセスするためには、接続されているデバイスのROMコードを知る必要があります。ROMコードはすべてのデバイスで異なるため、事前にプログラムで知ることができませんので、それを調査する方法がスレーブ探索です。今回は説明を省略いたします。スレーブがひとつだけしか接続されていないときには、省略することができます。

2-3. デバイスコマンド

スレーブを制御するためのコマンドには1)ROMコマンド 2)機能コマンドがあります。ROMコマンドはデバイスの種類にかかわらず、1-Wireデバイス共通で持っているコマンドです。機能コマンドは、デバイスの種類に依存するコマンドです。たとえば、温度変換開始などのコマンドがあります。ROMコマンドには表1のものがあります。

名称 コード 機能
SEARCH ROM 0xF0 バスに接続されているスレーブデバイスのROMコードを調べるためのコマンドです。
READ ROM 0x33 デバイスがひとつだけのときに直接そのデバイスからROMコードを読み出すためのコマンドです。
MATCH ROM 0x55 ROMコードを指定してデバイスを選択するコマンドです。
SKIP ROM 0xCC ROMコードを指定しないでスレーブデバイスを選択するコマンドです。スレーブが接続されていないときに使用します。
ALARM SEARCH 0xEC デバイスのROMコードを調べるためのコマンドですが、アラーム状態(たとえば温度測定値が範囲外など)のものを検索します。

表1. ROMコマンド

2-4. デバイスへのアクセス

デバイスへのアクセスの手順を表2にまとめます。

手順 詳細
1 バスリセット(4-2章) マスタはリセットパルスを出力後、プレゼントパルスを検出します。これにより、スレーブの存在を認識することができます。
2 ROMコードの検索 サーチROMコマンドを発行し、接続されているデバイスの特定をします。
3 ROMコードの送信または、
スキップROMコマンド
マッチROMコマンドを発行し、応答するスレーブデバイスを指定します。
4 機能コマンド 機能コマンドを発行し、デバイスに動作を指示します。

表2. デバイスアクセス

3. 使用するマイコンの機能

1-Wireデバイスのアクセスに必要な機能の説明をします。ほとんどのマイコンには内蔵されている基本的な機能です。データの読み書きにタイマーを2つ使用する例を説明しましたが、順次タイミングを設定してゆけばもちろん1つだけでも機能を実現することは可能です。

3-1. I/Oポート

1-Wireバスは一線式の出力なので、I/Oポートを1ビット使用します。今回はスレーブからの入力を読み出すのにポート割り込みを使用しました。この端子がIRQ(入力割り込み要求)の受け付けられる端子でない場合は、IRQ端子にも分岐してバスを接続します。

3-2. タイマー

タイマーとは、あるクロックをカウントしてタイミングを生成するモジュールです。入力クロックの分周比を設定することで、時間分解能を変更できます。1-Wireのインターフェイスに利用する場合は、0.1μs〜0.5μs程度に設定すると使いやすいでしょう。バスのリードライトにはタイマーを2つ使用し、コンペアマッチ割り込み(※3)機能を使用します。

3-3. 割り込み処理

タイマーの再設定、バスの開放、タイマーカウンタ値の保存に割り込み処理を利用しています。1-Wireデバイスのタイミング制御にはμsオーダーのタイミング制御が必要になるため、割り込みを使わずに処理するのは難しいかもしれません。割り込み処理が開始するまでにはある程度の時間が必要なので、今回のようにハードウェアを直接制御する場合には、割り込み発生から処理開始までの時間を確認しておく必要があります。

4. 1-Wireバスのリードライト

次に実際の動作手順を説明します。信号線の名前をD1とします。信号制御のタイミング詳細については、それぞれのデバイスのデータシート(※4)を参照してください。以下では、バスのリセットともっとも基本的な1ビットデータの書込みと読出し方法について説明します。実際にはこの読み書きを組み合わせることで、ROMコードの読出しやコマンドの送信を実現します。

4-1. デバイスの接続

デバイス接続
図1. デバイス接続

信号線はすべてのデバイスで並列に接続され、抵抗を介して電源に接続されます。各デバイスはLまたはHi-Zをとることができます。ひとつでもLのデバイスが存在するとバスはLに、すべてのデバイスがHi-ZのときにバスはHになります。

4-2. バスリセット

バスリセット
図2. バスリセット

マスタデバイスは最初にバスを480μs以上‘L’レベルにします。これをバスリセットと呼びます。スレーブがひとつ以上接続されている場合は、リセット解除後プレゼントパルスがスレーブデバイスより出力されます。マスタデバイスは指定のタイミング(図2では67.5μs)でバスのレベルをサンプリングし、スレーブデバイスの存在を確認することができます。

4-3. 1ビットライト

1ビットライト
図3. 1ビットライト

1ビットのデータを扱う時間的な単位を1スロットと呼びます。1スロットは61μs以上に規定されています。マスタはバスを‘L’にすることで1スロットが開始します。図3の波形はタイマーを2つ使うと簡単に実現可能です。タイマー1はスロット長の管理に使用します。タイマー2には‘1’を書く場合には1〜15μs、‘0’を書く場合には60〜120μsを設定し、タイムアップでバスを開放することで、スレーブに1ビットのデータが書き込まれます。

4-4. 1ビットライト

1ビットリード
図4. 1ビットリード

スレーブからデータを読み出す場合にはあらかじめコマンドを書きこむ必要があります。たとえば、バスリセット後に0x33(READ ROMコマンド)を書き込むとその次のスロットからROMコード読出しを開始することができます。
1ビットリードするときもライトと同様にスロットはマスタがバスを’L’にドライブすることで開始します。リードの場合は毎回T1=1〜15μsのタイミングでマスタはバスを開放します。スレーブはマスタがバスを解放後、’L’を出力する場合にはバスをGNDにドライブします。’H’を出力する場合には、マスタのバス解放のタイミングでバスは’H’レベルに移行します。

図4では、スレーブのH/L出力を読み取りためにD1端子をIRQ端子に接続して、バスの立ち上がりで割り込みをかけてタイマーカウンタの読み取り値からH/Lを判定する方法を記載しました。
マスタがバスを開放するタイミングでタイマー2を設定し、規定された読み取りタイミングでバスをサンプリングすることでH/Lを判定する方法も可能ですが、読出し時のマスタは毎回スロットの開始に同じタイミングでバスを’L’にドライブする必要があるので、同じ設定のまま使用したほうがプログラムはシンプルになります。そのため、スレーブのH/Lの判定には、タイマーカウンタの値を使った別の方法を紹介しました。

5. おわりに

今回は基本的なデータの読み書きに機能を絞って説明しましたが、デバイスの検索方法やROMコードのCRC計算など1-Wireデバイスの利用に必要な機能までは説明できませんでした。デバイスの検索はパズルを解くような趣があり、面白い仕組みだと思います。
1-Wireデバイスはセンサ類の製品が充実しているため、温度、湿度などの気象観測に利用している方が多いようです。洋書ですが「Weather Toys」(※5)という本も出版されていて製作事例などが載っています。「観測機器の作り方」(※6)というホームページにも気象観測への利用例が豊富に紹介されていますので、興味をもたれたかたは実際に作成されてみるのも面白いと思います。

(Y.U.)

[注釈]
※1
マキシム社ホームページ http://japan.maxim-ic.com/auto_info.cfm
※2
「マイコンの1線2線3線インターフェイス活用入門 」CQ出版社 中尾 司著
※3
コンペアマッチ あらかじめレジスタに設定した値とタイマーカウンタが一致したときに発生するイベント。
※4
DS1990Rデータシート http://datasheets.maxim-ic.com/jp/ds/DS1990R-DS1990R-F5_jp.pdf
※5
Weather Toys: Building and Hacking Your Own 1-Wire Weather Station(Tim Bitson 著、Amazonで購入可能)
※6
「観測機器の作り方」 http://park18.wakwak.com/~weather/seisakuki.html#humid

関連ページへのリンク

関連するソフテックだより

ページTOPへ