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

APIを使ったDS1WM 1-Wire®バスマスタの制御

Sep 28, 2004

要約:このアプリケーションノートでは、マキシムのAPIを使ったDS1WM 1-Wire Bus Masterの制御を行うCコード例を示します。このアーティクルでは、DS1WMはFPGAまたはASICに設計されており、ホストCPUがAPI呼出しを通してDS1WMを制御すると仮定しています。DS1WMはAPIを形づくる2ファイル(DS1WM.cおよびDS1WM.h)で通信します。トピックには初期化、1-Wireリセット、およびSearch ROMアルゴリズム例があります。例では共通1-Wire機能の使用方法を示します。読者は1-Wireデバイス、DS1WM 1-Wire Master、および1-Wireプロトコルに精通している必要があります。

はじめに

DS1WM 1-Wireバスマスタは1-Wireタイミングと制御信号を内部生成することでCPUビットバンギングをなくします。この制御機能によってシステムプログラマーは提供のAPI機能を使ってプログラム開発に集中できます。DS1WM APIはANSI Cで書かれており、これによってANSI Cに対応する多くのマイクロプロセッサプラットフォームに移植可能となります。次例はネットワーク上で1-Wireスレーブデバイスで識別、選択、および通信する方法について示しています。

図1. 1-Wireネットワークバスの回路例
図1. 1-Wireネットワークバスの回路例

図1の回路構成が以下の全例で使われています。ホストCPUはDS1WMを使ってチェーンモードおよびGPIO付き1-Wireディジタル温度センサDS28EA00、および1-Wire 1Kb EEPROM DS2431と通信します。例はAPIのショーケースでありスレーブデバイスの機能性ではありません。16MHzのシステムクロックは1-WireマスタのタイミングをCLKピンを通して駆動します。1-Wireマスタのポートピンは適用可能なマイクロプロセッサピンにマッピングする必要があります。このピンマップはAPIファイルDS1WM.hで見つかります。APIヘッダファイルにあるMaxNumberDevicesマクロは潜在的に発見可能な最大デバイス数に変更する必要があります。DS1WM.c API ファイルにあるReadByteFromRegisterおよびWriteByte2Register機能は、マイクロプロセッサポートピンを適切にトグルするために変更する必要もあります。VPUP電圧は、2.2kΩ以下のRPUPで5.0V (typ)です。

概要

DS1WMおよびAPIはマキシムのサポート(English only)にて請求された場合、無償で提供されます。DS1WMコードの初期化および1-Wireリセット制御が以下で説明されています。例では、DS1WMのSearch ROM Acceleratorを使って各デバイスのユニークな登録番号(ROM ID)を取り出す方法が示されています。保存された登録番号を使って、各1-WireスレーブデバイスがそのFamily Codeで識別、Match ROM機能を使ってアクセス可能です。ファミリコード表については、アプリケーションノート155 「1-Wire®ソフトウェアリソースガイドデバイス解説」を参照してください。DS28EA00の例は温度変換を実行する方法について示しています。2つ目の例では、オーバドライブスピードでDS2431のスクラッチパッドメモリを読み書きする2つの方法について示しています。

基本バスマスタ動作

マイクロプロセッサはリセットピンをトグルすることでDS1WMを初期化します。APIインタフェースは全1-Wire通信を実行します。動作例がDS1WM API機能を呼び出すことで書かれます。割込みを実行するマイクロプロセッサコードのバリエーションにより、結果例は割込み駆動通信の代わりにポーリングを使います。

表1の1-Wire動作が、次のコード例で使われています。

表1. 1-Wire動作
Operation* Description
OWReset Sends the 1-Wire reset stimulus and checks for the pulses of 1-Wire slave devices that are present on the bus.
OWWriteByte/OWReadByte Sends or receives a single byte of data from the 1-Wire bus.
OWWriteBytes/OWReadBytes Sends or receives multiple bytes of data from the 1-Wire bus.
OWSearch Performs the 1-Wire Search Algorithm (see application note 187, "1-Wire Search Algorithm").
OverdriveEnable Sets the 1-Wire communication speed for the DS1WM to overdrive. Note that this only changes the communication speed of the DS1WM; the 1-Wire slave device must be instructed to make the switch when going from normal to overdrive. The 1-Wire slave will always revert to standard speed when it encounters a standard-speed 1-Wire reset.
OverdriveDisable Sets the 1-Wire communication speed for the DS1WM to standard. Note that this only changes the communication speed of the DS1WM; a standard-speed 1-Wire reset is required for slave devices to exit overdrive.
MatchROM Selects device by issuing the Match ROM command followed by the 64-bit ROM ID selected.
SetClockFrequency Sets the clock frequency for the DS1WM.
InterruptEnableRegisterWrite Writes a single byte of data to the DS1WM Interrupt Enable register.
InterruptRegisterRead Reads a single byte of data from the DS1WM Interrupt register.
ReceiveBufferRead Reads a single byte of data from the DS1WM Receive Buffer register.
*この表は、例で使用される一連の手法をカバーしています。完全な説明はDS1WM.cファイルを参照してください。

初期化

ホストは、DS1WMを適切な1-Wireのバスタイミングへ初期化することから始めます。ホストは、値16 (周波数を意味する)をSetClockFrequencyルーチンに渡し、これによりClock Divisorレジスタに0x90hを書込みます。(DS1WMのデータシートを参照してください。) Interrupt Enableレジスタは、割り込みがINTRピンから発生するのを防止するために0x00hに設定されます。立ち上がり時に、受信バッファが無効な値を持っていることがあるため、1-Wireコマンドを送信する前は常に受信バッファの消去を実行するとよいでしょう。InterruptレジスタおよびReceive Bufferは立ち上がり時に一度読み込まれ、ビットはすべてクリアされます。

//----------------------------------------------------------------------------------------------------
//Start of initialization example

SetClockFrequency(16);                  //Set clock frequency to 16MHz (power-on default)
InterruptEnableRegisterWrite(0x00);     //Clear interrupts

//Flush receive buffer
InterruptRegisterData = InterruptRegisterRead();
ReceiveBufferRead();

//End of initialization example
//----------------------------------------------------------------------------------------------------

1-Wireリセット(OWReset API機能)

初期化後、ホストが1-Wireバス上にデバイスがあるかを判断するため、ホストはOWReset機能を呼び出します。この機能は、プレゼンス検出パルスを検出すると1を、デバイスが検出されない、またはエラーが発生した時は0を返します。0が返された場合には、ErrorStatus変数のエラー条件を確認する必要があります。1-Wireのコマンド(Match ROM、Skip ROM、Read ROMなど)の前には、自身のリセットを備えているOWSearch機能の呼び出し時以外は、常に1-Wireのリセットを一度発行する必要があります。ソフトウェアの設計者は、適切なエラー対処コードを追加し、そのエラー条件でトリガする必要があります。ErrorStatus値は、プレゼンス検出が起きない、デバイスが見つからない、1-Wireの短絡が発生、または1-Wireがローに固定されている、のいずれかのエラーが発生したことを意味します。

        Result = OWReset();
        if(!Result){
                switch(ErrorStatus){
                        case -1:        //DS1WM did not recognize 1-Wire reset (PD=0)
                                //To do: add your error code here
                                break;
                        case -2:        //No device found (PDR=1)
                                //To do: add your error code here
                                break;
                        case -7:        //1-Wire IO is shorted (OW_SHORT=1)
                                //To do: add your error code here
                                break;
                        case -8:        //1-Wire IO is shorted (OW_LOW=1)
                                //To do: add your error code here
                                break;
                }
        }
        

Search ROM Acceleratorを使ってROM IDを検索する

バス上の各1-Wireを特定する必要があります。固有の64ビットROM IDが、各1-Wireデバイスに保存されており、個別のデバイスを選択するために使用され、ファミリコードに基づきデバイスのタイプを特定します。例となるコードを簡素化するために、8ビットのファミリコードを使用してDS28EA00およびDS2431が区別されます。

注意:1つ以上のデバイスタイプ(同じファミリコードで)が1-Wire線に配置されている場合は、次の方法ではデバイスを他のデバイスと区別することができません。バス上で複数の1-Wireデバイスを特定する手段がなければ、ある1-Wireデバイスに機能コマンドを通信する方法がなくなります。2つ以上の類似のデバイスが使用されている場合は、意図するデバイスへ適切にアクセスするには、ルックアップテーブルを使用する必要があります。

呼び出された場合、OWSearch機能がバス上のすべての1-Wireデバイスを特定し、8バイトのROM IDをパスされたアレーに装着します。すでにOWSearch機能の一部となっているため、OWReset機能への呼び出しは必要ありません。OWSearch機能には、検索アルゴリズムの反復プロセスにより、この例外があります。特にOWSearch機能は、見つかった1-Wireデバイスの数を返し、各64ビットROM IDをROMCodesと呼ばれる2次元アレーに配置します。

以下の例では、一旦呼び出されたOWSearchであるため、その後1-Wireバスに追加されたデバイスはいずれもこのコードでは認識されないことを示します。成功した場合、OWSearchは見つかったデバイス数を返します。検索が成功しなかった場合は、ErrorStatus変数がOWResetのエラー条件を備えたエラー値を返します。検索に成功した後、ROMCodesアレーは精査され、各デバイスのアレーインデックスが保存されます。このデバイスのインデックスは、見つかった各デバイスのファミリコードを比較することによって実行されます。その後、アレーインデックスは呼び出され、見つかった特定の1-Wireデバイスと通信します。実際には、これによってリンクされたリストが簡素化され形成されます。(注意:ポインタで実行可能)

//----------------------------------------------------------------------------------------------------
//Start of DS1WM search ROM accelerator example

//Devices on the 1-Wire IO are:
//DS28EA00      Family Code = 42h (6900000004E8C842)
//DS2431        Famliy Code = 2Dh (5A0000000FDE052D)

//Find all devices on 1-Wire line and populate ROMCodes array
Result = OWSearch(ROMCodes);    //Returns number of devices found if successful

//Set number of 1-Wire devices found
if(Result)
        NumberOfDevices = Result;

if(!Result){
        switch(ErrorStatus){
                case -1:        //DS1WM did not recognize 1-Wire Reset (PD=0)
                        //To do: add your error code here
                        break;
                case -2:        //No device found (PDR=1)
                        //To do: add your error code here
                        break;
                case -7:        //1-Wire IO is shorted (OW_SHORT=1)
                        //To do: add your error code here
                        break;
                case -8:        //1-Wire IO is shorted (OW_LOW=1)
                        //To do: add your error code here
                        break;
                case -9:        //Invalid CRC for device
                        //To do: add your error code here
                        break;
                case -10:       //ROMCodes array too small (Edit MaxNumberDevices in DS1WM.h)
                        //To do: add your error code here
                        break;
        }
}

//Note: This function is intended to be used when there is only one device with the same
//Family Code present on the line
for(i=0;i<NumberOfDevices;i++){
        if(ROMCodes[i][0] == 0x42){
                DS28EA00 = i;           //Save off array index for DS28EA00
                continue;
        }

        if(ROMCodes[i][0] == 0x2D){
                DS2431 = i;             //Save off array index for DS2431
                continue;
        }
}

DS28EA00を制御するDS1WM API機能を使用する

この例では、事前に見つかったROM IDを使用してDS28EA00との通信をしています。OWResetの後のMatch ROMコマンドが発行されます。アクセスするデバイスのインデックスと合わせて、ROM CodeアレーがMatch ROM機能に移動されます。1-Wireバス上のデバイスは、Match ROMコマンド0x55hの後の、バスマスタをマルチドロップバス上で特定のDS28EA00に対応することを可能とする64ビットROMシーケンスを見ます。64ビットROMシーケンスに完全マッチするDS28EA00のみが、次のコマンドセットに応答し、他のすべてのスレーブデバイスはリセットパルスを待ちます。

OWWriteByteおよびOWReadByte API機能は、メモリコマンド(Write/Copy/Read Scratchpadコマンド)を発行するために使用されます。DS1WMは、最初にWrite Scratchpadコマンド(0x4Eh)、その後Temperature High、Temperature Low、およびConfiguration (較正)レジスタを設定するための値を送ることによって、温度アラームおよび分解能を設定します。完了後、別のOWResetがMatch ROMコマンド、ROM ID、およびスクラッチパッドの内容をレジスタメモリにコピーし、温度分解能の設定を完了するCopy Scratchpadコマンド(0x48h)と共に発行されます。10msの正しい遅延をCPUホストに追加し、コピー時間を確保する必要があります。マイクロプロセッサの遅延ルーチンの誤差により、APIはコメントされている擬似的コードのみを備えています。

コピー終了後、OWResetの後、Match ROM、ROM ID、およびConvert Temperatureコマンド(0x44h)が再度発行されます。温度変換の実行を可能にするためには、100msの遅延が必要です。最後にOWReset、その後Match ROM、ROM ID、およびRead Scratchpadコマンド(0xBEh) が発行され、温度データを備えた2バイトを読み込みます。デバイスを選択する必要がある場合は常に、OWResetの後、Match ROMコマンドおよびROM IDを備えたDS28EA00を選択するというパターンに従ってください。Skip ROMコマンドは、線上(Search ROM不要)に単一のデバイスがある時のみ使用してください。

//----------------------------------------------------------------------------------------------------
//Start of DS28EA00 example

Result = OWReset();
        if(!Result){
                switch(ErrorStatus){
                        case -1:        //DS1WM did not recognize 1-Wire reset(PD=0)
                                //To do: add your error code here
                                break;
                        case -2:        //No device found(PDR=1)
                                //To do: add your error code here
                                break;
                        case -7:        //1-Wire IO is shorted(OW_SHORT=1)
                                //To do: add your error code here
                                break;
                        case -8:        //1-Wire IO is shorted(OW_LOW=1)
                                //To do: add your error code here
                                break;
                }
        }

        //Set temperature resolution
        Result = MatchROM(ROMCodes,DS28EA00);           //Select device
        Result = OWWriteByte(0x4E);                     //Issue Write Scratchpad command
        Result = OWWriteByte(0x00);                     //TH register data
        Result = OWWriteByte(0x00);                     //TL degister data
        Result = OWWriteByte(0x1F);                     //Config. reg. data (set 9-bit temp. resolution)

        OWReset();                                      //Error code removed for conciseness
        MatchROM(ROMCodes,DS28EA00);                    //Select device
        OWWriteByte(0x48);                              //Issue Copy Scratchpad command

        //To do: add microprocessor-specific code delay to allow copy to complete
        //Delay(10MS);
//Psuedo code

        OWReset();                                      //1-Wire reset
        MatchROM(ROMCodes,DS28EA00);                    //Select device
        OWWriteByte(0x44);                              //Issue Convert Temperature command

        //To do: add microprocessor-specific code delay to allow temperature conversion to complete
        //Delay(100MS);
//Psuedo code

        //Read temperature results from scratchpad
        OWReset();                                      //1-Wire reset
        MatchROM(ROMCodes,DS28EA00);                    //Select device
        OWWriteByte(0xBE);                              //Issue Read Scratchpad command
        TempLSB = OWReadByte();                 	//Read byte
        TempMSB = OWReadByte();                 	//Read byte
//End of DS28EA00 example
//----------------------------------------------------------------------------------------------------

DS2431をオーバドライブで制御するDS1WM API機能を使用する

この例では、DS2431と通信するために事前に見つかったROM IDを使用します。OWResetの後、Overdrive Skip ROMコマンド(0x3Ch) を発行し、オーバドライブをサポートする1-Wireデバイスをオーバードライブに設定します。OverdriveEnable機能が呼び出され、DS1WMオーバドライブタイミングを開始します。この時点で、すべての1-Wire機能がオーバドライブの速度で動作します。アプリケーションノート126 「ソフトウェアを介した1-Wire®通信」で、標準およびオーバドライブモードの両方の1-Wireタイミングについての詳細を示しています。

ターゲットアドレスのTA1およびTA2変数を使用する

最初の例の手法では、ユーザ変数であるTA1およびTA2は、DS2431の所望のメモリアドレスに設定されます。OWResetの後、Match ROM、DS2431のROM ID、Write Scratchpad コマンド(0x0Fh)、ターゲットアドレス1 & 2、および64ビットのDS2431のスクラッチパッドに書き込まれた8バイトのデータが発行されます。CRC16のリードバックおよびチェックを推奨します。アプリケーションノート27 「マキシムのiButton®製品に用いる巡回冗長検査(CRC)の理解と用法」ではCRC16の詳細が説明されています。

OWWriteBytesおよびOWReadBytes

2番目の例の手法では、OWWriteBytesおよびOWReadBytesと呼ばれる2つの新しいAPI機能が使用されています。これらの2つのAPI機能は、スクラッチパッドへの大量のデータの書き込みおよび読み出しを簡素化します。

書き込みスクラッチパッドの方法は:Targetアドレス1 & 2を設定、WriteBytesアレーにデータを書き込む、OWResetを発行、Match ROM、DS2431 ROM ID、Write Scratchpadコマンド(0x0Fh)を送る、Target Address 1 & 2を送信、OWWriteBytes機能を使用してWriteBytesに保存された10バイトすべてを書き込む、CRC16をリードバックし、CRC16を必要であればチェックする。

読み込みスクラッチパッドの方法は:OWResetを発行、Match ROM、DS2431 ROM IDを送信、Read Scratchpadコマンド(0xAAh)を発行、OWReadBytes機能を使用して13バイトすべて(TA1、TA2、ES、CRC16 & 8バイトのデータ)を読み込む、ReadBytesに保存。

オーバドライブを終了するには、API機能OverdriveDisableの後、すべてのデバイスを標準速度に戻す標準OWResetを呼び出す。

//----------------------------------------------------------------------------------------------------
//Start of DS2431 example

        Result = OWReset();                     //Error code removed for conciseness
        Result = OWWriteByte(0x3C);             //Overdrive Skip ROM (all devices are now in overdrive)
        OverdriveEnable();                      //Enable Overdrive Mode

        //Write scratchpad with data
        //First method
        TA1 = 0x00;
        TA2 = 0x00;
        Result = OWReset();                     //1-Wire reset
        Result = MatchROM(ROMCodes,DS2431);     //Select device
        Result = OWWriteByte(0x0F);             //Issue Write Scratchpad command
        Result = OWWriteByte(TA1);              //Send target address 1 (TA1)
        Result = OWWriteByte(TA2);              //Send target address 2 (TA2)

        //Write 8 Bytes of Data
        Result = OWWriteByte(0x11);             //Send Data Byte for all
        Result = OWWriteByte(0x22);
        Result = OWWriteByte(0x33);
        Result = OWWriteByte(0x44);
        Result = OWWriteByte(0x55);
        Result = OWWriteByte(0x66);
        Result = OWWriteByte(0x77);
        Result = OWWriteByte(0x88);

        //It is recommended that the CRC16 be read back and verified
        //CRC16 code was left out for conciseness

        Result = OWReset();                     //1-Wire Reset
        Result = MatchROM(ROMCodes,DS2431);     //Select device
        Result = OWWriteByte(0xAA);             //Issue Read Scratchpad command
        Result = OWReadByte();                  //Read TA1
        if(Result != TA1){
                //To do: Add your error code here
        }
        Result = OWReadByte();                  //Read TA2
        if(Result != TA2){
                //To do: Add your error code here
        }

        ES = OWReadByte();                      //Read ES

        //To do: add your error code after reads
        Result = OWReadByte();                  //Read Data Byte (0x11)
        Result = OWReadByte();                  //Read Data Byte (0x22)
        Result = OWReadByte();                  //Read Data Byte (0x33)
        Result = OWReadByte();                  //Read Data Byte (0x44)
        Result = OWReadByte();                  //Read Data Byte (0x55)
        Result = OWReadByte();                  //Read Data Byte (0x66)
        Result = OWReadByte();                  //Read Data Byte (0x77)
        Result = OWReadByte();                  //Read Data Byte (0x88)

        //It is recommended that the CRC16 be read back and verified
        //CRC16 code was left out for conciseness

        //Second method
        TA1 = 0x00;
        TA2 = 0x00;

        WriteBytes[0] = TA1;
        WriteBytes[1] = TA2;

        for(i=2;i<10;i++){
                WriteBytes[i] = i;
        }

        Result = OWReset();                     //1-Wire reset
        Result = MatchROM(ROMCodes,DS2431);     //Select device
        Result = OWWriteByte(0x0F);             //Issue Write Scratchpad command

        //Write 10 bytes of data (TA1, TA2 & 8 bytes of data)
        OWWriteBytes(WriteBytes,10);            //Write data bytes

        //It is recommended that the CRC16 be read back and verified
        //CRC16 code was left out for conciseness

        Result = OWReset();                     //1-Wire reset
        Result = MatchROM(ROMCodes,DS2431);     //Select device
        Result = OWWriteByte(0xAA);             //Issue Read Scratchpad command

        //Read 13 bytes of data (TA1, TA2, ES, CRC16 & 8 bytes of data)
        OWReadBytes(ReadBytes,13);              //Read data bytes

        //It is recommended that the CRC16 be read back and verified
        //CRC16 code was left out for conciseness

        //Exit overdrive
        OverdriveDisable();
        Result = OWReset();                     //Std. reset issued (all devices are now in standard speed)

//End of DS2431 example
//----------------------------------------------------------------------------------------------------

最後に

このアプリケーションノートでは、API機能を使用してオーバヘッドなしのDS1WMを制御するホストCPUに1-Wireタイミングを生成させる例を提供しています。バス上にある複数の1-Wireデバイスを選択しアクセスする一般的なAPI機能について紹介しました。DS28EA00およびDS2431の制御およびアクセスはバス上のデバイスの例として使用しています。また、オーバドライブおよび単一/マルチバイトの読み出しおよび書き込みも示されています。

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

iButtonはMaxim Integrated Products, Inc.の登録商標です。



関連製品
DS18B20 プログラマブル分解能1-Wireデジタルサーモメータ 無料
サンプル
 
DS1WM 合成可能な1-Wireバスマスタ  
DS2408 1-Wire、8チャネル、アドレス指定可能なスイッチ 無料
サンプル
 
DS2502-E48 48ビットノードアドレスチップ 無料
サンプル
 


次のステップ
EE-Mail EE-Mail配信の登録申し込みをして、興味のある分野の最新ドキュメントに関する自動通知を受け取る。
シェア
その他のチャンネル  E-Mailこのページを知り合いに送る。




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



APP 120: Sep 28, 2004
アプリケーションノート120, AN120, AN 120, APP120, Appnote120, Appnote 120

シェア



その他




お問い合わせ:ご意見、ご質問     |     プライバシーポリシー     |     法的お知らせ     |     Distributor Portal
Copyright © 2012 by Maxim Integrated Products