要約:万能なDS80C400は、どの様な機器に関してでも、Ethernetが使用可能となり、いくつかの異なる方法で実現します。このアプリケーションノートでは、TINIm400リファレンスモジュールとJava™ランタイム環境
を分散パブリックアドレスシステムで使用されるリモート制御スピーカとして使用する方法について説明します。
はじめに
万能なDS80C400は、どの様な機器に関してでも、Ethernetが使用可能となり、いくつかの異なる方法で実現します。このアプリケーションノートでは、TINIm400リファレンスモジュールとJavaランタイム環境を分散パブリックアドレスシステムで使用されるリモート制御スピーカとして使用する方法について説明します。
アプリケーションノート609¹でもEthernet対応スピーカについて説明していますが、実装方法は異なるものです。609の例では、8051アセンブリ言語でプログラミングしたカスタムボードを使用して、最高性能を実現しています。DS80C400は、この構成によって16ビットのオーディオストリームを44.1kHzで処理することが可能であり、質の高い音楽の再生に十分なものでした。ここでのアプリケーションの要件は厳しいものではなく、11kHzで音声データを快適に伝送することができるため、カスタムボードやアセンブリ言語を利用する必要ありません。したがって、ここでのデモは、愛好家や開発者が入手しやすい標準的なTINIm400を使用します。さらに、Javaランタイム環境を使用することで、プロジェクトへのHTTPサーバの追加を簡素化しています。
システムの概要
ソフトウェア
この例のアプリケーションでは、TINIm400の予備の512キロバイトフラッシュを使用して、事前に生成されたオーディオメッセージを16ビット11kHzフォーマットで格納します。ユーザインタフェースは、TINIm400により提供されるウェブページです。このウェブページでは、フォーム上にオーディオメッセージのリストが含まれています。再生するメッセージを選択すると、HTTPPOSTメッセージがTINIm400に送信されますが、それはどのオーディオサンプルが選択されて、再生を開始するのか決定しなければなりません。
このアプリケーションでは、主なソフトウェアが2つあります。1つは、HTTPサーバ(POST処理コードを含む)で、もう1つはオーディオ再生コードです。オーディオを再生するコードは、11kHzのタイマ割り込みで実行する必要があるため、簡潔で効率的でなければなりません。したがって、オーディオインタフェースは8051で作成し、HTTPサーバコードはJavaで作成しています。
アプリケーションソフトウェアに加えて、WAVファイルからオーディオデータを読み取り、そのデータをDS80C400のROMローダが理解できるTBINフォーマットに書き換えるためのJavaツールが作成されています。このツールを使用すると、TINIm400のフラッシュに簡単にロードできるようにいくつかのWAVファイルを1つのファイルに結合することが可能です。
ハードウェア
図1 は、TINIs400ソケットに接続することのできるオーディオ回路の図を示しています。DAコンバータは、この構成で0~2Vの出力を供給します。スピーカのラインレベル入力は±1Vであるため、スピーカのグランドを1Vに接続することによって、スピーカのラインレベル入力を可能にしています。
図1. ハードウェアのブロック図
この回路で使用されているDAコンバータは、16ビット精度を持つMAX542²です。シリアルデータはDS80C400のシリアルポートを介してDACに渡すことができ、これはクロックとデータ端子をプログラムで切り換えることに比べると、はるかに高速です。但し、TINIs400では、レベルシフタを通過した後のシリアル送受信端子にのみアクセス可能であるため、DACとの通信はできなくなります。したがって、このアプリケーションではデータラインとクロックラインを手動で振る必要があります。これにより、TINI®がオーディオサンプルを再生しようとすると、TINIの性能が低下します。これは、ネットワークデータを処理し、さらに別のタスクを管理するための空いているサイクルが少ないためです。実際のアプリケーションでは、DACをDS80C400の送受信シリアルポートの1つに直接接続することを強く望みます。
クロックラインとデータラインに加えて、TINIは、シリアル転送中、チップセレクトをローに保持することも必要になります。また、すべてのシリアルデータを書き込んだ後にロード信号(LDAC)をローパルス出力する必要があります。
TINIs400³への接続
5V、グランド、及び2つのI/Oピン(P1.0とP1.1)が得られるので、4つのI²C端子(ソケットボードのJ27)を利用することを選択しました。P1のSFRのビットは、ビットアドレス指定が可能であるので、「anl/orl
direct, #data」命令の代わりに「mov bit, c」と「setb/clr」のビット命令を使用してビットのセットとクリアを実行することができます。これによって1サイクル省くことができます。この場合の1サイクルは重要な意味を持ちます。オーディオサンプルごとに、ローに16回及びハイに16回クロックを設定する必要があり、さらにデータビットを16回設定する必要があります。つまり、サンプル当り合計48サイクルを省けることになります。
ロード信号(LDAC)とチップセレクト(CS)の操作は、少ない回数(各サンプルで2回)で済むため、LDACとCSがビットアドレス指定可能でなくても、損失は少なくてすみます。ここでは、2つのSPIピン(ソケットボードのJ21)を使用することにします。使用するピンはP5.6とP5.7で、回路図ではnPCE2及びnPCE3と記されています(SPIピンはPCEと兼用)。
図2. MAX542のDACに接続されたTINI
図2 は、オーディオボードに接続されたTINIm400/TINIs400のペアを示しています。左側のソケットボードから出ているワイヤは、LDACとCSの信号です。TINIソケットボードの右下にクロック、データ、5V、及びグランドがあります。右側にあるのが単純なDACボード4 で、アンプ内蔵スピーカを接続することのできる便利な3.5mmのフォノジャックが備わっています。このボードには2つのDACが搭載されていて、ステレオ出力を処理するために設計されていますが、ここではデモを行うためDAC入力を1つにまとめているので、結果としてモノラル音になっていることに注意してください。
ウェブインタフェース
このアプリケーションでは、TINIで動作するオーディオプログラムのインタフェースとしてウェブページを使用しています。ウェブページ上のフォームは、TINIm400の追加フラッシュに格納されているオーディオメッセージのリストを含んでいます。別のアプリケーションでは、ネットワーク経由でのオーディオメッセージの送信や、データベースからオーディオメッセージを取り出すことを選択しています。
図3 は、TINIが提供するウェブページを示しています。インデックスページに加えて、3つの画像も表示されます。ページの左側の画像は、ユーザがメッセージを選択して再生することができるフォームです。[PLAY IT]ボタンをクリックすると、POST HTTPメッセージがTINIに送信され、PlayPostedAudioというクラスによって処理されてこのHTMLの一部に表示されるようになります。
<FORM METHOD="POST" ACTION="PlayPostedAudio">
図3. TINIから提供されるオーディオアプリケーションウェブサイト
オーディオメッセージの事前生成
このアプリケーションには、TINIm400の追加フラッシュに事前生成されたオーディオメッセージを格納する処理も含まれています。これらのオーディオサンプルを簡単にロードして整理できるようにするため、JavaKitアプリケーションによりロードすることができ、複数のWAVファイルを1つのTBINファイルに変換するアプリケーションを作成しました。
TBINフォーマット
DS80C400のブートストラップローダは、HEXとTBINフォーマットのメッセージをロードする方法を理解しています。ただし、TBINはHEXと比べて2倍以上高速であることから、通常はTBINファイルをロードします。
TBINファイルは、複数のTBINレコードで構成されていて、24ビットの開始アドレス、16ビット長、最大64Kのデータ、及びCRC-16で構成されています。16ビットフィールドの長さは、データ長から1を差し引いたもので、64Kブロックのデータを可能としています。したがって、長さ0のTBINレコードは、存在しません。図4 は、TBINファイルのフォーマットを示しています。TBINファイルは、複数のTBINレコードを含んでいる必要はありません。TBINファイルは、1つ以上のTBINレコードを含んでいます。
図4. TBINファイルフォーマット
フラッシュに格納されたオーディオデータのデータフォーマット
TBINフォーマットの範囲内で、アプリケーションが迅速に処理することが容易なようにオーディオデータをフォーマットする必要があります。ここでのアプリケーションは、11kHzでモノラルの16ビットオーディオサンプルを再生するようハードのコード化がされています。これは、音声オーディオには十分な品質です。ウェブインタフェースは、再生する必要のあるオーディオサンプルのインデックスが含まれたオーディオアプリケーションを提供します。インデックス番号を開始アドレスと長さに変換することができる簡単なテーブルが必要です。また、インデックスが有効かどうかを特定することができると便利です。選択したプログラム構造は、以下のとおりです。
u2 Number of audio samples in this archive (msb, lsb)
Number_of_audio_samples address & length
{
u3 starting address of this audio sample (xsb, msb, lsb)
u3 length of the audio sample (xsb, msb, lsb)
}
Number_of_audio_samples audio data
{
[length * 2 bytes] audio data
}
この構造で報告される長さは、16ビットサンプルの数またはオーディオサンプルのバイト数の半分です。この構造では、テーブルの開始アドレスを知っている限り、オーディオデータの場所と再生する量を迅速かつ容易に理解することができます。
このアプリケーション5 のソースには、Wav2TBINというJavaアプリケーションが含まれており、複数のWAVファイルをこのアプリケーションに必要なフォーマットに変換することができます。WAVファイルは多くの場合、チャネル数、チャネル当りのバイト数、及びサンプルレートの、数値が異なるオーディオデータである点に注意してください。Wav2TBINアプリケーションは、より一般的なフォーマットのもの(例:44.1kHzで16ビットステレオ)を処理しますが、可能なフォーマットすべてを処理することはできない場合があります。
オーディオンアプリケーション
TINIで動作するアプリケーションは、2つのJavaクラスとネイティブライブラリで構成されています。public static void main(String[ ])を実装するJavaクラスは、HTTPAudioServerと呼ばれます。主な機能は、ネイティブライブラリのロード及びHTTPサーバの起動です。
2番目のJavaクラスは、PlayPostedAudioと呼ばれ、ウェブインタフェースがPOSTメッセージを生成すると、ダイナミックに呼び出されます。このクラスは、ネイティブライブラリに大きく依存しており、フラッシュに格納されているオーディオデータとの高度なインタフェースを備えています。以下に示すPlayPostedAudio.javaの各行は、ネイティブライブラリに実装された関数を定義しています。
// how many canned audio messages do we have in flash?
public static native int getNumberOfAudios(int address);
// get the address of the indexed audio record
public static native int getAudioAddress(int address, int index);
// get the length of the indexed audio record
public static native int getAudioLength(int address, int index);
// start playing the audio file at 'address' for 'length' bytes
public static native int startAudio(int address, int length);
// check to see if anything is playing right now
public static native boolean isAudioPlaying();
PlayPostedAudioクラスは、POSTデータのインデックスを解析した後、インデックスの有効性を検査します。要求されたインデックスが無効の場合、エラーを報告するウェブページを生成します。
int num_files = getNumberOfAudios(AUDIO_FLASH_ADDRESS);
if (cannedindex >= num_files)
{
strBuff.append("Sorry, there are only "+num_files+ " audio files in my archive
and you have selected to play number "+cannedindex);
strBuff.append(" That wasn't very nice of you. ");
}
インデックスが有効であれば、次にオーディオサンプルが現在再生中でないことを確認します。
if (isAudioPlaying())
{
strBuff.append("Sorry, but there is currently audio playing. ");
strBuff.append("It would be rude of you to go now. Wait your turn. ");
}
再生中でなければ、オーディオサンプルの再生を開始します。
int audioaddress = getAudioAddress(AUDIO_FLASH_ADDRESS, cannedindex);
int audiolength = getAudioLength(AUDIO_FLASH_ADDRESS, cannedindex);
startAudio(audioaddress, audiolength);
この時点で、ネイティブライブラリがオーディオの再生を引き継ぎ、JavaアプリケーションはHTTP要求のサービスに戻ります。
ネイティブライブラリ
ネイティブライブラリは、タイマ3 (TINI OSがこのタイマを使用しない場合)を使用して約11kHzで割り込みを生成します。ライブラリの初期化時に(audioplayer_lnit)、割り込みハンドラをインストールする必要があります。また、タイマ3を最優先割り込みにして11kHz割り込みのスキューを低減します。この時点で、タイマ3の割り込みを明らかにディセーブルにすることに注意してください。再生するオーディオサンプルがある場合にのみタイマ3の割り込みをイネーブルにします。オーディオサンプルが終了する時点で、タイマ割り込みをディセーブルにします。この方法を使うと、割り込みサービスルーチンが再生するオーディオの有無を把握する必要がなくなります。割り込みルーチンは、このアプリケーションにおける動作のクリティカルパスになるため、可能な限り簡潔に保つ必要があります。
ネイティブライブラリで、もう1つの興味深い関数といえるのがNative_startAudioです。この関数は、入力として開始アドレスと再生するオーディオサンプルの数を受け取ります。オーディオデータを再生する際に、割り込みサービスルーチンがこれらの値にアクセスして変更することのできる場所が必要です。インダイレクトがこの目的のための最速アクセスを達成できるため、このアプリケーションではF0h~F5hのインダイレクトを使用しています。実行している他のアプリケーションがこれらのインダイレクトを使用しない限り、このインダイレクトがデータを安全に格納できる場所となります。この関数は終了前にタイマ3の割り込みをイネーブルにし、タイマ3をイネーブルにして動作させます。
この時点で、JavaアプリケーションはHTTP要求のサービスに戻りますが、タイマ割り込みは動作しており、割り込みサービスルーチンは1秒当り約11,000回、起動する必要があります。タイマ3のISRは、最初にインダイレクトRAMからポインタを受け取ります。このポインタは、次に再生するオーディオサンプルを示しています。タイマのカウンタを再ロードし、タイマ割り込みをクリアしてから、2バイトのサンプルを読み取ります。オーディオサンプルの先頭バイトの補数をとることに留意してください。WAVファイルのオーディオデータは符号付きであるため、DAC用の符号なしのデータに変換する必要があります。数学的には、8000hをオーディオサンプルに加算します(最大16ビットの値の半分)。先頭ビットの補数は、同じ動作を実行します。
次に、オーディオサンプルをbit bangしてDACに出力します。このために、DS80C400のシリアルポートのモード0 (RX及びTX端子の同期クロックとデータ)を使用することを強くお薦めします。ただし、変更されていないTINIm400モジュールとTINIs400ソケットでは、容易に利用できるレベルシフトされていないシリアル端子はありません。
オーディオサンプルをbit bangした後、新しいデータポインタの値をインダイレクトRAMに格納し、残りの長さをデクリメントしてインダイレクトRAMに格納します。利用可能なデータがなければ、タイマ割り込みをディセーブルにし、タイマを停止します。
生成と実行
ネイティブライブラリを生成するには、あらゆるTINIファームウェアディストリビューション6 に含まれている標準インクルードファイル(tini_400.inc、ds80c400.inc、tinimacro.inc、及びapiequ.inc)が必要です。これらのファイルは、ファームウェアディストリビューションのnative/libディレクトリにあります。また、プログラムマクロとa390 (マクロプリプロセッサとアセンブラ)が必要です。これらは、ファームウェアディストリビューションのnative/binディレクトリにあります。
ネイティブライブラリを生成するには、以下のコマンドを使用します。
macro audioplayer.a51
a390 -f 1.12 -p 400 -l audioplayer.mpp
一度、ネイティブライブラリ(audioplayer.tlibと呼ぶ)が構築されれば、アプリケーションの全体を構築することができます。
# compile the Java classes
javac -bootclasspath c:\tini1.12\bin\tiniclasses.jar
-classpath c:\tini1.12\bin\modules.jar
HTTPAudioServer.java PlayPostedAudio.java
# build the .tini file, including the native library
java BuildDependency -n audioplayer.tlib -f HTTPAudioServer.class
-f PlayPostedAudio.class -o server.tini
-d c:\tini1.12\bin\tini.db -add HTTPSERVER
-p c:\tini1.12\bin\modules -x
c:\tini\tini1.12\bin\owapi_dep.txt
JavaKitを使用してすでにオーディオデータをロードしていると仮定すると、アプリケーションファイルのserver.tini、ウェブページのindex.html、及び画像のds80c400.gif、logo.gif、micro4.gifをTINIにFTPする必要があります。アプリケーションを実行するには、以下のコマンドを実行するだけです。
TINI> java server.tini
このコマンドを実行するには、TINIのIPアドレスを設定しておく必要があります。TINIのセットアップを開始する際には、アプリケーションノート「Getting Started with the TINIm400 Verification Module」 が役立ちます。
このアプリケーションは、TINIファームウェア1.12で開発しましたが、1.1xバージョン以降のファームウェアであれば動作するはずです。
結論
このアプリケーションノートは、ネットワーク化されたパブリックアドレスシステムまたは類似のアプリケーションのための出発点として役立つものです。この出発点からさまざまな方向へと、実際の商用アプリケーションを展開することができます。たとえば、マイクロフォンを用意して短いオーディオメッセージを記録し、これらのメッセージをすべてのネットワークノードにブロードキャストして再生することができます。または、対象を絞って特定のノードだけがメッセージを受信するようにできます。メッセージが店舗のエレクトロニクス部門向けであれば、すべての部門にブロードキャストする必要はありません。また、ネットワークノード間でのインスタント通信が可能になる洗練されたインターコムを構築することもできます。TINIによって強力で柔軟性の高いプラットフォームが構築され、上記のプロジェクトだけでなく、さらに高度なプロジェクトも実現可能となります。
参考資料
App Note 609: Internet Speaker with the DS80C400 Silicon Software (English only)
MAX542情報についてはjapan.maxim-ic.com/quick_view2.cfm/qv_pk/1419 を参照。
TINIs400ソケットの回路図についてはhttp://files.dalsemi.com/tini/reference_designs/TINIm400/TINIs400b.pdf を参照。
http://files.dalsemi.com/tini/reference_designs/netspeaker/networkspeaker.pdf の4ページ目の回路図。
このアプリケーションノートのソースコードについてはhttp://files.dalsemi.com/tini/appnotes/m400_audio/audiodemo_tinim400.zip を参照。
TINIファームウェアについてはhttp://files.dalsemi.com/tini/index.html (English only)を参照。
JavaはSun Microsystems, Inc.の商標です。
TINIはMaxim Integrated Products, Inc.の登録商標です。
関連製品
APP 3266: Jan 26, 2005
自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。
フィードバックをお寄せください。 内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。 —マキシムはお客様からいただく訂正、提案を元に改善していきます。
このページを評価し、フィードバックを送信する。