要約
本稿では、マイクロプロセッサのペリフェラルであるUART(Universal Asynchronous Receiver/Transmitter)を使用して、1-Wire®のバス・マスタを実装する方法を紹介します。特に、必要な電気的インターフェース、UARTの構成(コンフィギュレーション)、UARTの信号と1-Wireの信号のタイミングについて詳しく解説します。その中で、開発作業に役立つソフトウェア・ユーティリティ「UART 1-Wire Master」にも触れることにします。このツールを利用すれば、標準速度とオーバードライブ速度のそれぞれに対応してタイミングを生成するのが容易になります。UARTではバイト・タイミングを柔軟に設定可能なので、1-Wireで使用するタイム・スロットの生成、リセット・パルスの生成、プレゼンス・パルスの検出といった処理を容易に実装することができます。
はじめに
1-Wireは、アナログ・デバイセズが開発した革新的なプロトコルです。これを採用すれば、1本の配線とグラウンド線を使用するだけで、電力の供給とデジタル通信を実現できます。1-Wireに対応するデバイスは、IDの識別、データの保存、時間の管理、測定、制御に利用できる経済的なソリューションになります。また、長距離(100m以上)のデータ伝送にも対応できるという付加的なメリットも得られます。1-Wireのホスト側にあたるドライバは、様々な方法で実装できます。例えば、アナログ・デバイセズが提供するブリッジ・デバイスを使用して、マイクロコントローラのGPIO(汎用入出力)のビットバンギングを行うという方法が考えられます。あるいは、UARTなどのペリフェラルを使用して、必要なタイミングを生成することでも対応可能です。本稿では、UARTを使用して1-Wireのバス・マスタを実装する方法について詳しく解説することにします。また、その開発に役立つソフトウェア・ユーティリティであるUART 1-Wire Masterの活用方法も紹介します。このツールを使用すれば、多様なボー・レートに対応する形で、各タイミング・パラメータの実現に必要なペリフェラル用のデータを自動的に構成することができます。
1-Wireに対応するデバイスのほとんどは、比較的少量のデータの伝送に使用されます。想定されるタスクに対しては、16kbpsという一般的なデータ・レートによって十分に対応できるはずです。一般的には、8ビットまたは16ビットのマイクロコントローラのGPIOピンをビットバンギング形式で用い、1-Wireのバス・マスタとして機能させるのが簡便な利用方法になるでしょう。
一方、32ビットのシステムでは、プロセッサのクロック周波数が100MHzを超えることが珍しくありません。その場合、1-Wireのバス・マスタとしてGPIOピンを使用すると、1-Wireの各ビットに対して多数のクロック・サイクルが消費されることになります。また、そのエッジは、必要なタイミングの要件に応じて正確に制御されるとは限りません。加えて、32ビットの可搬型システムでは、1-Wireの読み出し/書き込み用のタイム・スロットを生成する際、バッテリの貴重な電力が消費される点が問題になります。UARTを利用できれば、メインのプロセッサによってビット・タイミングとバイト・フレーミングの処理を行わなくて済むことになります。
本稿では、必要な電気的インターフェース、UARTの構成、UARTの信号と1-Wireの信号のタイミングについて説明します。1-Wireに関する一般的な知識を有していることを前提とし、一般的なタイミングとロジック・レベルをベースとして解説を進めます。具体的なタイミングや電圧の仕様、許容範囲などについては、1-Wireに対応する製品のデータ・シートをご覧ください。
基本的な概念
1-Wireのマスタの実装に必要な出力タイミングの信号は、様々なボー・レートに設定されたUARTによって供給されます。1-Wireのマスタについては、ボー・レート、キャラクタあたりのデータ・ビット数、パリティ、ストップ・ビットの数が適切に設定されている必要があります。UARTの送信バイト数を変更することにより、1-Wireのリセット・パルスや、低レベルのコマンドを構築するための読み出し/書き込みスロットが生成されます。マイクロプロセッサは、単に1バイトのキャラクタ・コードをUARTの送信レジスタに書き込むことによって1-Wireのタイミング・パターンを開始します。その逆の処理として、マイクロプロセッサは1または0のビットに対応する1バイトのキャラクタ・コードを1-Wireのスレーブから読み出します。1-Wireのすべてのビット転送については、バス・マスタ(すなわちUART)によってタイミング・サイクルを開始する必要があります。これは、1-Wireのバスをローに引き下げることによって行われます。UARTは、1-Wireのタイミングを生成するために、1バイトのデータの送信と受信を同時に行わなければなりません。つまり、UARTは全二重通信をサポートする必要があります。受信するバイト・データには有用な情報が含まれています。それによって、バイト・データは正しく送信されたのか、接続の短絡やデータの破損はなかったのか、1-Wireのスレーブ・デバイスが接続されていたのかといったことを確認できます。送信される各バイト・データは、1-Wireの1つの読み出しビット、書き込みビット、またはリセットに対応します。
UARTから1-Wireへの電気的インターフェース
1-Wireに対応するデバイスは、1.8V~5.5Vの範囲のバス電圧、オープンドレインに対応した回路構成を前提として動作します。正確なロジック・レベルと最小プルアップ電圧は、デバイスごとに異なります。そのため、各製品のデータ・シートを参照して動作に必要な電圧を確認しなければなりません。図1に示したのは、ホストのTXピンの出力電圧がスレーブの動作電圧の範囲内にある場合の例です。プルアップ抵抗RPUPにはTXピンからプルアップ電圧VPUPが供給され、RXピンのハイ・インピーダンスの入力によってオープンドレインの構成が維持されます。そのため、スレーブ・デバイスは、読み出しビットまたはリセット/プレゼンス・パルスの間にTX信号がハイであっても、1-WireのI/Oラインをローにすることができます。図1の構成の場合、プルアップを強化する仕組みがありません。そのため、正しい動作を得るためには、RPUPの値を適切に選択することが重要になります。スレーブ・デバイスに供給される電流の量については、より多くの電流を必要とするコマンド(スクラッチパッドのコピーなど)を対象として考察しなければなりません。電圧降下によって、スレーブの最小動作電圧またはホスト/スレーブのVILのレベルを下回ることを防ぎつつ、必要な電流を供給できるように、抵抗は十分に小さい値に設定する必要があります。図1の構成については、出発点としてプルアップ抵抗の値を480Ωに設定するとよいでしょう。
図1. 1-Wireのバス・インターフェース用の回路
システムによっては、ホストのTXピンの電圧にスレーブが対応できないケースも存在するはずです。その場合、プルアップ電圧用の独立した回路によって接続を実現することになります。実際、ほとんどのUARTでは、送信データ用のピンはオープンドレインではありません。そのため、一般的にはオープンドレインを実現するための外付けバッファ回路を使用します。図2は、ディスクリート部品を使用して、そのバッファ回路を構成する方法を表しています。あるいは、「NC7WZ07」をはじめとするICを使用してバッファ回路を構成してもよいでしょう(図3)。どちらの回路においても、ROMコマンドのレベルに対応するための出発点としては、プルアップ抵抗の値を4.7kΩに設定するのがよいはずです。ただ、データをEEPROMにコピーするといった大電流を伴う処理を行いたい場合には、抵抗値を異なる値に変更する必要があります。ロジック・レベルが、ホストとスレーブのECテーブルに示されたパラメータの値に違反していないことを確認してください。
図2. オープンドレインに対応するためにディスクリート部品を使用して構成したバッファ回路
図3. オープンドレインに対応するためにICを使用して構成したバッファ回路
1-Wire/UARTのビット・タイミング
図5~図9のタイミング図は、1-Wireのタイム・スロットとそれに対応するUARTのバイト・フレームの関係を表したものです。UARTをバス・マスタとして機能させる場合、TXピン(出力)がハイからローに遷移する際にすべての通信が始まります。また、電気的インターフェースによってバッファされたTXの信号はRXピン(入力)に接続されています。そのため、UARTは1バイトのデータを送信するごとに1バイトのデータを受信することになります。
各タイミング図には、UARTの構成、送信されるバイト・データの値、受信すると想定されるバイト・データの値を示してあります。UARTのそれぞれの構成により、1-Wireの通常モードのタイミングに準拠する信号波形が生成されます。UARTについては、リセット・パルス/プレゼンス・パルスの検出や読み取り/書き込みのタイム・スロット向けに異なるボー・レートが設定されていることに注意してください。他の構成を使用することも可能ですが、その場合、評価基準が本稿で示すタイミング図とは異なる可能性があります。送信されるバイト・データの値は1-Wireのバス・マスタの役割に対応し、受信されるバイト・データの値(または範囲)はバス上で行われる操作を表します。読み出しの際には、1-Wireのスレーブ・デバイスが返すビット・データの値を判定するために、受信した値を評価しなければなりません。タイミング図には、Read 0(0の読み出し)とRead 1(1の読み出し)の評価基準を示してあります。
図4. タイミング図の凡例
図5. リセット・パルスとプレゼンス・パルスの検出
1-Wireのリセット・パルスを生成したり、プレゼンス・パルスを検出したりするためには、複数種のボー・レートを使用することができます。図5は、ボー・レートを9600に設定し、1-Wireの標準速度のリセット・パルスを生成する場合のUARTの構成を表しています。UARTの各ビットのタイム・スロットは、ボー・レートの逆数になります。UARTのスタート・ビットは必ずローであり、それを8つのデータ・ビットと組み合わせて使用することにより適切なタイミングを生成することができます。UARTのデータはLSBファーストで送信されます。例えば、F0hというバイト・データを送信する場合、0~3のデータ・ビットがロジックの0、4~7のデータ・ビットがロジックの1になります。その場合、520.83マイクロ秒のリセット・ロー時間(Reset Low Time、TRSTL)が生成されます。受信する値は、1-Wireのスレーブ・デバイスが1つ以上存在するかどうかということに依存します。また、各スレーブ・デバイスにおけるプレゼンス・パルスの内部タイミング、立上がり時間、各ビット・ウィンドウ内のUARTのサンプリング時間によっても異なります。スレーブ・デバイスが存在しない場合、受信する値は送信された値と等しくなります。スレーブ・デバイスが存在する場合には、受信するデータは様々な値をとります。単一のスレーブ・デバイスが最小の内部タイミングで動作している場合、E0hという値が返される可能性があります。一方、最大の内部タイミングで動作している場合には、90hという値が返されるかもしれません。オシロスコープやロジック・アナライザを使用し、所望のタイミングが得られているか否かを確認することが重要です。UARTでは、ボー・レートによって誤り率が異なることも踏まえて、すべてのタイミングについて確認する必要があります。
必要な回復時間TRECを確保できるようにするために、送信されるUARTのバイト・データの間に遅延を追加しなければならないケースがあります。その場合、ホストのUARTのバッファに、連続して送信するコマンドを蓄積してはなりません。ユーティリティ・ソフトウェアのUART 1-Wire Masterを使用すれば、選択したボー・レートに対するタイミング・パラメータとしてTX、RX、遅延の値を算出することができます。同ツールを使用することにより、その作業が簡素化されるということです。同ツールは、UARTを構成するために、標準速度とオーバードライブ速度、様々なボー・レートに対応するタイミングを生成します。このツールは、本稿の末尾に示したリンクにアクセスすることによってダウンロードできます。また詳細については、同ツールのヘルプ・メニューを参照してください。
図6. Read 0のタイム・スロット
図7. Read 1のタイム・スロット
先述したとおり、1-Wireによる通信は必ずホストによって開始されます。ホストは、読み出しロー時間(Read Low Time、TRL)の間に1-WireのIOをローに駆動し、スレーブからビット・データを読み出します。スレーブは、0ビットのデータを送信する場合、マスタのサンプル読み出し時間(Master Read Sample Time、TMSR)よりも長くIOをローに維持します。1ビットのデータを送信する場合は何もしません。それにより、ホストがTRLの最後にIOラインを解放した後はフロート状態に維持することができます。図6、図7の読み出しタイム・スロットは、11万5200のボー・レートを使用して生成されています。1-WireのRead 0の処理に応じて受信するRXのバイト・データは、0xFE~0x00の範囲にあります。その値は、スレーブ・デバイスの内部時間ベースとIOの立上がり時間によって異なります。1-WireのRead 1の処理に応じて受信するRXのバイト・データは、(ボー・レートが11万5200の場合には)必ず0xFFになります。1-Wireのスレーブは、バス・マスタがデータ・ラインを解放した直後にデータ・ラインを1の状態に戻すことができるからです。ボー・レートを高めると、送受信されるバイト・データは変化する可能性があります。UART 1-Wire Masterは、選択されたボー・レートに対応して、TX、RX、遅延の適切な値を算出します。
図8. Write 0のタイム・スロット
図9. Write 1のタイム・スロット
図8、図9は、ボー・レートが11万5200という条件下で1または0をスレーブ・デバイスに送信する場合の様子を表しています。これ以外の様々なボー・レートに対応して適切なタイミングを生成することも可能です。その場合にも、UART 1-Wire Masterを使うことで適切な値を計算することができます。図を見ると、IOラインを駆動するのはホストだけで、スレーブ・デバイスはどのデータにも反応していません。そのため、1-Wireの書き込みに対してRXのバイト・データを評価する必要はないようにも思えます。しかし、RXの値を評価してそれがTxの値と一致していれば、データが破損していないという確認がとれます。1-Wireに対応するシステムの中には、通常動作を行っている際、システムにスレーブ・デバイスを追加できるものがあります。書き込み中に追加されたデバイスは、バスに望ましくない遷移を引き起こす可能性があります。このような問題は、RXの値を確認することよって検出することができます。
1-Wireにおけるビット間のタイミング
1-Wireのバスがもたらす主なメリットとしては、ビット間のタイミングを柔軟に設定できることが挙げられます。ビット間の遅延は、最小でTREC、最大でバス・マスタが必要とする任意の値に設定することができます。1-Wireのビット・データまたはバイト・データの間の遅延時間に上限値はありません。そのため、プロセッサは、ビット・データのタイム・スロットをバイト・データの値に対応するようフレーム化する際、空いた時間を使ってUARTに対応することができます。1-Wireに対応するデバイスとの通信は、優先度の低いタスクとして扱えます。プロセッサは、処理サイクルや電力を無駄にしたり、優先度の高いタイムクリティカルなタスクを無視したりすることなく動作することが可能です。
図10. ビット間のタイミングの柔軟性
UART 1-Wire Masterの機能
UART 1-Wire Masterは、様々なボー・レートを対象として、1-Wireのタイミングの生成に必要なTX、RX、遅延の値を素早く算出します。このユーティリティを利用することによって、USBからUARTへのブリッジ・デバイス(ProlificやFTDIの製品)との間で容易に通信を実現することができます。つまり、1-Wireのスレーブ・デバイスとの間でリアルタイムの通信が行えるようになるということです。ハードウェアを利用できない場合には、UART 1-Wire Masterにおいてエミュレーション・オプションを選択するとよいでしょう。図11に示した「Configuration」タブには、ECテーブルのタイミング・パラメータの値を入力するためのフィールドが用意されています。それらの値を使用することで、UART用のデータが算出されます。図12に示した「1-Wire」タブでは、実際のスレーブ・デバイスを使用するか、またはシミュレーションの出力を使用することによって、動作を確認することができます。データ・ログには、実行した各コマンドに関連する情報が表示されます。このツールを使用する際には、ヘルプ・メニューのユーザー・ガイドを参照してください。
図11. 「Configuration」タブ
図12. 「1-Wire」タブ
まとめ
UARTは、優れたプログラマビリティを備えています。そのため、最新のプロセッサにおいても重要なペリフェラルとして使用されています。UARTでは、バイト・タイミングを柔軟に設定できます。そのため、1-Wireの読み出し/書き込みタイム・スロットとリセット/プレゼンス・パルスの検出に対応する設定を簡単に実装することができます。
UART 1-Wire Masterを使用すれば、標準速度とオーバードライブ速度に対応し、すべてのタイミング・パラメータの値を生成することができます。そのため、迅速に開発を進められます。このツールは、広範なボー・レートに対応します。また、ほとんどのUARTに対する互換性を備えています。このツールは、DS1990Rからダウンロードすることが可能です。
商標
1-Wireは、Analog Devices, Inc.の登録商標です。
FTDIは、Future Technology Devices Internationalの登録商標です。
Prolificは、Prolific Technology, Inc.の登録商標です。
この記事に関して
製品カテゴリ
{{modalTitle}}
{{modalDescription}}
{{dropdownTitle}}
- {{defaultSelectedText}} {{#each projectNames}}
- {{name}} {{/each}} {{#if newProjectText}}
-
{{newProjectText}}
{{/if}}
{{newProjectTitle}}
{{projectNameErrorText}}