1-Wireデバイスの活用

7.1. 1-Wireとは

1-Wireは主に機器内のセンサー等との通信に用いられる通信方式です。

一般的な接続方法を下図に示します。 なお、Armadillo-640は、マスターとして別のデバイスと通信できます。

images/bus_structures/w1.svg

図7.1 1-Wireの接続方法


images/bus_structures/w1_3slave.svg

図7.2 複数のスレーブを接続する場合


1-Wireの主な特徴を以下に示します。

  • 非同期式シリアル通信
  • デバイスはマスターとスレーブが存在
  • 1つのバス上にマスターは1つ、スレーブは複数接続可能
  • 信号線は1本のみ[15]
  • 信号線はオープンドレインなため、プルアップが必要
  • スレーブは製造時に与えられた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の間に信号線のサンプリングをおこないます。

images/waveforms/w1_bit_write.svg

図7.3 1-Wireプロトコル(書き込みスロット)


値を読み出す場合、まず、マスターが1μs以上かつ短いパルスを出力します。 スレーブは1を送信したい場合は何もしません。 0を送信したい場合、立ち下がりエッジから15μs信号線をLレベルに保ちます。 マスターはマスター自体が出力するパルス期間が終わったあと、立ち下がりエッジから15μs以内に信号線のサンプリングをおこないます。

images/waveforms/w1_bit_read.svg

図7.4 1-Wireプロトコル(読み出しスロット)


マスターとスレーブ間でのデータ転送は3つのシーケンスでおこないます。3つ のシーケンスは、リセットシーケンス、ROMコマンドシーケンス、ファンクショ ンシーケンスの順番に実行されます。

リセットシーケンスでは、まず、マスターがリセットパルスを出力します。 1-Wireバスにスレーブが接続されている場合、スレーブはプレゼンスパルスを 出力します。

ROMコマンドシーケンスでは、マスターが8ビットのROMコマンドを出力した後、 64ビットのROM IDを出力します。ROM IDの先頭8ビットはデバイス種類を示すファミリー コードです。続く48ビットがシリアルナンバーになっています。最後の8ビットはCRC です。ROMコマンドには次のものがあります。

  1. SEARCH ROM(0xF0): バスに接続されているスレーブデバイスのROM IDを得る ことができます。1回のSEARCH ROMコマンドで1つのデバイスのROM IDを特定す ることができます。
  2. READ ROM(0x33): バスに接続されているスレーブデバイスが一つだけの場合、 SEARCH ROMコマンドの代わりにREAD ROMコマンドを使用して、ROM IDを得るこ とができます。
  3. MATCH ROM(0x55): MATCH ROMコマンドでマスターが出力したROM IDに一致した スレーブデバイスが、続くファンクションコマンドに応答します。それ以外の デバイスは、次のリセットシーケンスを待ちます。
  4. SKIP ROM(0xcc): SKIP ROMコマンドに続いて送信されたファンクションコマ ンドは、バスに接続されているスレーブデバイス全てに同時に適用されます。

ファンクションシーケンスは、スレーブデバイスごとに異なります。基本的に は、マスターが8ビットのフォワードコマンド出力した後、データの読み出しまたは 書き込みをおこないます。

images/waveforms/w1.svg

図7.5 1-Wireプロトコル


7.2. 温度センサー(DS18B20)を使用する

ここでは、1-Wireバスに温度センサーICを接続する方法を紹介します。

使用するデバイスは以下のとおりです。

  • DS18B20(Maxim Integrated製)

今回使用するDS18B20は、以下の特長を持ちます。

  • 単電源動作(3.0~5.5V)
  • 電源 信号線供給・電源線供給
  • 温度計測範囲 -55~125℃
  • 分解能 9~12ビット(設定により可変)
  • 変換時間(9ビット) 94msec
  • 変換時間(12ビット) 750msec

7.2.1. 接続方法

Armadillo-640と温度センサーとの接続を示します。 信号線は、CON9 2ピンに接続します。 また、今回はVDDに+3.3Vを接続し電源は外部から供給します。

1-Wire接続温度センサー回路図

図7.6 1-Wire接続温度センサー回路図


7.2.2. 対応カーネルイメージの作成

1-Wireドライバ・DS18B20のドライバを有効にしたLinuxカーネルと、DTBを作成します。

標準状態のカーネルのソースコードを元に変更する手順は次の通りです。

  1. Device Treeの集
  2. カーネルコンフィギュレーションでの1-Wireの有効化
  3. カーネルコンフィギュレーションでのデバイスドライバの有効化
  4. カーネルとDTBをビルドしArmadilloに書き込み

はじめにDevice Treeを作成します。ファイル名は arch/arm/boot/dts/armadillo-640-w1.dtsiです(「サンプルソースコード」のページからダウンロードできます)。

&iomuxc {
        pinctrl_w1: w1grp {
                fsl,pins= <
                        MX6UL_PAD_LCD_DATA18__GPIO3_IO23 0x40010808
                >;
        };
};

/{
        onewire@0 {
                compatible = "w1-gpio";
                gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_w1>;
                status="okay";
        };
};

図7.7 armadillo-640-w1.dtsi


さきほどのファイルへのincludeをarch/arm/boot/dts/armadillo-640.dtsに追加してください。

#include "armadillo-640-lcd70ext-l00.dtsi"
#endif
#include "armadillo-640-w1.dtsi"        //追加行

/ {
        model = "Atmark Techno Armadillo-640";

図7.8 armadillo-640.dts


続いて「イメージをカスタマイズする」と同様にmenuconfigを使用してカーネルコンフィギュレーションを変更します。

[ATDE ~/linux-4.14-at[version]]$ make ARCH=arm menuconfig

図7.9 menuconfigの実行


Device Drivers  --->
  [*] Dallas's 1-wire support  --->                     ← 有効にする
     1-wire Bus Masters  --->
        [*] GPIO 1-wire busmaster                       ← 有効にする
     1-wire Slaves  --->
        [*] Thermal family implementation               ← 有効にする
   [*] Hardware Monitoring support  --->                ← 有効にする

図7.10 menuconfig


変更を加え、カーネルコンフィギュレーションを確定してください。

以上の変更後、「イメージをカスタマイズする」と同様にカーネルとDTBをビルドし、Armadilloに書き込んでください。

7.2.3. 使用例

実際に、DS18B20から値の取得をおこなう手順を説明します。

[armadillo ~]# cat /sys/bus/w1/devices/28-000002219791/w1_slave
ae 01 4b 46 7f ff 02 10 aa : crc=aa YES
ae 01 4b 46 7f ff 02 10 aa t=26875
[armadillo ~]# cat /sys/bus/w1/devices/28-000002219791/w1_slave
ad 01 4b 46 7f ff 03 10 ab : crc=ab YES
ad 01 4b 46 7f ff 03 10 ab t=26812

図7.11 コマンド実行例


Hardware Monitoringデバイスとしてアクセスする場合は以下のようにします。 温度(1/1000℃)が求められます。

[armadillo ~]# cat /sys/class/hwmon/hwmon0/temp1_input
26875
[armadillo ~]# cat /sys/class/hwmon/hwmon0/temp1_input
26812

図7.12 コマンド実行例(Hardware Monitoring)


7.2.4. プロトコル

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 6BIT 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と なります。

DS18B20 Temperature Registerフォーマット

図7.13 DS18B20 Temperature Registerフォーマット




[15] 通信線で電源供給も行う場合もあります。