ENGLISH 简体中文 日本語 한국어  


アプリケーションノート126

ソフトウェアを介した1-Wire通信

要約:マイクロプロセッサは、本来のバスマスタ(DS2480B、DS2490など)が存在しない場合でも、容易に1-Wire®のタイミング信号を生成することができます。このアプリケーションノートでは、「C」で記述した基本的な標準速度の1-Wireマスタの通信ルーチンの例を紹介します。1-Wireバスの4つの基本オペレーションは、「リセット」、「ビット1の書き込み」、「ビット0の書き込み」、および「ビットの読み取り」です。バイト単位の機能は、ビットオペレーションを複数回呼び出すことによって得ることができます。時間値を設けることによって、さまざまな回線状態においてすべての1-Wireデバイスとの通信が可能な、最も堅牢な1-Wireマスタを作ることができます。

はじめに

マイクロプロセッサは、専用のバスマスタが存在しない場合でも、容易に1-Wireのタイミング信号を生成することができます。このアプリケーションノートでは、「C」で記述した基本的な標準速度の1-Wireマスタの通信ルーチンの例を紹介します。オーバドライブの通信速度についても、このアプリケーションノートで説明します。以下に、サンプルコードを正しく動作させるために必要なシステム要件をいくつか示します。
  1. 通信ポートは双方向で、出力はオープンドレイン、かつライン上に弱プルアップがなければなりません。これは、すべての1-Wireバスの要件になります。1-Wireマスタのマイクロプロセッサ回路の簡単な例については、「アプリケーションノート148:高信頼性1-Wireネットワークのガイドライン」の付録Aを参照してください。
  2. システムは、高精度で再現性のある1μsの遅延(標準速度の場合)、および0.25μsの遅延(オーバドライブ速度の場合)を生成できる必要があります。
  3. 生成中に通信動作を中断してはなりません。
1-Wireバスの4つの基本オペレーションは、「リセット」、「ビット1の書き込み」、「ビット0の書き込み」、および「ビットの読み取り」です。1ビットの通信を行うのに必要な時間は、デバイスデータシートではタイムスロットと呼ばれています。バイト単位の機能は、ビットオペレーションを複数回呼び出すことによって得ることができます。各オペレーションの簡単な説明とその生成に必要な手順の一覧については、下記の表1を参照してください。図1では、波形を図で表しています。表2は、一般的な回線状態において1-Wireマスタが1-Wireデバイスと通信する場合の、最小、最大、および推奨のタイミングを示しています。デバイスと回線状態の特定のセットに限定して1-Wireマスタを使用するのであれば、これに代わる最小値と最大値を使用することができます。

表1. 1-Wireのオペレーション
Operation Description Implementation
Write 1 bit Send a '1' bit to the 1-Wire slaves (Write 1 time slot) Drive bus low, delay A
Release bus, delay B
Write 0 bit send a '0' bit to the 1-Wire slaves (Write 0 time slot) Drive bus low, delay C
Release bus, delay D
Read bit Read a bit from the 1-Wire slaves (Read time slot) Drive bus low, delay A
Release bus, delay E
Sample bus to read bit from slave
Delay F
Reset Reset the 1-Wire bus slave devices and ready them for a command Delay G
Drive bus low, delay H
Release bus, delay I
Sample bus, 0 = device(s) present, 1 = no device present
Delay J


図1. 1-Wireの波形
図1. 1-Wireの波形

表2. 1-Wireのマスタのタイミング
Parameter Speed Min (µs) Recommended (µs) Max (µs) Notes
A Standard 5 6 15 1, 2
Overdrive 1 1.5 1.85 1, 3
B Standard 59 64 N/A 2, 4
Overdrive 7.5 7.5 N/A 3, 4
C Standard 60 60 120 2, 5
Overdrive 7 7.5 14 3, 5
D Standard 8 10 N/A 2, 6
Overdrive 2.5 2.5 N/A 3, 6
E Standard 5 9 12 2, 7, 8
Overdrive 0.5 0.75 0.85 3, 7, 8
F Standard 50 55 N/A 2, 9
Overdrive 6.75 7 N/A 3, 9
G Standard 0 0 0
Overdrive 2.5 2.5 N/A 3, 14
H Standard 480 480 640 2, 10, 15
Overdrive 68 70 80 3, 10
I Standard 63 70 78 2, 11
Overdrive 7.2 8.5 8.8 3, 11
J Standard 410 410 N/A 2, 12, 13
Overdrive 39.5 40 N/A 3, 12

これらの値を計算するためのワークシートは、http://files.dalsemi.com/auto_id/public/an126.zipでダウンロードすることができます。

注:
  1. デバイスデータシートでは、tW1L (「書き込み1」ロー)マイナスε (VTHまでの立上り時間)プラスtF (VTLまでの立下り時間)として表されています。
  2. 立上り時間と立下り時間が3μs未満の、標準速度のミッドレンジのネットワークを想定しています。
  3. 立上り時間と立下り時間が0.5μs未満の、オーバドライブ速度の小規模ネットワークを想定しています。
  4. デバイスデータシートでは、tSLOT (タイムスロット長)マイナス「A」の値として表されています。
  5. デバイスデータシートでは、tW0L (「書き込み0」ロー)マイナスδ (VIHMASTERまでの立上り時間)プラスtF (VTLまでの立下り時間)として表されています。
  6. デバイスデータシートでは、tREC (回復時間)プラスδ VIHMASTERまでの立上り時間)として表されています。
  7. デバイスデータシートでは、tMSR (マスタのサンプル読み取り)プラスtF (VTLまでの立下り時間)マイナス「A」の値として表されています。
  8. 範囲内で可能な限り遅くサンプリングを行うことで、立上り回復時間ができるだけ長くなるようにします。
  9. デバイスデータシートでは、tSLOT (タイムスロット長)マイナス「A」の値マイナス「E」の値として表されています。
  10. デバイスデータシート内のtRSTL (リセットロータイム)マイナスε(VTHまでの立上り時間)プラスtF (VTLまでの立下り時間)として表されています。
  11. デバイスデータシートでは、tMSP (マスタサンプルあり)プラスε (VTHまでの立上り時間)として表されています。
  12. デバイスデータシートでは、tRSTL (リセットロータイム)マイナス(「I」の値)、として表される最小値。
  13. ここで説明する1-Wireリセットオペレーションは、DS2404とDS1994のデバイスで生成可能な拡張(アラーム)プレゼンスパルスシーケンスを考慮にいれていません。この特殊なケースについては、デバイスデータシートを参照してください。1-Wireリセットシーケンスの終了をサンプリングすれば、1-Wireバスがプルアップレベルまで戻っていることを確認することができます。そのレベルがまだ0の場合、1-Wireバスが接地短絡されているか、アラーム中のDS2404/DS1994が存在している可能性があります。
  14. tREC (回復時間)マイナス「D」の値として表されています。オーバドライブにあるデバイスの中には、デバイスの寄生電源が完全に充電されるようにするために、tRSTL (リセットロータイム)の前に余分な遅延を必要とするものもあります。
  15. 低電圧オペレーションでは、より長い値を必要とするデバイスもあります。適切な値については、デバイスデータシートを参照してください。

サンプルコード

以下のサンプルコードでは、一般的な2つの「C」関数outpとinpを利用して、IOポート位置にデータバイトの書き込みと読み出しを行っています。これらの関数は通常、標準ライブラリにあります。これらの関数の代わりに、プラットフォームの該当する関数を使用してもかまいません。
// send 'databyte' to 'port'
int outp(unsigned port, int databyte);

// read byte from 'port'
int inp(unsigned port);
コード内の定数PORTADDRESS(図3を参照)は、通信ポートの位置として定義されています。このコードでは、この位置のビット0が1-Wireバスを制御するものと想定しています。このビットを0に設定すると、1-Wireラインがローになります。このビットを1に設定すると1-Wireが開放され、抵抗プルアップによってプルアップされるか、あるいは1-Wireスレーブデバイスによってプルダウンされます。

コード内の関数tickDelayはユーザ生成ルーチンであり、不定秒数(1/4マイクロ秒単位)の間だけ待機するものです。この関数は、動作する固有のハードウェアプラットフォームごとに異なるため、ここでは実装していません。以下は、関数SetSpeedとともにtickDelayの関数宣言を示しています。これは、推奨される標準速度とオーバドライブ速度の刻み値を設定するものです。

例1. 1-Wireのタイミング生成

// Pause for exactly 'tick' number of ticks = 0.25us
void tickDelay(int tick); // Implementation is platform specific

// 'tick' values
int A,B,C,D,E,F,G,H,I,J;

//-----------------------------------------------------------------------------
// Set the 1-Wire timing to 'standard' (standard=1) or 'overdrive' (standard=0).
//
void SetSpeed(int standard)
{
	// Adjust tick values depending on speed
	if (standard)
	{
		// Standard Speed
		A = 6 * 4;
		B = 64 * 4;
		C = 60 * 4;
		D = 10 * 4;
		E = 9 * 4;
		F = 55 * 4;
		G = 0;
		H = 480 * 4;
		I = 70 * 4;
		J = 410 * 4;
	}
	else
	{
		// Overdrive Speed
		A = 1.5 * 4;
		B = 7.5 * 4;
		C = 7.5 * 4;
		D = 2.5 * 4;
		E = 0.75 * 4;
		F = 7 * 4;
		G = 2.5 * 4;
		H = 70 * 4;
		I = 8.5 * 4;
		J = 40 * 4;
	}
}
下記の例2は、1-Wireの基本オペレーションのサンプルコードを示しています。

例2. 1-Wireの基本関数

//-----------------------------------------------------------------------------
// Generate a 1-Wire reset, return 1 if no presence detect was found,
// return 0 otherwise.
// (NOTE: Does not handle alarm presence from DS2404/DS1994)
//
int OWTouchReset(void)
{
	int result;
	
	tickDelay(G);
	outp(PORTADDRESS,0x00); // Drives DQ low
	tickDelay(H);
	outp(PORTADDRESS,0x01); // Releases the bus
	tickDelay(I);
	result = inp(PORTADDRESS) & 0x01; // Sample for presence pulse from slave
	tickDelay(J); // Complete the reset sequence recovery
	return result; // Return sample presence pulse result
}

//-----------------------------------------------------------------------------
// Send a 1-Wire write bit. Provide 10us recovery time.
//
void OWWriteBit(int bit)
{
	if (bit)
	{
		// Write '1' bit
		outp(PORTADDRESS,0x00); // Drives DQ low
		tickDelay(A);
		outp(PORTADDRESS,0x01); // Releases the bus
		tickDelay(B); // Complete the time slot and 10us recovery
	}
	else
	{
		// Write '0' bit
		outp(PORTADDRESS,0x00); // Drives DQ low
		tickDelay(C);
		outp(PORTADDRESS,0x01); // Releases the bus
		tickDelay(D);
	}
}

//-----------------------------------------------------------------------------
// Read a bit from the 1-Wire bus and return it. Provide 10us recovery time.
//
int OWReadBit(void)
{
	int result;
	
	outp(PORTADDRESS,0x00); // Drives DQ low
	tickDelay(A);
	outp(PORTADDRESS,0x01); // Releases the bus
	tickDelay(E);
	result = inp(PORTADDRESS) & 0x01; // Sample the bit value from the slave
	tickDelay(F); // Complete the time slot and 10us recovery
	
	return result;
}
上記はすべて、1-Wireバスをビット単位で操作する場合のものです。例3に示すように、上記のルーチンをベースとしてバイト単位のマニピュレータ関数を作成することができます。

例3. 導出された1-Wireの関数

//-----------------------------------------------------------------------------
// Write 1-Wire data byte
//
void OWWriteByte(int data)
{
	int loop;
	
	// Loop to write each bit in the byte, LS-bit first
	for (loop = 0; loop < 8; loop++)
	{
		OWWriteBit(data & 0x01);
		
		// shift the data byte for the next bit
		data >>= 1;
	}
}

//-----------------------------------------------------------------------------
// Read 1-Wire data byte and return it
//
int OWReadByte(void)
{
	int loop, result=0;
	
	for (loop = 0; loop < 8; loop++)
	{
		// shift the result to get it ready for the next bit
		result >>= 1;
		
		// if result is one, then set MS bit
		if (OWReadBit())
			result |= 0x80;
	}
	return result;
}

//-----------------------------------------------------------------------------
// Write a 1-Wire data byte and return the sampled result.
//
int OWTouchByte(int data)
{
	int loop, result=0;
	
	for (loop = 0; loop < 8; loop++)
	{
		// shift the result to get it ready for the next bit
		result >>= 1;
		
		// If sending a '1' then read a bit else write a '0'
		if (data & 0x01)
		{
			if (OWReadBit())
				result |= 0x80;
		}
		else
			OWWriteBit(0);
			
		// shift the data byte for the next bit
		data >>= 1;
	}
	return result;
}

//-----------------------------------------------------------------------------
// Write a block 1-Wire data bytes and return the sampled result in the same
// buffer.
//
void OWBlock(unsigned char *data, int data_len)
{
	int loop;
	
	for (loop = 0; loop < data_len; loop++)
	{
		data[loop] = OWTouchByte(data[loop]);
	}
}

//-----------------------------------------------------------------------------
// Set all devices on 1-Wire to overdrive speed. Return '1' if at least one
// overdrive capable device is detected.
//
int OWOverdriveSkip(unsigned char *data, int data_len)
{
	// set the speed to 'standard'
	SetSpeed(1);

	// reset all devices
	if (OWTouchReset()) // Reset the 1-Wire bus
		return 0; // Return if no devices found

	// overdrive skip command
	OWWriteByte(0x3C);
	
	// set the speed to 'overdrive'
	SetSpeed(0);
	
	// do a 1-Wire reset in 'overdrive' and return presence result
	return OWTouchReset();
}
owTouchByteオペレーションは、1-Wireバスから同時に書き込みと読み取りを行います。この関数は、書き込みと読み取りの両方のブロックが構築されるように作成されています。これは特定のプラットフォームでより効果的で、ダラスセミコンダクタ製のAPIで広く使用されています。OWBlock関数は、OWTouchByte関数を使用して、単に1-Wireにデータのブロックを送受信するだけです。OWTouchByte(0xFF)OWReadByte()と同じ働きをし、OWTouchByte(data)OWWriteByte(data)と同じ働きをすることに留意してください。

これらの関数およびtickDelayだけで、ビット、バイト、およびブロックレベルでの1-Wireバスの基本制御が可能です。下記の例4に示す例は、これらの関数をともに使用してDS2432のSHA-1認証されたページを読み取る方法を示しています。

例4. DS2432での読み取り例

//-----------------------------------------------------------------------------
// Read and return the page data and SHA-1 message authentication code (MAC)
// from a DS2432.
//
int ReadPageMAC(int page, unsigned char *page_data, unsigned char *mac)
{
	int i;
	unsigned short data_crc16, mac_crc16;
	
	// set the speed to 'standard'
	SetSpeed(1);
	
	// select the device
	if (OWTouchReset()) // Reset the 1-Wire bus
		return 0; // Return if no devices found
	
	OWWriteByte(0xCC); // Send Skip ROM command to select single device
	
	// read the page
	OWWriteByte(0xA5); // Read Authentication command
	OWWriteByte((page << 5) & 0xFF); // TA1
	OWWriteByte(0); // TA2 (always zero for DS2432)
	
	// read the page data
	for (i = 0; i < 32; i++)
		page_data[i] = OWReadByte();
	OWWriteByte(0xFF);
	
	// read the CRC16 of command, address, and data
	data_crc16 = OWReadByte();
	data_crc16 |= (OWReadByte() << 8);
	
	// delay 2ms for the device MAC computation
	// read the MAC
	for (i = 0; i < 20; i++)
		mac[i] = OWReadByte();

	// read CRC16 of the MAC
	mac_crc16 = OWReadByte();
	mac_crc16 |= (OWReadByte() << 8);

	// check CRC16...
	return 1;
}

その他のソフトウェア

このアプリケーションノートで紹介した1-Wireの基本関数は、高度な1-Wireアプリケーションを構築するための基盤として使用することができます。このアプリケーションノートで紹介していない重要なオペレーションの1つに1-Wireの検索があります。検索とは、バスに接続されている複数の1-Wireスレーブから一意のIDを検出する方法です。「アプリケーションノート187:1-Wire検索アルゴリズム」は、この方法を詳細に説明し、これらの1-Wire基本関数で使用できる「C」コードを示しています。

1-Wire Public Domain Kit (パブリックドメインキット)には、ここで紹介した内容に基づいて構築されたデバイス特有のコードが多数含まれています。

その他のリソースの詳細については、「アプリケーションノート155:1-Wireソフトウェアリソースガイドデバイス解説」を参照してください。

代替案

特定の用途においてソフトウェアによる解決策が対応できない場合、1-Wireマスタチップまたは論理合成された1-Wireマスタブロックを代替として使用することができます。

ダラスセミコンダクタは、VerilogおよびVHDLで定義済みの1-Wireマスタを提供しています。
DS1WM

1-Wireマスタのコード定義は、このリンクからダウンロードすることができます。

論理合成可能な1-Wireマスタのオペレーションについては、「アプリケーションノート120:1-Wireマスタを介した通信」および「アプリケーションノート119:1-Wireマスタの組込み」にて説明しています。

マイクロプロセッサの周辺機器として使用可能な1-Wireマスタチップがいくつかあります。DS2480Bシリアル1-Wireラインドライバを使用すると、標準シリアルポートに容易に接続することができます。

DS2480Bのオペレーションについては、「アプリケーションノート192:DS2480Bシリアル1-Wireラインドライバの使用」にて説明しています。

長距離用に特別設計されたより高度な1-Wireラインドライバは、「アプリケーションノート244:高度な1-Wireネットワークドライバ」にて説明しています。

改訂履歴

2000年7月06日:バージョン1.0 - 初版
2002年5月28日:バージョン2.0 ‐ 1-Wireリセットサンプル時間を修正。波形図、リンク、およびサンプルコードを追加。
2004年2月2日:バージョン2.1 ‐ オーバドライブのサポートを追加。タイミングに最小/最大値を設ける。および例を更新。
2005年9月6日:バージョン2.2 ‐ サンプルコード説明文のPIO極性を修正。

1-WireはDallas Semiconductorの登録商標です。

1-WireはMaxim Integrated Products, Inc.の登録商標です。


フィードバックをお寄せください。
内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。—マキシムはお客様からいただく訂正、提案を元に改善していきます。 このページを評価し、フィードバックを送信する。


自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。



その他の情報  APP 126: Sep 28, 2004
DS18B20 プログラマブル分解能1-Wireディジタルサーモメータ フルデータシート
(PDF, 188kB)
無料
サンプル
DS18S20 1-Wire寄生電力ディジタルサーモメータ フルデータシート
(PDF, 188kB)
無料
サンプル
DS1904 RTC iButton フルデータシート
(PDF, 216kB)
無料
サンプル
DS1920 温度用iButton® フルデータシート
(PDF, 560kB)
DS1921G Thermochron iButton フルデータシート
(PDF, 632kB)
DS1922L 8KBデータログメモリ付き、温度ロガーiButton フルデータシート
(PDF, 676kB)
DS1922T 8KBデータログメモリ付き、温度ロガーiButton フルデータシート
(PDF, 676kB)
DS1923 8KBデータログメモリ付き、Hygrochron温度/湿度ロガーiButton フルデータシート
(PDF, 448kB)
DS1963S SHA iButton
DS1971 256ビットEEPROM iButton® フルデータシート
(PDF, 296kB)
無料
サンプル
DS1973 4Kb EEPROM iButton® フルデータシート
(PDF, 268kB)
無料
サンプル
DS1982 1KbアドオンリーiButton® フルデータシート
(PDF, 708kB)
無料
サンプル
DS1985 16KbアドオンリーiButton® フルデータシート
(PDF, 708kB)
無料
サンプル
DS1986 64KbアドオンリーiButton® フルデータシート
(PDF, 688kB)
DS1990A シリアルナンバーiButton フルデータシート
(PDF, 200kB)
無料
サンプル
DS1992 1Kb/4KbメモリiButton® フルデータシート
(PDF, 348kB)
無料
サンプル
DS1993 1Kb/4KbメモリiButton® フルデータシート
(PDF, 348kB)
無料
サンプル
DS1995 16KビットメモリiButton® フルデータシート
(PDF, 68kB)
DS1996 64kビットメモリiButton® フルデータシート
(PDF, 352kB)
DS2401 シリコンシリアルナンバー フルデータシート
(PDF, 288kB)
無料
サンプル
DS2405 アドレス指定可能なスイッチ フルデータシート
(PDF, 436kB)
無料
サンプル
DS2406 1Kbメモリ付き、デュアル、アドレス指定可能なスイッチ フルデータシート
(PDF, 264kB)
無料
サンプル
DS2408 1-Wire、8チャネル、アドレス指定可能なスイッチ フルデータシート
(PDF, 420kB)
無料
サンプル
DS2411 VCC入力付き、シリコンシリアルナンバ フルデータシート
(PDF, 192kB)
無料
サンプル
DS2413 1-Wire、デュアルチャネル、アドレス指定可能なスイッチ フルデータシート
(PDF, 184kB)
無料
サンプル
DS2415 1-Wireタイムチップ フルデータシート
(PDF, 256kB)
DS2417 割込み付き、1-Wireタイムチップ フルデータシート
(PDF, 164kB)
無料
サンプル
DS2422 8KBデータログメモリ付き、1-Wire®温度/データロガー フルデータシート
(PDF, 500kB)
DS2431 1024ビット、1-Wire EEPROM フルデータシート
(PDF, 272kB)
無料
サンプル
DS2432 SHA-1エンジン内蔵、1kビット保護1-Wire EEPROM 要約版データシート
(PDF, 408kB, English only)
DS2433 4kb、1-Wire EEPROM フルデータシート
(PDF, 700kB)
無料
サンプル
DS2438 スマートバッテリモニタ フルデータシート
(PDF, 376kB)
無料
サンプル
DS2450 1-WireクワッドA/Dコンバータ フルデータシート
(PDF, 360kB)
無料
サンプル
DS2480B シリアルから1-Wireへのラインドライバ フルデータシート
(PDF, 344kB)
無料
サンプル
DS2502 1Kbアドオンリーメモリ フルデータシート
(PDF, 648kB)
無料
サンプル
DS2502-E48 48ビットノードアドレスチップ フルデータシート
(PDF, 48kB)
無料
サンプル
DS2505 16Kbアドオンリーメモリ フルデータシート
(PDF, 320kB)
無料
サンプル
DS2506 64Kbアドオンリーメモリ フルデータシート
(PDF, 900kB)
無料
サンプル
DS2751 あらゆるバッテリに対応したバッテリ残量ゲージ
DS2760 高精度Li+ (リチウムイオン)バッテリモニタ フルデータシート
(PDF, 296kB)
DS2761 高精度Li+ (リチウムイオン)バッテリモニタ フルデータシート
(PDF, 316kB)
DS2762 警報付き、高精度Li+ (リチウムイオン))バッテリモニタ フルデータシート
(PDF, 268kB)
無料
サンプル
DS28E04-100 PIO付き、4096ビットアドレス指定可能1-Wire EEPROM フルデータシート
(PDF, 312kB)
無料
サンプル
 

ダウンロード、PDFフォーマットダウンロード、PDFフォーマット (67kB)
 AN126, AN 126, APP126, Appnote126, Appnote 126



         


      プライバシーポリシー    法的お知らせ

      Copyright © 2008 by Maxim Integrated Products, Dallas Semiconductor