1-Wireは主に機器内のセンサー等との通信に用いられる通信方式です。
一般的な接続方法を下図に示します。
なお、Armadillo-640は、マスターとして別のデバイスと通信できます。
1-Wireの主な特徴を以下に示します。
-
非同期式シリアル通信
-
デバイスはマスターとスレーブが存在
-
1つのバス上にマスターは1つ、スレーブは複数接続可能
-
信号線は1本のみ[]
-
信号線はオープンドレインなため、プルアップが必要
-
スレーブは製造時に与えられた64ビットの固有IDを持つ
-
通信は常にマスターが開始し、固有IDでスレーブを選択
-
約16.3kbps
固有IDはマスターがバスを起動した際、もしくはスレーブがバスに接続された際にマスターによって読み出され記憶されます。
1-Wireではクロック信号を別途設けず、Lowパルスの幅を用いてデータの転送をおこないます。
1ビットに対応する周期を「タイムスロット」といいます。
なお、タイムスロットにはスタンダード(1タイムスロット60μsec)とオーバード
ライブ(1タイムスロット8μsec)の二つがあります。以下の説明はスタンダード
の場合のタイミングです。
マスターは1を送信する場合は、1μs以上かつ短いパルスを出力します。
0を送信する場合は、60~120μsのパルスを出力します。
スレーブは立ち下がりエッジから15~60μsの間に信号線のサンプリングをおこないます。
値を読み出す場合、まず、マスターが1μs以上かつ短いパルスを出力します。
スレーブは1を送信したい場合は何もしません。
0を送信したい場合、立ち下がりエッジから15μs信号線をLレベルに保ちます。
マスターはマスター自体が出力するパルス期間が終わったあと、立ち下がりエッジから15μs以内に信号線のサンプリングをおこないます。
マスターとスレーブ間でのデータ転送は3つのシーケンスでおこないます。3つ
のシーケンスは、リセットシーケンス、ROMコマンドシーケンス、ファンクショ
ンシーケンスの順番に実行されます。
リセットシーケンスでは、まず、マスターがリセットパルスを出力します。
1-Wireバスにスレーブが接続されている場合、スレーブはプレゼンスパルスを
出力します。
ROMコマンドシーケンスでは、マスターが8ビットのROMコマンドを出力した後、
64ビットのROM IDを出力します。ROM IDの先頭8ビットはデバイス種類を示すファミリー
コードです。続く48ビットがシリアルナンバーになっています。最後の8ビットはCRC
です。ROMコマンドには次のものがあります。
-
SEARCH ROM(0xF0): バスに接続されているスレーブデバイスのROM IDを得る
ことができます。1回のSEARCH ROMコマンドで1つのデバイスのROM IDを特定す
ることができます。
-
READ ROM(0x33): バスに接続されているスレーブデバイスが一つだけの場合、
SEARCH ROMコマンドの代わりにREAD ROMコマンドを使用して、ROM IDを得るこ
とができます。
-
MATCH ROM(0x55): MATCH ROMコマンドでマスターが出力したROM IDに一致した
スレーブデバイスが、続くファンクションコマンドに応答します。それ以外の
デバイスは、次のリセットシーケンスを待ちます。
-
SKIP ROM(0xcc): SKIP ROMコマンドに続いて送信されたファンクションコマ
ンドは、バスに接続されているスレーブデバイス全てに同時に適用されます。
ファンクションシーケンスは、スレーブデバイスごとに異なります。基本的に
は、マスターが8ビットのフォワードコマンド出力した後、データの読み出しまたは
書き込みをおこないます。
7.2. 温度センサー(DS18B20)を使用する
ここでは、1-Wireバスに温度センサーICを接続する方法を紹介します。
使用するデバイスは以下のとおりです。
-
DS18B20(Maxim Integrated製)
今回使用するDS18B20は、以下の特長を持ちます。
-
単電源動作(3.0~5.5V)
-
電源 信号線供給・電源線供給
-
温度計測範囲 -55~125℃
-
分解能 9~12ビット(設定により可変)
-
変換時間(9ビット) 94msec
-
変換時間(12ビット) 750msec
Armadillo-640と温度センサーとの接続を示します。
信号線は、CON9 2ピンに接続します。
また、今回はVDDに+3.3Vを接続し電源は外部から供給します。
1-Wireドライバ・DS18B20のドライバを有効にしたLinuxカーネルと、DTBを作成します。
標準状態のカーネルのソースコードを元に変更する手順は次の通りです。
-
Device Treeの集
-
カーネルコンフィギュレーションでの1-Wireの有効化
-
カーネルコンフィギュレーションでのデバイスドライバの有効化
-
カーネルとDTBをビルドしArmadilloに書き込み
はじめにDevice Treeを作成します。ファイル名は arch/arm/boot/dts/armadillo-640-w1.dtsiです(「サンプルソースコード」のページからダウンロードできます)。
さきほどのファイルへのincludeをarch/arm/boot/dts/armadillo-640.dtsに追加してください。
続いて「イメージをカスタマイズする」と同様にmenuconfigを使用してカーネルコンフィギュレーションを変更します。
変更を加え、カーネルコンフィギュレーションを確定してください。
以上の変更後、「イメージをカスタマイズする」と同様にカーネルとDTBをビルドし、Armadilloに書き込んでください。
実際に、DS18B20から値の取得をおこなう手順を説明します。
Hardware Monitoringデバイスとしてアクセスする場合は以下のようにします。
温度(1/1000℃)が求められます。
DS18B20のファンクションコマンドには以下のものがあります。
-
CONVERT T(0x44):
このコマンドにより、温度変換がおこなわれます。変換結
果は、DS18B20の内蔵2バイトレジスタに格納されます。
-
WRITE SCRATCHPAD(0x48):
DS18B20の内蔵メモリに書き込みをおこないます。
書き込むデータは3バイト長で、TH、TL、Configuration Registerの順番に
送信します。
-
READ SCRATCHPAD(0xbe):
DS18B20の内蔵メモリを読み出します。
読み出すデータのバイト数は最大9バイトです。
途中で、マスターからリセットパルスを送信することで、
データの読み出しを中断できます。
DS18B20内蔵レジスタは次のようになっています。
表7.1 DS18B20内蔵レジスタ
バイト | 内容 |
---|
0 | Temperature Register LSB |
1 | Temperature Register MSB |
2 | TH or User Byte 1 |
3 | TL or User Byte 2 |
4 | Configuration Register |
5 | Reserved (0xff) |
6 | Reserved |
7 | Reserved (0x10) |
8 | CRC |
DS18B20の温度センサー分解能は、Configuration Registerの5ビット目と6ビット目で
決まります。それ以外のConfiguration Registerのビットは内部的に使用され、
上書きすることはできません。
表7.2 DS18B20温度センサー分解能
BIT 6 | BIT 5 | 分解能 |
---|
0 | 0 | 9 ビット |
0 | 1 | 10 ビット |
1 | 0 | 11 ビット |
1 | 1 | 12 ビット(デフォルト) |
Temperature Registerのフォーマットは次のようになっています。温度は摂氏
で格納されています。12ビット分解能の場合は、BIT10~BIT0全てのビットが
有効です。11ビット分解能の場合、BIT0が不定となります。10ビット、9ビット
分解能の場合も同様です。BIT15~BIT11は、温度が正の場合0、負の場合1と
なります。