1 章][第各インターフェースの用語や動作原理を理解する

1，2，3 線シリアル・インターフェースの基本

最初に，2線式のI2C，3線式のSPI，1線式の1-Wireの3種類のシリアル通信インターフェースについて，
基本的な概念や動作原理，用語などを説明します．
通信の用語で同期式/非同期式という言葉がよく使われますが，同期式とは同期用のクロック信号がデータ信号と一緒に伝えられるもので，本書ではI2CとSPIが相当します．この通信ではクロック信号を基準にして信号を送受信します．
非同期式とは同期用のクロック信号がないもので，パソコンなどで広く使われているRS-232Cレベルのシリアル・インターフェースはその代表的なものです．本書では1-Wireが相当します．この通信では信号のパルス幅などを基準として信号を送受信します．

（Inter-Integrated Circuit）
1-1 2 線でつなぐ I2C● I2Cとは
I2Cとは，オランダのフィリップス社が提唱する2線式の同期式シリアル通信インターフェースのこと
で，シリアル・データ信号SDAとシリアル・クロック信号SCLの2本の信号で通信します．シリアル・ク
ロック信号SCLは，バス・マスタが生成します．シリアル・データ信号SDAは，送受信により入力と出力の向きが切り替わる双方向信号です．図1-1のようにマスタ一つに対して複数のスレーブ・デバイスをバス接続できます．また，マルチ・マスタ・モードではマスタを複数もつことも可能です．
スレーブには固有のアドレスが割り付けてあり，通常，マスタはそのアドレスを指定してスレーブ・
デバイスを特定し通信します．スレーブ側でジェネラル・コール・アドレスという機能をサポートしていれば，複数のスレーブ・デバイスに一斉にデータを送信することもできます．不特定のスレーブに配信するということで，いわゆるブロードキャスト（放送）方式です．
通信レートは標準モードで0〜100kbps，ファースト・モードで最大400kbpsとなっていますが，後にハイ・スピード・モードの最大3.4Mbpsという高速な仕様も決められています．
● I2C通信の動作
通信の手順は，まずマスタがスタート・コンディションを発行し，コントロール・バイトをバス上のすべてのスレーブへ対して送信します．このコントロール・バイトにはスレーブのアドレスが入っていて，これを受信したスレーブは，そのアドレスが自分のものと一致するかどうかを調べます．

16

第 1 章 1，2，3 線シリアル・インターフェースの基本シリアル・データ
入出力
SCL
SDA

シリアル・
クロック信号（マスタが供給）

SDA SCLI 2C BUS

SDA SCL2

SDA SCL

2

I Cマスタ

プルアップ
抵抗器

I Cスレーブ#1

2

I Cスレーブ#2

SDA SCL2

I Cスレーブ#3（a）シングル・マスタ（一つのマスタに対して複数のスレーブが接続されている場合）

I 2C BUS

プルアップ
抵抗器

SCL
SDA

I2Cマスタ#1

SCL
SDA
SDA SCL
2

I2Cマスタ#2

I Cスレーブ#1

SCL

SDA SCL2

I Cスレーブ#2

SDA SCL2

I Cスレーブ#3

SDA（b）マルチ・マスタ（複数のマスタに対して複数のスレーブが接続されている場合）

図1-1

I 2 C バスの接続

I 2 Cバスに複数のスレーブ・デバイスを接続する場合の構成図．

アドレスが自分宛てでなかったスレーブは，待機状態に戻ります．アドレスが自分宛てであったスレーブは，コントロール・バイトに含まれる送受信（R/W）ビットの値に応じてデータをマスタから受信す
るか，マスタへ送信します．データは8ビットですが，その後にACKデータが1ビットあります．ACKはマスタ，スレーブにかかわらず，データを受信したほうが出力します．
通信が終われば，マスタはストップ・コンディションを発行して，スレーブに通信の終わりを通知します．スレーブは，この通知を受け取り待機状態に戻ります．
転送されるデータは8ビット単位で，転送は最上位（MSB）から始まります．
図1-2は，通信時の転送ビットを簡易的に示したものです．各ビットが上下2列で並んでいますが，上段はマスタが出力（スレーブが入力）するビットを，下段はマスタが入力（スレーブが出力）するビットを示しています．
図1-2（a），（b）はI2Cアドレスが7ビットのときのもので，本書で扱うのはすべてこのモードです．図1（
2 c），
（d）
はI2Cアドレスが10ビットのもので，PICのMSSPはこの10ビット・モードもサポートしていて，半自動的に10ビット・モードを制御することもできます．
● スタート・コンディションとストップ・コンディション
マスタは，通信を始める際にスレーブに対して通信シーケンスの始まりを示すためにスタート・コン

1-1 2 線でつなぐ I2C（Inter-Integrated Circuit）

17

18

第 1 章 1，2，3 線シリアル・インターフェースの基本

1

1

1

0

A9 A8 W

コントロール・バイト（W）

I 2 Cのデータ・フォーマット

1

1

1

ACK

0

(＊2)

マスタが出すNOACKACK D7 D6 D5 D4 D3 D2 D1 D0

マスタの入力データ
（最終）

ACK

スレーブが返すACK

A7 A6 A5 A4 A3 A2 A1 A0
ACKI2Cアドレス（下位8ビット）

ACK

RS

1

1

1

0

A9 A8 R
リピート・スタート・コンディション

1（d）10ビット・モード時のマスタのデータ入力（スレーブのデータ出力）

スレーブが返すACK

コントロール・バイト（R）

I2Cアドレス（上位2ビット）を含む

NAK
(＊1)

P

スレーブが返すACK
マスタが出すNOACKACK D7 D6 D5 D4 D3 D2 D1 D0

マスタの入力データ（最終）

スレーブが返すNOACK

D7 D6 D5 D4 D3 D2 D1 D0

マスタの出力データ（c）10ビット・モード時のマスタのデータ出力（スレーブのデータ入力）

A9 A8 W

I2Cアドレス（下位8ビット）

P

NAK P

（b）7ビット・モード時のマスタのデータ入力（スレーブのデータ出力）

スレーブが返すACK

A6 A5 A4 A3 A2 A1 A0 R

コントロール・バイト

I2Cアドレス（7ビット・モード）
を含む

A7 A6 A5 A4 A3 A2 A1 A0

この値は固定1

D7 D6 D5 D4 D3 D2 D1 D0

NAK
スレーブが返すACK
スレーブが出すNOACK(＊1)（a）7ビット・モード時のマスタのデータ出力（スレーブのデータ入力）

ACK

マスタの出力データ

NAK P

この図は基本的な通信データのフォーマットを簡易的に表したもの．ACK/NOACK はデータを受信したほうが返す．10 ビット・アドレス・モードではアドレスは2回に分けて送受信される．マスタが最終データを受信したときは，マスタはスレーブに対してNOACK を送信する．

図1-2

S

1

(＊2)

A6 A5 A4 A3 A2 A1 A0 W

コントロール・バイト（W）

I2Cアドレス（上位2ビット）を含む

S

S

S

コントロール・バイト

I2Cアドレス（7ビット・モード）を含む

I2Cアドレス（上位2ビット）を含む※上の列はバス・マスタの出力，下の列はバス・マスタの入力（スレーブの出力）を表す．
(＊1) スレーブによってはACKを返す場合もある．
(＊2) ʻ1ʼ(Rと表記)のときにデータはスレーブ
からマスタへ，ʻ0ʼ(Wと表記)のときにデータはマスタからスレーブに送信される．

S ……… スタート・コンディション
R S …… リピート・スタート・コンディション
P ……… ストップ・コンディション
NAK…… NOACK（ACK= H ）

ディションを発行します．これは，シリアル・クロックSCLが
H

レベルから

L

H

レベル時にシリアル・データSDAをレベルに変化させることで成立します．

通信の終わりには，ストップ・コンディションを発行して通信シーケンスの終わりをスレーブに知らせます．これはSCLが
ベルから

H

H

レベルのときに，スタート・コンディションのときとは逆にSDAを

L

レ

レベルに変化させることで成立します．

通常のデータ・ビットではSCLがLレベルのときにSDAのレベルを変化させるので，データ・ビッ

トとスタート/ストップ・コンディションは区別できます．
EEPROMのアクセスの際などには，スタート・コンディションを発行した後，ストップ・コンディシ
ョンを発行する前に再びスタート・コンディションを発行することがあります．これをリピート（またはコンティニアス）スタート・コンディションと言います．
これはI2CのEEPROMからデータを読み出す際など，一つの通信シーケンスの中で，送信と受信の向きが切り替わる場合に発生します．図1-3にEEPROMから1バイトのデータを読み出す際のバスの波形を示します．通信手順は次のようになります．
（1）スタート・コンディション発行 ･･････････････････････ 通信シーケンスの開始（2）コントロール・バイト（W）
送信 ･･････････････････････ I2Cアドレスと書き込みの指定（3）ROMアドレス1送信 ････････････････････････････････････ ROMアドレスの上位8ビットを出力（4）ROMアドレス2送信 ････････････････････････････････････ ROMアドレスの下位8ビットを出力（5）リピート・スタート・コンディション発行 ････････ 通信シーケンスの再開（6）コントロール・バイト（R）
送信 ･･･････････････････････ I2Cアドレスと読み出しの指定（7）ROMデータ受信 ･････････････････････････････････････････ ROMデータを入力（8）ストップ・コンディション発行 ･･････････････････････ 通信シーケンスの終了
2

I CアドレスとはI2Cのスレーブ・デバイスのアドレスのことで，ROMアドレス（EEPROM上のアドレス）とは区別してください．このような手順は，接続されるスレーブ・デバイスにより変わります．
● I2Cアドレス
スレーブ・デバイスの指定方法には，7ビット・モードと10ビット・モードの2種類があります．図1-2に，それぞれの通信フォーマットを簡略化した図を示しています．10ビット・モードの場合は1回のコントロール・バイトではアドレスを送信できないので，2回に分けて送信します．
マスタが10ビット・モードで送信する場合は，図（c）のようなフォーマットになります．第1アドレスが含まれるコントロール・バイトは上位5ビットが11110 の固定値で，その後にスレーブ・アドレ

スの上位2ビットのA9，A8，最下位は送受信の向きを示すR/Wビットというような構成になっています．
それに続けて第2アドレス（A7 〜A0）の8ビットが続きます．この後に，データ・バイトが出力されます．
これ以降は7ビット・モードのときと同じです．
マスタが10ビット・モードで受信する場合は，図（d）のように少し複雑なフォーマットになっています．
第2アドレスを送信した後，リピート・スタート・コンディションを発行し，その後，第1アドレスを再び送信し，その次からデータを受信します．これ以降は7ビット・モードのときと同じです．このように
リピート・スタート・コンディションが入っているのは，I2Cの基本的なフォーマットに互換性をもたせたまま，第2アドレスのバイトを拡張したためだと思われます．リピート・スタート・コンディション以降は，図（b）と同じ形をしていることがわかります．

1-1 2 線でつなぐ I2C（Inter-Integrated Circuit）

19

スタート・
コンディション
SCL

図1-3
リピート・スタート・コンディションの例

1

SDA

I 2 C EEPROM の 24LC64 で 発 生 す る リ ピ ート・スタート・コンディションの使用例を示したチャート．ROM アドレスを書き込んだ
後，ROM データを読み出す際にライトからリードへシーケンスを切り替える必要がある．
この場合にスタート・コンディションを再発行する．なお，I 2 C のデバイス・アドレスとROMのアドレスを混同しないように注意．

0 1

0 A2 A1 A0 W

コントロール・バイト(I2Cアドレス+W)

X X X a12 a11 a10 a9 a8
A
CK

ROMの上位アドレス

A
C
K

X：何でもよい

SCLが H レベルのときにSDAを H から L レベルに設定してスタート・コンデ
ィションを発生させる● クロック・ストレッチ
スレーブはマスタからデータを受信した後（またはマスタへデータを送信した後）に，内部処理に時間がかかるなどの理由でマスタに対してWAITをかけることができます．スレーブが強制的にクロック信号
SCLを L レベルにすると，マスタはクロックが出せなくなるので，通信シーケンスを一時停止します．ス
レーブは，準備が整うとSCLの L レベル出力を解除します．これでマスタは通信シーケンスを再開します．
このように，マスタを待たせるためにスレーブがSCLを強制的にLレベルにすることをクロック・

ストレッチと言います．
● ACKとNOACK
I2Cのデータ送受信の単位は8ビットですが，9ビット目にACKビットがあります．これは通信の正否を示すほかに，何らかの意味をもたせてある場合もあります．ACKビットはマスタ/スレーブにかかわらず，
必ず受信したほうが出力します．たとえば，マスタが8ビットのデータをスレーブに出力し終わると，スレーブがACKを返します．逆にマスタが8ビットのデータを入力し終わると，マスタがスレーブにACKを返します．
I2Cの場合，ACKビットがLレベルのときがます．マスタは，通常はデータの受信後にNOACKを返します．この

NOACK

ACK

ACK ， H

レベルのときが

NOACK

と表現し

をスレーブへ返しますが，最終データの受信後はにより，スレーブはデータの転送が終わったと判断し，送信シーケンスをリセットします．
24LC64（I2CのEEPROM）などでは，マスタがシーケンシャル・リード（データの連続読み出し）の際に最終データをNOACKにしてEEPROMへシーケンシャル・リードの終了を通知するようなケースもあります．
スレーブは，最終データを受信したときでもにもよりますが，スレーブ受信時の

NOACK

NOACK

を返さない場合があります．マスタ側の対応出力は必須ではありません．24LC64ではバイト・ライ

ト（1バイト書き込み）時やページ・ライト時の最終バイトの送信時でもACKを返してきます．そもそも，固定長のデータなら最終バイトかどうか判断できますが，可変長のデータをスレーブへ書き込む場

20

第 1 章 1，2，3 線シリアル・インターフェースの基本

2nd
4th
1st
3rd

リピート・スタート・
コンディション
9th

ストップ・コンディション
SCL

1

a7 a6 a5 a4 a3 a2 a1 a0

ROMの下位アドレス

A
C
K

SCLが L レベルの間にSDAをいったん H レベルにする

0 1

0 A2 A1 A0 R

コントロール・バイト(I2Cアドレス+R)
SCLが H レベルのときにSDAを H から L レベルに設定してスタート・コンデ
ィションを発生させる

D7 D6 D5 D4 D3 D2 D1 D0
ACK

ROMのデータ
SCLが H レベルのときにSDAを L から H レベルに設定してストップ・コンデ
ィションを発生させる

SDA
N
O
A
C
K

合は，スレーブ側は最終バイトかどうかを知る術がないわけですからNOACKん．本書でも，PICのスレーブ受信時の応答はACK

タ側が最終バイトの応答に

NOACK

NOACK

ではなく

の返しようがありませにしています．もし，マスを期待している場合は，マスタかスレーブのどちらかのプログラ

ムを修正する必要があります．
● マルチ・マスタ・モード
I2Cでは，同一のI2Cバス上に複数のマスタ・デバイスを置くことができます［図1-1（b）参照］．マスタはクロックを供給することと，自らの都合でデータを入出力することのため，複数のマスタが同時に動作するとクロックとデータ信号の衝突が起こります．この状態をバス・コリジョン（衝突）と言います．
バス・コリジョンが発生すると，当然ながら正常な通信はできません．マルチ・マスタ・モードをサポートしているマイコンにはバス・コリジョンを検出する機能があり，衝突が起こると割り込みが発生するなどしてそのことがわかるようになっています．
実際は，マスタBが通信しようとしたときにすでにほかのマスタAが通信していると，そのことがマスタBで検出できるようになっているため，マスタBの通信シーケンスが失敗するようになっています．このような状態を調停（アービトレーション）
負けといいます．
バス・コリジョン（調停負け）が発生したマスタBは，バスが解放されるのを待ってから通信をやり直さなければなりません．
PICの場合は，自分が出しているSDA信号のレベルと実際のバスのSDA信号の状態が異なることを検出すると，バス・コリジョン状態になります．
ところで，マスタはI2Cアドレスをもたないことからもわかるように，マスタ同士で通信することはできません．
マルチ・マスタの用途として一般的と思われるのは，ROMやA-Dコンバータなどのスレーブ・デバイ
スを複数のマスタで共有することです．RAMなどを共有メモリとして使えば，工夫しだいでマスタ間で通信させることもできるでしょう．

1-1 2 線でつなぐ I2C（Inter-Integrated Circuit）

21

（Serial Peripheral Interface）
1-2 3 線でつなぐ SPI● SPIとは
SPIとは，米国モトローラ（現フリースケール）社が提唱する3線式の同期式シリアル通信インターフェースのことで，データ出力信号SDO，データ入力信号SDI，クロック信号SCKの3本の信号で通信します．
SPIマスタに複数のスレーブを接続する場合は，図1-4のような接続形態になります．SPI通信の最大の特徴は，送信と受信が同時に起こることです．マイコンとペリフェラル・デバイスなどの通信に使われます．ペリフェラル・デバイスにはA-Dコンバータ，D-Aコンバータ，EEPROMなどがあります．
SPIは通信レートやタイミングの厳格な規定はありません．
● SPI通信の動作
SPI通信は一言でいうと，マスタとスレーブのデータの内容を入れ替えるような動作をします．
マスタが生成するシフト・クロック（シリアル・クロック）は，マスタ内のシフト・レジスタをシフトさせると同時に，スレーブのシフト・レジスタもシフトさせます（図1-5参照）．
マスタの最上位ビット（MSB）のデータは，シフトの結果，スレーブの最下位ビット（LSB）に挿入されます．同時に，スレーブのMSBのデータもマスタのLSBに挿入されます．この動作を8回繰り返すと，マスタのシフト・レジスタとスレーブのシフト・レジスタの内容が入れ替わります．これがSPI通信の動作
原理です．
1バイトのデータ転送は，最上位（MSB）から始まり最下位（LSB）で終わります．
● SS（スレーブ・セレクト）
信号
SPI通信は，基本的には一つのマスタに対して一つのスレーブが接続されるという1：1の接続形態です

シリアル・データ出力（マスタが出力）
SDI
SDO
SCK

シリアル・データ入力（スレーブが出力）

SPI BUS

プルアップ
抵抗器

シリアル・クロック信号（マスタが供給）SCK SDO SDISCK SDI SDOSCK SDI SDOSCK SDI SDO

SPIマスタSS1 SS2 SS3SPIスレーブ#1

SPIスレーブ#2

SPIスレーブ#3

SS

SS

SS

スレーブ・セレクト信号．このうちの一つの信号をアクティブにすることでスレーブを選択する．複数のSS信号が同時にアクティブになることはない

図1-4

SPIバス接続

SPI バスに複数のスレーブ・デバイスを接続する場合の構成図．マスタはSS 信号により一つのスレーブを選択し，そのスレーブに対してリード/ライトする．

22

第 1 章 1，2，3 線シリアル・インターフェースの基本

が，図1-4のように複数のスレーブをバス接続してSS（スレーブ・セレクト）信号でその中の一つのデバイスを選択し，個別に通信させることもできます．マスタは通信が必要なスレーブのSS信号をアクティブにすることでスレーブを特定し，そのスレーブとだけ通信します．
このSS信号は，通信シーケンスのリセットに使われることもあります．たとえば，8ビット未満の通信の最中にSS信号を非アクティブにすると，通信はリセットされ，次回SS信号をアクティブにしたときは，MSBから通信が始まるようになります．通信するビット数が8の倍数でない場合に，むだなビットを送信
しないために通信を途中で打ち切るというような用途もあります．

SPIマスタSDOとSDIはマスタ，スレーブ間でクロス接続する
SDO

SDI

SPIスレーブ

バッファ
通信開始時

バッファ
通信終了時

M7 M6 M5 M4 M3 M2 M1 M0
シフト・レジスタ

SDI

SDO

SCK

SCK

通信開始時

通信終了時

S7 S6 S5 S4 S3 S2 S1 S0
シフト・レジスタ

シフト・クロック発生（a）バッファには通信開始前にはこれから相手に送信しようとしているデータが，通信終了時には相手から受信したデータが入っている
SPIマスタSPIスレーブ

シフト前（通信開始時直前）
M7 M6 M5 M4 M3 M2 M1 M0
MSB
LSB

S7 S6 S5 S4 S3 S2 S1 S0MSB
LSB

シフト1回後M6 M5 M4 M3 M2 M1 M0 S7

S6 S5 S4 S3 S2 S1 S0 M7

シフト2回後M5 M4 M3 M2 M1 M0 S7 S6

S5 S4 S3 S2 S1 S0 M7 M6

シフト7回後M0 S7 S6 S5 S4 S3 S2 S1

S0 M7 M6 M5 M4 M3 M2 M1

シフト8回後（通信終了時）S7 S6 S5 S4 S3 S2 S1 S0

M7 M6 M5 M4 M3 M2 M1 M0（b）8回シフトすると，マスタとスレーブの内容が入れ替わる

図1-5

SPI 通信の動作原理

SPI 通信を行う場合のデータ・ビットの動きを説明した図．マスタとスレーブを一つの16 ビット・シ
フト・レジスタと考えると，8 回シフト（ローテート）
したときに上位8 ビットと下位8 ビットが入れ替
わる．これをマスタとスレーブに置き換えれば理解しやすい．

1-2 3 線でつなぐ SPI（Serial Peripheral Interface）

23

（Dallas One Wire）
1-3 1 線でつなぐ 1-Wire● 1-Wireとは1-Wireとは，米国ダラス・セミコンダクタ社（マキシム社に買収され，現在マキシムの子会社）が提唱する1線式の非同期式シリアル・インターフェースのことです．送信と受信を1本の線で交互に行います．
また，信号線が1本で済むにもかかわらず，複数のスレーブ・デバイスをバス接続することができます．
接続は図1-6のように非常にシンプルなものですが，その分制御が複雑になっています．
通信レートはスタンダード・モードで最大16kbps，オーバ・ドライブ・モードで最大142kbpsと規定されています．
発表当初，1-Wireバスの伝達距離は数mと，近距離のペリフェラル間の通信が対象とされてきましたが，
近年ではアクティブ・プルアップやツイスト・ペア銅線を採用するなどで伝達距離を延ばし，数百m以上に及ぶ長距離の1-Wireネットワークも構築されています．
ペリフェラル・デバイスにはEEPROM，RAM，温度センサ，A-Dコンバータ，D-Aコンバータ，バッテリなどの電圧監視コントローラなど多種多様なものが用意されています．
1-Wireインターフェースを搭載したデバイスに

i-Buttonというものがあります．これは，ステンレ

ス製のCanパッケージ（ボタン電池のような形状）のデバイスで，小型，低コストの温度センサや認証シス
テムなどに利用されています．
● 1-Wireの動作
まず，マスタがリセット・パルスを出力すると，バス上にあるスレーブ・デバイスがプレゼンス・パ
ルスを返してきます［図1-7（a）］．複数のデバイスがある場合は，マスタは検索コマンドを出力して接続されているデバイスの数とそのROMコード（識別番号）を調べます．デバイスが一つしかないときやあら
かじめROMコードがわかっている場合は，この検索は省略できます．
デバイスにアクセスする際は，このROMコードでデバイスを特定します．あとは，デバイスごとに決められたコマンドを決められた手順で送受信して目的の動作を実行させます．通信はスロットという単位で制御されます．1ビットのデータは1スロットで表します（詳細は後述）．
● ROMコード（識別番号）
ROMコードとは，スレーブ・デバイス同士で決して重複することのない64ビット長の固有の識別番号
です．製造時にレーザでデバイス一つ一つにユニークなコード（同じ種類，型番のデバイスでも違うコー
プルアップ
抵抗器

1-Wire BUS

DQ

DQ

DQ

DQ

DQ

1-Wireマスタ

1-Wireスレーブ#1

1-Wireスレーブ#2

1-Wireスレーブ#3

図1-6

1-Wireバス接続

1Wireバスに複数のスレーブ・デバイスを接続する場合の構成図．

24

第 1 章 1，2，3 線シリアル・インターフェースの基本

DQ（マスタの出力）

Hi-Z(Pullup H )リセット・パルス）（

スレーブはリセット・パルスを検出してプレゼンス検出パルスを出力する

Hi-Z(Pullup H )

DQ
スレーブ
の出力

プレゼンス検出パルス
複数のスレーブがつながっている場
合は，負論理でORしたものになる

DQ
実際のバス
の信号

）

（

マスタが出力する
リセット・パルスt1

スレーブが出力する
プレゼンス検出パルス
マスタがサンプリングしてスレーブの存在を認識する（（a）バスの初期化
マスタがリセット・パルスを出力すると，接続されている全スレーブがプレゼンス検出
パルスを出力する．マスタはこの出力を読み取ってスレーブが存在することを認識する
スロット

DQ（マスタの出力）

スロット

スレーブの入力 1

スレーブの入力 0

t2

t2
出力 0

（

）

出力 1

（b）マスタのデータ出力（スレーブのデータ入力）
マスタはスロット単位でビット・データに応じた長さの L レベル・パルスを出力する．
スレーブはスロットの始まりからt 2後の状態を読み取ってビット値を判断する）

マスタが受信を開始するために

L レベルに設定

スロット

スロット

DQ
（マスタの出力）

DQ（スレーブの出力）

L レベルになったことを受けてスレーブがデータを出力.
※スレーブはあらかじめ，データを送信する種類のコマンドを受信している
出力 0

出力 1 （ H レベルのまま）
マスタの入力 1

マスタの入力 0

DQ（実際のバスの信号）

t3t3（c）マスタのデータ入力（スレーブのデータ出力）
マスタが L レベルを出力することで一つのリード・スロットが始まる．スレーブはスロットの始まりを検出してビット・データが 0 の場合は L レベルのパルスを出力する．マスタはスロットの始まりから t 3 後の状態を読み込んで，スレーブが出力したビ
ット値を判断する．なお，スレーブがデータを出力するのは，データを出力する種類のコマンドをマスタから受ているときに限られる．

（

図1-7

）

1-Wireの信号波形

この図は1-Wire 通信の出力波形を示したもの．通信はバスの初期化（マスタがリセット・パルスを発生させる）から始まる．

1-3 1 線でつなぐ 1-Wire（Dallas One Wire）

25

ドになる）が書き込まれているため，「64ビット・レーザ書き込みROM」とも言われます．
1-Wireのすべてのデバイスは，第13章の図13-5に示すような固有のROMコードを内蔵しています．この内容は，48ビットのシリアル番号（デバイス固有）とファミリ・コード（デバイスの種類により決まっている），それに8ビットのCRC値（ROMコードの内容が正しいかどうかを検証するもの）です．複数のデバ
イスが1-Wireバスに接続されている場合，マスタはこのROMコードを指定してデバイスを特定しなければなりません．
● 1-Wireバスの状態
1-Wireのバスには， L

レベルとハイ・インピーダンス（以下Hi-Z）の二つの状態がありますが，バス

は抵抗器により電源にプルアップされているため，Hi-ZのときはでH

H

レベルになります．わざわざHi-Z

レベルにするのは，マスタと複数のスレーブをワイヤードOR接続にするためです．

本来，このような接続にはオープン・ドレイン出力のバッファを使わなければなりませんが，入出力ポートを入力に切り替えてハイ・インピーダンス状態にすることで代替するといううまい方法です．バ
ス上のいずれかのデバイスが
スが同時に

L

L

レベルを出力するとバスは

L

レベルになりますが，複数のデバイレベルを出力しても，それを負論理のOR（論理和）条件で検出できます．

PICやH8などの汎用入出力ポートを1-Wireのバス駆動に使用する場合も，上記の原理を適用できます．
ポートを出力に設定してLレベルを出力すればバスは

ばバスはHi-Z状態となってプルアップ抵抗器でH

Lレベルになり，ポートを入力に設定すれレベルになります．このとき，必要ならバスの状態を読み込むこともできるわけです．
1-Wireのマニュアルなどにはバス接続をワイヤードANDとして記述してありますが，リセット・
パルスは負論理（ L

レベルのときアクティブ）の信号なので，負論理のワイヤードORと解釈したほうがよいでしょう．他方，データ・ビットの場合は正論理と考えてワイヤードANDと考えたほうがよいと思います．ド・モルガンの定理により，負論理入力の OR は正論理入力の AND（正確にはNAND）になります．
● リセット・パルスとプレゼンス・パルス
通信を始めるにあたって，バス上にスレーブ・デバイスが存在するかどうかを調べるために，マスタは一定時間の間バスをLレベルにします（リセット・パルス）．これをバス・リセットといいます．ス

レーブ・デバイスは，バスが一定時間Lレベルになっているのを検知して，自らもバスにL

レベ

ルを出力します（プレゼンス・パルス）．
マスタは，規定時間後にL

レベルの出力を停止した後にバスの状態を調べます．このときスレーブ

が L レベルを出力しているため，マスタはそれを検出してスレーブが存在していることを認識します．
図1-7（a）は，そのときの動作のようすをマスタとスレーブに個別に分けて描いたものですが，DQ'とDQ"は同じバス上でつながっているため，実際の波形はDQのようになります．
● マスタのデータ送信（スレーブのデータ受信）
データの送信は，スロットという単位で考えます．1ビットのデータは1スロットで伝達されるため，
1バイト送信するのに8スロット必要です．1スロットの始まりはバスがHi-Z状態（プルアップされている

26

第 1 章 1，2，3 線シリアル・インターフェースの基本

ためHレベル）からL

レベルになる立ち下がりエッジです．このを表します．簡単にいうと， L

レベルの幅が長ければ0 ，短ければL

レベルの幅で0と11ということになります［図

1-7
（b）］．
スレーブ・デバイスは，スロットの始まりから規定時間後のバスの状態を読み込んで，この状態が Lレベルのときが0 ， H

レベルのときが1と判断します．データ・ビットの転送は最下位ビット（LSB）から始まり，最後が最上位ビット（MSB）になります．
● マスタのデータ受信（スレーブのデータ送信）
データの受信も，同様に1ビットが1スロットになります．やはり，スロットの始まりは

L

レベルの

立ち下がりエッジです．
受信の際は，まずマスタがスロットの始まりとして，バスを立ち下がりを検出してデータ・ビットがタ・ビットが

1

0

の場合は

L

L

レベルにします．スレーブは，このレベルの信号を一定時間出力します．デーの場合は何も出力しません．マスタは，規定時間後に

定時間後にバスの状態を読み込みます．この状態がLレベルのときがLレベルの出力をやめ，規0 ， H

レベルのときが1となります［図1-7（c）］．データ・ビットの転送順序は送信時と同じくLSBから始まります．
なお，スレーブ・デバイスがデータを送信するのは，あらかじめマスタがスレーブにデータを要求するコマンドを出しているときに限ります（勝手にスレーブ・デバイスがデータを送信してくることはない）．
● 検索アルゴリズム
この部分が1-Wireデバイスを扱う上で一番厄介なところですが，複数のデバイスをバスにぶら下げる
場合は避けることができないので，ここで簡単に説明しておきます．ただし，スレーブ・デバイスが一つだけの場合は検索は省略できます．
前述のように，1-Wireデバイスは同じタイプのデバイスでも同じROMコード（織別番号）のものは存在しません．そのため，同じ回路の装置を作っても装置ごとにスレーブ・デバイスのROMコードが異なる
ため，プログラムで固定のROMコードを使用するというわけにはいきません．セットごとにデバイスのROMコードを一つずつ調べて，個別にプログラムを変更すれば対応できないこともありませんが，手間がかかる上メインテナンス性も悪くなります．
そこで，マスタは1-Wireバスに接続されているデバイスのすべてのROMコードを調べるために検索コ
マンドを実行します．なお，バス上のデバイスが一つだけならROMコードを読み出してそれを直接使用することもできますが，この場合はROMコードを指定しないアクセス方法を使うことができます．
検索では，ツリー状にスレーブのROMコードのビットを調べていくバイナリ・ツリー検索という方法を使用します．図1-8は，検索を3ビットに簡略化して説明した検索のアルゴリズムを示すツリー図です．
図1-9は，その検索の手順を説明したフローチャートです．
スレーブは検索コマンドを受けると，ROMコードの最下位ビットから順番に1ビットずつ，ビット値とそのビットの補数（反転したもの）をマスタへ送信します．この2ビットのデータは複数のスレーブが同時に出力するので，信号はワイヤードANDされてマスタに入力されます．この2ビットを表1-1のような判定ルールに基づいてスレーブ（参加デバイス）を探ります．
表1-1の（4）は，検索開始時にはあったデバイスが検索途中でとりはずされたか，電源が切られたなど

1-3 1 線でつなぐ 1-Wire（Dallas One Wire）

27

1

一つ目のデバイスの検索

二つ目のデバイスの検索

1回目は

2回目は

不一致点でない場合は，入力した値と同じパスを通る

LastB = 0
ZeroB = 0

で始まる

b1（n =1）0を通るが，不一
致点ではないので 0
ZeroB=0のまま
b2（n =2）
1
0b3（n =3）
0

1

1

2

LastB = 3
ZeroB = 0

4

3回目は

で始まる

7

b3（n =3）b3（n =3）80b2（n =2）0b2（n =2)
1b3（n =3）b2（n =2）
1

0b3（n =3)

1

0b3（n =3）

1

1
不一致点で

不一致点で

不一致点で

n (=2) < LastB(=3)なのでn (=2) >LastB(=0)なので0 を通る.

n (=2) = LastB(=2)なので

1 を通る.

直前検出のデバイス1のb2と同じ 0 を通る.
ZeroB = 2

ZeroB = 23
b1（n =1）

ZeroB=0のまま

6b1（n =1）9b1（n =1）000b2（n =2）b2（n =2）
1

0b3（n =3）b2（n =2）
1

0b3（n =3）01b1（n =1）

0

0

で始まる

b1（n =1）0を通るが,不一致
0
点ではないので
ZeroB=0のまま
b2（n =2）1
0b1（n =1)0

不一致点でない場合は，入力した値と同じパスを通る

LastB = 2
ZeroB = 0b1（n =1）0を通るが，不一
致点ではないので 0
ZeroB=0のまま
b2（n =2）1
0

5b1（n =1）

1

は不一致点

ZeroB…… 不一致点で最後に 0 のパスを通ったときのビット番号

LastB…… 最終的なZeroBの値．次のデバイスの検索時に使用
される

0

1

b3（n =3）

1

デバイス1
不一致点で
n (=3) > LastB(=0)なので0 を通る.
ZeroB = 3
LastB = ZeroB (=3)

図1-8

三つ目のデバイスの検索不一致点でない場合は，入力した値と同じパスを通る

1

デバイス2
不一致点で
n (=3) = LastB(=3)なので
1 を通る.
LastB = ZeroB (=2)

デバイス3
不一致点でない場合は入力した値と同じパスを通る．
LastB = ZeroB (=0)
LastB = 0なので，すべてのデバイスの検索が完了したことになる不一致点でのパスの判定ルール
カレント・ 最後の不一致点のビット番号n ビット番号 LastB

通るパス

n = LastB

1 のパスを通る

n < LastB

直前に検出したデバイスのROMコードのbn と同じパスを通る

n > LastB

0 のパスを通る

1-Wireデバイスのツリー検索アルゴリズム

ROM コードを3 ビットに簡略化してバイナリ・ツリー検索を説明した図．番号順に進行する．この例では三つのデバイスがつながっているものとする．一つのデバイスを検索するたびにリセット・パルス出力→プレゼンス検出パルス検出→検索コマンド送出→ツリー検索のシーケンスを実行する．実際の検索ではCRC も含めた64 ビットすべてのROM コードに対してツリー検索を行う．

28

第 1 章 1，2，3 線シリアル・インターフェースの基本マスタ
検索用パラメータの初期化

1デバイスの検索
スレーブ（複数）

n = 1 ( n : 1〜64)

リセット・パルス検出

バス・リセット

プレゼンス検出パルス出力

プレゼンス・パルス検出

n = 1，待機解除

コマンド受付

サーチROMコマンド送信

スロット開始検出

bn のリード・スロットを開始

1ビット出力bn をリード

スロット開始検出bn (補数）のリード・スロットを開始
bn をリード

bn

判定

出力値

0

0

不一致

0/1

0

1

0のみ

0

1

0

1のみ

1

n ビット目ROMコードb64
変数b1

次のビット n = n + 1

no1ビット出力不一致時は検索アルゴリ
ズムにより，0または1のどちらかが出力される

bn

64ビット
完了？
yes

一つ分のデバイスのROM番号が確定した
CRC再計算 正否判定
まだ未認識の参加デバイスが残っている
場合，このシーケンスを繰り返すyes
残りあり？

ROMコードのbn のビッ
ト・データを送信

1ビット出力ROMコードのbn の補数のビット・データを送信

データ入力．
bitB←入力ビット・データ

この出力値はビットbn の検索ツリーのパス番号を示している

bitB = bn ?

noROMコード変数の n ビット目に出力値を設定
マスタが出力したビット値と同じ値をもつスレー
ブだけが参加を継続する

yes

次のビット
n=n +1（参加継続）

次回リセットされるまで待機（参加を外れる）bn はこのデバイスのROMコードの下位からn 番目のビットを表す
すべてのスレーブの出力は，ワイヤード
ANDでマスタに入力される

検索終了

図1-9

ツリー検索のフローチャート

1-Wire バス上でマスタがバイナリ・ツリー検索を実行してスレーブ・デバイスを見つけるシーケンスを説明した図．
ビット番号 n は1から始まることに注意．

1-3 1 線でつなぐ 1-Wire（Dallas One Wire）

29

表1-1

分岐点での判定

バイナリ・ツリー検索で分岐点での判定条件の対応表．スレーブの応答により分岐するかどうかを判定する．
スレーブの応答判

定

マスタの出力bn

bn の補数（1）00(a) 参加デバイスには bn が 0 のものと 1 のものがある
（不一致）

0/1

（2）

0

1

(b) 参加デバイスには bn が 0 のものしかない

0

（3）

1

0

(c) 参加デバイスには bn が 1 のものしかない

1

（4）

1

1

(d) デバイスなし（検索の途中で取り外されたなど）

×の異常な状態です．
（2）と（3）は，どちらか一方に特定できるケースです．マスタの出力値がそのデバイスのROMコードのビット値ということになります．
（1）はROMコードの現在のビット位置で，ビット値が

0

のものと

1

のものの両方のデバイスがバ

ス上につながっている状態です．これを「不一致」と呼びます．本書では「不一致点」と言う場合は不一致が起こっているビットのことを指します．
この不一致点では，ツリーは

0

のパスと

1

のパスの両方に分岐します．

パスの分岐に関しては，図1-9のフローチャートと図1-8のアルゴリズムを参照してください．図では最後に通過した不一致点を LastB ，不一致点で最後に0のパスを通過したビット位置を ZeroBという変数を使います．不一致点での分岐の判定は，図1-8の表のようになります．なお，新たなデバイ
スの検索を始めるごとに，マスタはバスをリセットします． LastB

は，次回の検索に繰り越して使用します（前回どこで最後に分岐したかを憶えている）．また，これらの図では，処理の都合でビット番号
は

0

〜

63

ではなく

1

〜

64

となっているので注意してください（最下位ビットを

1

とし

ている）．
パスを通るときに，マスタはそのビット値をすべてのスレーブに通知します．各スレーブは，自分のROMコードの同じビット位置に同じビット値があれば，検索への参加を継続しますが，その値と異なっている場合は検索対象から外れます．この場合は，次回リセット・パルスが入力されるまで待機状態になります．
このようなツリー検索を64ビットすべてのビットに対して繰り返すと，一つのデバイスが割り出せます．通ったパスを記憶しておけば，その値が検索したデバイスのROMコードになります．64ビットの値が確定したら，CRC値を計算してそのROMコードが有効かどうかを検証します．
64ビット分の検索が終わると，いったんバス・リセットをかけて，再びほかのデバイスの検索を開始
します．すべてのデバイスを検索し終わるまで，この処理を繰り返します．
● CRC（巡回冗長検査）
計算
CRCとは，送受信したデータやROMコードの内容が正しいかどうかを検証するための検査方法です．
ビットをシフトして，入力データや特定のビットとXOR（排他的論理和）をとりながらビットを循環させて，結果を出力します．ソフトウェアで実現しやすいように描いたCRCジェネレータの原理図を図1-10に示します．
1-Wireデバイスで使用されるCRCは，8ビットです．このCRC値はスレーブ・デバイスのROMコードの上位8ビット，またはスクラッチ・パッド（温度センサDS18S20の場合）の最終バイトなどに保存されて

30

第 1 章 1，2，3 線シリアル・インターフェースの基本