要約
すべての1-Wire®デバイスのデータシートでは、2セットのコマンドを説明しています。ROM機能コマンドと呼ばれる1つ目のセットはデバイスの識別と選択に使用されます。2つ目のセットはメモリ機能コマンドと呼ばれますが、それ以外の非メモリ動作を含むことがあります。ROM機能コマンドは、デバイスが選択されるたびに完了させて、メモリ機能コマンドに備える必要があります。マキシム・インテグレーテッドによって作成された1-Wire APIは、これらのコマンドを利用して1-Wireデバイスで動作します。場合によっては、どのコマンドが呼ばれているかが明らかでないことがあります。このアプリケーションノートでは、データシートに示されたコマンドをAPI機能にマッピングしています。特定のAPI機能が利用可能でない場合、汎用の通信API機能を使用してコマンドを変換する手法を提示しています。
はじめに
すべての1-Wireデバイスのデータシートでは、2セットのコマンドを説明しています。ROM機能コマンドと呼ばれる1つ目のセットはデバイスの識別と選択に使用されます。2つ目のセットはメモリ機能コマンドと呼ばれますが、それ以外の非メモリ動作を含むことがあります。ROM機能コマンドは、デバイスが選択されるたびに完了させて、メモリ機能コマンドに備える必要があります。マキシム・インテグレーテッドによって作成された1-Wire APIは、これらのコマンドを利用して1-Wireデバイスで動作します。場合によっては、どのコマンドが呼ばれているかが明らかでないことがあります。このアプリケーションノートでは、データシートに示されたコマンドをAPI機能にマッピングしています。特定のAPI機能が利用可能でない場合、汎用の通信API機能を使用してコマンドを変換する技術を提示しています。
このアプリケーションノートで扱う略語(PD、TMEX、OWAPI、OWCOM)を含めたさまざまなAPIの詳細な説明については、アプリケーションノート155 「1-Wireソフトウェアリソースガイドデバイス解説」を参照してください(特殊な用語、コマンド、またはコードについては、わかりやすくするためイタリック体で示しています)。
ROM機能コマンド
ROM機能コマンドは、ROM IDを検出するため、またはROM IDを用いてさまざまなモードでデバイスを選択するために使用します。ROM IDは、ファミリコード、シリアル化フィールド、および巡回冗長検査(CRC)を含む固有の64ビットの数値です。1-Wireマスタは、1-Wireリセットを送出しプレゼンスを受信した後でこれらの機能の1つを送信します。
Read ROMコマンドは、ROM IDをじかに読み出します。Read ROMコマンドは、1つのデバイスのみ接続されている場合にのみ1-Wireネットワーク上で使用することができます。複数のデバイスのネットワークでは、Search ROMコマンドでROM IDを検出する必要があります。この検索アルゴリズムの詳細はアプリケーションノート187 「1-Wire検索アルゴリズム」で説明しています。Conditional Search ROMコマンドは、何らかのアラーム状態にある1つの1-Wireデバイスのみが応答する以外は、Search ROMと同様に機能します。これは、注意が必要なデバイスのみを検出するために使用します。
Skip ROMコマンドは、ROM IDに関係なくすべてのデバイスを選択するために使用します。このコマンドは、十分なエネルギーがあるという前提でプログラムメモリデバイスをグループにまとめるために使用することが可能です。Overdrive Skipコマンドは似ていますが、すべてのデバイスを選択するだけではなく、これらのデバイスをオーバドライブの通信速度に切り替えます。Overdrive Skipコマンドは、すべての対応する1-Wireデバイスをオーバドライブ速度に切り替えるためによく使用されます。デバイスをオーバドライブで通信するようにした後、従来のSearch ROMシーケンスを使用してROM IDを検出することができます。
Match ROMコマンドは、選択したROM IDをブロードキャストすることによって特定のデバイスを選択します。Overdrive Matchは似ていますが、同時にデバイスをオーバドライブの通信速度に切り替えます。Resumeコマンドは選択された最後のデバイスを再度選択するために使用します。これは同じデバイスに繰り返しアクセスするときのショートカットコマンドです。
表1では、特定のROM機能コマンドにAPIをマッピングしています。各種の1-Wire APIは、ネットワーク上に複数の1-Wireデバイスが存在するという考え方で設計されているため、単一デバイスのネットワークで必要なコマンドまたは最も有効なコマンドは直接サポートされていないことに留意してください。ただし、Customコマンドで後述するように、基本通信機能を使用してあらゆるコマンドを構築することができます。
| Command | PD | TMEX |
| Read ROM | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Match ROM | owAccess | TMAccess |
| Search ROM | owFirst, owNext | TOMFirst, TMNext |
| Conditional Search ROM | owFirst, owNext | TMFirstAlarm, TMNextAlarm |
| Skip ROM | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Overdrive Skip* | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Overdrive Match | owOverdriveAccess | TMOverAccess |
| Resume Command** | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Command | OWAPI | OWCOM |
| Read ROM | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Match ROM | (package com.dalsemi.onewire.adapter) DSPortAdapter.select |
DSPortAdapter.select |
| Search ROM | (package com.dalsemi.onewire.adapter) DSPortAdapter.getFirstDeviceContainer, DSPortAdapter.getNextDeviceContainer |
DSPortAdapter.getFirstDeviceContainer, DSPortAdapter.getNextDeviceContainer |
| Conditional Search ROM | (package com.dalsemi.onewire.adapter) DSPortAdapter.setSearchOnlyAlarmingDevices (then same as Search ROM) |
DSPortAdapter.setSearchOnlyAlarmingDevices (then same as Search ROM) |
| Skip ROM | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Overdrive Skip* | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| Overdrive Match* | (package com.dalsemi.onewire.container) OneWireContainer.setSpeed OneWireContainer.doSpeed |
OneWireContainer.setSpeed OneWireContainer.doSpeed |
| Resume Command** | No predefined API, see Custom Commands. | No predefined API, see Custom Commands. |
| *注:オーバドライブの通信速度をサポートする1-Wireデバイスにのみ適用 **注:Resumeコマンドをサポートする1-Wireデバイスにのみ適用 |
||
メモリ機能コマンド
メモリ機能コマンドは、デバイスによって少し異なります。ただし、その主要な目的は同じで、デバイスのメモリ領域の読出しと書込みです。これらの異なるコマンド構造に対処するため、1-Wire APIはこれらの相違点を取り除くように構築しました。たとえば、汎用の書込みメモリAPIはWrite Scratchpad、Read Scratchpad、およびCopy Scratchpadシーケンス、あるいはEPROM書込みメモリシーケンスを使用することができます。APIユーザにとって、これは同じに見えます。
ほとんどのAPIに3レベルのメモリコマンドがあります。1つ目のメモリコマンドはいずれの構造も持たないメモリ(未処理)に対する読出しと書込みを可能にします。2つ目のメモリコマンドはUniversal Data Packet (UDP)というパケット構造を使用します。3つ目のメモリコマンドタイプは、複数のUDP構造を1つのファイル構造にまとめます。UDPとファイル構造の説明については、アプリケーションノート114 「1-Wire File Structure」を参照してください。表2では、3タイプのメモリ動作にAPIをマッピングしています。
| Command | PD | TMEX |
| Write Raw | owWrite | TMProgramBlock (EPROM only) (see Custom Commands) |
| Read Raw | owRead | TMProgramBlock (EPROM only) (see Custom Commands) |
| Write UDP | owWritePagePacket | TMWritePacket |
| Read UDP | owReadPagePacket | TMReadPacket |
| Write File | owCreateFile owWriteFile |
TMCreateFile TMWriteFile |
| Read File | owOpenFile owReadFile |
TMOpenFile TMReadFile |
| Command | OWAPI | OWCOM |
| Write Raw | (package com.dalsemi.onewire.container) MemoryBank.write |
MemoryBank.write |
| Read Raw | (package com.dalsemi.onewire.container) MemoryBank.read |
MemoryBank.read |
| Write UDP | (package com.dalsemi.onewire.container) PagedMemoryBank.writePagePacket |
PagedMemoryBank.writePagePacket |
| Read UDP | (package com.dalsemi.onewire.container) PagedMemoryBank.readPagePacket |
PagedMemoryBank.readPagePacket |
| Write File | (package com.dalsemi.onewire.application.file) OWFileOutputStream.write |
OWFileOutputStream.write |
| Read File | (package com.dalsemi.onewire.application.file) OWFileInputStream.read |
OWFileInputStream.read |
データシートのメモリ機能コマンドの下に含まれるコマンドの一部は、実際はカスタムデバイスコマンドです。これらのコマンドを処理するためのガイドについては、以下の項を参照してください。
カスタムコマンド
ほとんどすべてのカスタムコマンドは、まずMatch ROMに相当するAPIでデバイスを選択してから、データの双方向ブロックを1-Wireネットワークに送信することによって得ることができます。このブロックは、必要な書込みコマンドをブロックに入れ、1-Wireデバイスから読み出したブロックにFF (hex)バイトを入れることによって構築されます。たとえば、DS1922Lはメモリにマッピングされたリアルタイムクロック(RTC)レジスタを備えており、Read Memoryコマンドでアクセスすることができます。図1は、DS1922Lのデータシートからの引用です。

図1. DS1922Lの(PW付き)メモリ読出しおよびCRCフロー(データシート)
DS1922Lのデータシートで規定されているように、RTCレジスタはアドレス0219 (hex)から始まる5バイト長です。図1に示したメモリコマンドフローは、Match ROMなどのROM機能コマンドでデバイスが選択された後に開始されます。
表3は、フローチャートに基づいて1-Wireバスに送信される双方向データのブロックを構成する16バイトを一覧表示しています。このデータは一度に1バイトずつ送信することができますが、多くの場合、ブロックを作成してすべてを一度に送信すると効率が向上します。
| Block Offset | Byte Value (hex) | Description |
| 0 | 69 | Master Tx Read Memory with (PW) and CRC command |
| 1 | 19 | Master Tx TA1 (address, least significant byte, T7:T0) |
| 2 | 02 | Master Tx TA2 (address, most significant byte, T15:T8) |
| 3 | FF | Master Tx Password Byte 0 (assume not set) |
| 4 | FF | Master Tx Password Byte 1 |
| 5 | FF | Master Tx Password Byte 2 |
| 6 | FF | Master Tx Password Byte 3 |
| 7 | FF | Master Tx Password Byte 4 |
| 8 | FF | Master Tx Password Byte 5 |
| 9 | FF | Master Tx Password Byte 6 |
| 10 | FF | Master Tx Password Byte 7 |
| 11 | FF | Master Rx byte 0 of RTC (address 0219h) |
| 12 | FF | Master Rx byte 1 of RTC (address 021Ah) |
| 13 | FF | Master Rx byte 2 of RTC (address 021Bh) |
| 14 | FF | Master Rx byte 3 of RTC (address 021Ch) |
| 15 | FF | Master Rx byte 4 of RTC (address 021Dh) |
図2は、1-Wireパブリックドメイン(PD)のAPI用に記述した「C」の例であり、表3に示したブロックを使用してDS1922LのRTCを読み出しています。
図2. PDのRTC読出しの例
unsigned char datablock[] = { 0xF0,0x19,0x02,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };
int portnum=0;
// select the current device (Match ROM)
if (owAccess(portnum))
{
// send the read memory command and address, receive the RTC value
if (owBlock(portnum, 1, datablock, 16))
{
// RTC is now in bytes 11-15 of datablock
...
}
}
表4は、各APIの双方向ブロックコマンドを示します。完全を期すため、シングルバイトとビットコマンドも記載しています。
| Command | PD | TMEX |
| block (bidirectional) | owBlock | TMBlockStream |
| byte (bidirectional) | owTouchByte | TMTouchByte |
| bit (bidirectional) | owTouchBit | TMTouchBit |
| read byte | owReadByte | TMTouchByte(data = FF hex) |
| write byte | owWriteByte | TMTouchByte(data to write) |
| reset | owTouchReset | TMTouchReset |
| Command | OWAPI | OWCOM |
| block (bidirectional) | (package com.dalsemi.onewire.adapter) DSPortAdapter.dataBlock |
DSPortAdapter.dataBlock |
| byte (bidirectional) | (package com.dalsemi.onewire.adapter) DSPortAdapter.dataBlock (single byte block) |
DSPortAdapter.dataBock (single byte block) |
| bit (bidirectional) | Not available | Not available |
| read byte | (package com.dalsemi.onewire.adapter) DSPortAdapter.getByte |
DSPortAdapter.getByte |
| write byte | (package com.dalsemi.onewire.adapter) DSPortAdapter.putByte |
DSPortAdapter.putByte |
| 1-Wire reset + presence detect | (package com.dalsemi.onewire.adapter) DSPortAdapter.reset |
DSPortAdapter.reset |
1-Wireの各デバイスタイプのデータシートに注目すると、適切なブロックを構築して汎用の1-Wire I/O機能を使用することによって、あらゆる機能を実行することができるようになります。一部の1-Wireデバイスは、特別な給電の制約やプログラムパルスを必要とします。これらは、表5の特殊API機能が取り扱います。
| Command | PD | TMEX |
| EPROM programming pulse | owProgramPulse | TMProgramPulse |
| Power delivery (strong pullup) after bit |
owReadBitPower (read bit only) | TMOneWireLevel (prime for next bit) TMTouchBit |
| Power delivery (strong pullup) after byte |
owWriteBytePower (write byte only) | TMOneWireLevel (prime for next byte) TMTouchByte |
| Command | OWAPI | OWCOM |
| EPROM programming pulse | (package com.dalsemi.onewire.adapter) DSPortAdapter.startProgramPulse |
DSPortAdapter.startProgramPulse |
| Power delivery (strong pullup) after bit |
(package com.dalsemi.onewire.adapter) DSPortAdapter.startPowerDelivery DSPortAdapter.putBit / DSPortAdapter.getBit |
DSPortAdapter.startPowerDelivery DSPortAdapter.putBit / DSPortAdapter.getBit |
| Power delivery (strong pullup) after byte |
(package com.dalsemi.onewire.adapter) DSPortAdapter.startPowerDelivery DSPortAdapter.putByte / DSPortAdapter.getByte |
DSPortAdapter.startPowerDelivery DSPortAdapter.putByte / DSPortAdapter.getByte |