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

1-Wireマスター(DS1WM)をARM7プロセッサにインタフェースさせるには


要約: このアプリケーションノートでは、マキシム1-Wire®マスター(DS1WM)をARM7プロセッサへインタフェースさせる方法についての情報を提供します。ブロック図と、マキシムの1-Wire通信プロトコル上での1-Wireマスター‐ARM7間の通信をイネーブルするサンプルANSI Cコードを含む、ハードウェアとソフトウェアの両方の事項が取り扱われています。ARM7の初期化のためのソフトウェアルーチンと共通1-Wireコマンドが提供されるため、1-Wireプロトコルを使用して通信するマキシムのデバイスのいずれにも使用できます。

はじめに

1-Wireマスター(DS1WM)は8ビットのシステムバスに容易にインタフェースし、すべての1-Wireに関連するタイミングを生成するように設計されており、これによってシステムプロセッサが解放され、他のタスクを実行することができます。下の例は、DS1WMをARM7プロセッサへインタフェースする方法と、標準的なCルーチンでの1-Wireバス上でのデバイスとの通信方法を示しています。

ARM7バスへインタフェースするには

1-Wireマスターでは、ARM7のデータバスにマップするのに外付け部品は不要です。図1にすべての必要な接続が示されています。図例では、ARM7のプログラム可能なチップ選択ライン(NCS2)の1本を使用してDS1WM向けにイネーブルパルスを生成していますが、ARMで生成された負のロジックチップ選択であればいずれも使用可能です。DS1WMのマスターリセット(MR)およびクロック(CLK)は、システムリセットとクロックに直接接続してください。アドレスストロボ(ADS)は、ARM7へのインタフェースには使用されず、グランドに接続する必要があります。

図1. ARM7とDS1WMのバス接続
図1. ARM7とDS1WMのバス接続

1-Wire通信の生成

下のコード例は標準的なANSI Cで記述されており、標準的なARM7コンパイラであればいずれでもコンパイル可能です。ARMがDS1WMレジスタの読み出しおよび書き込みをする前に、ARMチップ選択ライン(この例ではNCS2)の設定を行う必要があります。これに続くコードはNCS2をイネーブルし、DS1WM用の基本アドレスを0x20000000に設定します。このコードはまた、待ち状態の最高数をイネーブルします。必要となる待ち状態の実際の数はシステムクロック周波数とDS1WMの論理合成によります。初期化に関する詳細な説明は、ARM7のデータシートの外部バスインタフェース(EBI)の項目を参照してください。

long* ChipSelectRegister = (long*)0xFFE00008; /* Address of Chip Select 2 Register */

*ChipSelectRegister = 0x2000203E; /* Base Address of 0x20000000 BA = 0x200 */
				/* Chip Select 2 Enabled CSEN = 1 */
				/* Write Byte Access Enabled BAT = 0 */
				/* Data Float Time Zero TDF = 0 */
				/* Page Size of 1 Meg PAGES = 0 */
				/* Wait State Enabled WSE = 0 */
				/* 8 Standard Wait States NWS = 0x7 */
				/* 8 bit Data Bus Width DBW = 0x2 */
チップが初期化されると、DS1WMへの通信が開始されます。下のANSI Cコードは、DS1W Mのレジスタへのポインタの設定と、バスクロックの初期化、および読み出し、書き込み、およびリセットの3つの主要なバス動作を行う方法を示しています。このコードは、前と同様、DS1WMの基本アドレスは0x20000000hで、システムクロックは32MHzであるとみなします。クロック分周器レジスタはDS1WMへの通信が確立し次第、および1-Wireバス上の通信が始まる前に設定する必要があります。設定されると、WriteByte、ReadByte、およびReset機能は必要な時にいつでも呼び出すことができます。この例でのWrite、Read、およびReset機能は、コマンド完了を待つInterruptレジスタのポーリングを行います。特に時間が重要となるアプリケーションでのユーザ機能は、他のタスクを実行するのにこの時間を利用することができます。

/* Initialize pointers to DS1WM addresses. Base address of DS1WM is 0x20000000 */
unsigned char* Command1WM = (unsigned char*)0x20000000; /* Address of Command Register */
unsigned char* Data1WM = (unsigned char*)0x20000001; /* Address of Data Register */
unsigned char* Int1WM = (unsigned char*)0x20000002; /* Address of Interrupt Register */
unsigned char* Clock1WM = (unsigned char*)0x20000004; /* Address DS1WM Clock Divider */

/* The clock divider must be programmed before 1-Wire communication can take place */
/* Refer to the DS1WM datasheet page 4 for the proper programming value for you system clock */
*Clock1WM = (unsigned char)0x12; /* Setup for 32MHz Clock */

/* Reset will generate a reset on the 1-Wire bus. If no presence detect was seen, it will return a 1, */
/* otherwise it returns 0. */
int Reset(void)
{
	unsigned char result;
	int loop;
	int DELAY = 30000; /* Time to Poll for Completion */
					/* Choose a length to Poll that is slightly greater than */
					/* the maximum possible time to complete the operation */
	*Command1WM=0x01; /* Send 1WR Reset */
	for( loop=0; loop < DELAY; loop++ ) /* Poll INT Register for command completion */
	{
		result=*Int1WM;
		if(result&0x01) break;
	}
	if((result&0x02) != 0x00) return 1; /* No Presence Detect Found, Return Error */
	return 0;
}

/* Send a byte on the 1-Wire Bus. Poll for completion afterwards */
/* Return 1 if operation timed out, 0 if successful */
int WriteByte(char Data)
{
	unsigned char result;
	int loop;
	int DELAY = 30000; /* Time to Poll for Completion */
				/* Choose a length to Poll that is slightly greater than */
				/* the maximum possible time to complete the operation */

	*Data1WM = Data; /* Transmit Data Byte on the Bus */
	for( loop=0; loop < DELAY; loop++ ) /* Poll INT Register for command completion */
	{
		result=*Int1WM;
		if(result&0x0C) == 0x0C ) break; /* Poll TBE & TEMT until both are empty */
	}
	if(loop == DELAY) return 1; /* Operation Timed Out */
	return 0;
}

/* Read a byte from the 1-Wire Bus. Write a 0xFF to create read time slots and poll for receive */
/* buffer full before moving the result to the location pointed to by *Data. Returns a 1 if either */
/* the write 0xFF or read times out, 0 otherwise. */
int ReadByte(char *Data)
{
	unsigned char result;
	int loop;
	int DELAY = 30000; /* Time to Poll for Completion */
				/* Choose a length to Poll that is slightly greater than */
				/* the maximum possible time to complete the operation */

	if(WriteByte((char)0xFF)) return 1; /* Generate 1-Wire read timeslots */
	for( loop=0; loop < DELAY; loop++ ) /* Poll INT Register for command completion */
	{
		result=*Int1WM;
		if( result&0x10) == 0x10 ) break; /* Poll RBF until set */
	}
	if(loop == DELAY) return 1; /* Operation Timed Out */
	*Data = *Data1WM; /* Retrieve data that was returned */
	return 0;
}

まとめ

マキシムの1-Wireマスターは、ARM7プロセッサに容易にインタフェース可能で、外付け部品は不要です。標準的なANSI C機能を使用して、すべての必要な1-Wire通信を生成することが可能で、同時にプロセッサが解放され他のタスクを実行できます。DS1WMのデータシートをご覧ください。


次のステップ
EE-Mail EE-Mail配信の登録申し込みをして、興味のある分野の最新ドキュメントに関する自動通知を受け取る。
© , Maxim Integrated Products, Inc.
このウェブサイトのコンテンツは米国および各国の著作権法によって保護されています。コンテンツの複製を希望される場合は お問い合わせください。.
APP 145:
アプリケーションノート 145,AN145, AN 145, APP145, Appnote145, Appnote 145