ここではソフトウェアの作成過程を紹介します。今回の製作では、プログラムの動作を USB bus 経由で minitor しながらデバッグします。まず、USB bus に data 転送できるプログラムを作成します。このプログラムは、Cypress から提供されている Sample を使用できます。
この Sample には、USB Descriptor などの data も含まれているので、ほとんど copy だけで動くものができてしまいます。これにデバッグに必要な data 転送機能を追加します。EZ-USB には便利な機能として、AUTODATA register と EndPoint の Pair-ring 機能があり、インターラプト転送を使用して最大64 byte data をホストPC に転送することが簡単にできます。
インタラプト転送を起動するためのホストPC用プログラムは、インターフェース増刊"USBハード&ソフト開発のすべて"に収録されている汎用USBドライバとバルク転送テストプログラム(Visual C++用)をインターラプト転送用に修正したものを使用しています。
USB bus 上の data は、BUS HOUND という便利なツールを使用してキャプチャします。このツールは free ではありませんが、USB 以外の data もキャプチャできる便利なツールです。この製作では、CF メモリの data dump などで役に立ちました。
これでプログラムのデバッグが簡単にできるようになりましたが、EZ-USB のメモリサイズは 8KByte しかないのと、USB 処理プログラムがメモリを消費しているため、一度に大きなプログラムをコンパイルするとメモリオーバーで実行できなくなります。
このため、デバッグは下記のような機能別に行い、最後に一つにまとめることになります。
この中で、Audio data read/write + CF メモリ read/write の部分が録音/再生を実行するサンプリングループになります。ここでは、CF メモリに read/write しながら、高速サンプリングを実行するために、簡単なテクニックを使います。
CF メモリは、コマンドを発行して sector 単位に read/write を実行しており、コマンド発行から実行終了までにかかる時間はサンプリングレートに比べて長く、実行終了を待つことはできません。このように時間のかかる処理と高速サンプリングを同時に実行するためには、時間のかかる処理をできるだけ細かい処理に分割して、state number を付けて逐次処理するようにプログラミングします。
この分割は、サンプリングレートの上限を決める重要な部分です。できるだけ細かく分割し、すぐにサンプリングループに戻るようにします。サンプリングは単純なポーリングです。Audio Frame Sync の切り替わりで read/write タイミングを検出して、次のタイミングまでに Audio data の read/write と CF メモリ read/write を終了させます。
サンプリングループにはもう一つ重要な機能が必要です。CF メモリの read/write には数 msec の時間がかかるため、Audio data を Buffering する必要があります。これには Ring Buffer を使い、サンプリングループ内の data の read/write は Ring Buffer を介して行います。この処理もできるだけ高速化することが重要です。
この製作では、22.05KHz サンプリングに対応するために、Ring Buffer を下位アドレスが 0x00 になるアドレスに配置して、Buffer size も 256 Byte にしてアドレス処理を簡単にしています。また、サンプリングループは、Inline-assembler によりできるだけ高速化しています。(256 Byte は、22.05KHz サンプリングの場合、約5.8msec のバッファ容量です。)
次の User inteface の機能は、サンプリングループの中で Push SW の状態を読み込み、SW が押されていればループから抜けて必要な処理を実行することです。SW の状態を読み込むタイミングは、CF コマンドの実行終了でループを抜けるように、CF コマンドの実行終了 state で行います。
User interface に必要な最初の機能は、録音/再生の開始と停止です。CF メモリの FAT16 に対応するためのデバッグを行いますが、プログラムサイズも大きくなってくるため未使用の部分をコメントアウトしてプログラムサイズを調整しながらの作業です。ある程度完成したところで USB 処理部分をすべて削除あるいはコメントアウトしてプログラムを一つにまとめます。
ここで一つにまとめた状態でのデバッグを如何するかも考えておく必要があります。この製作では 3個の LED があるので、これをモニタ出力としてデバッグします。デバッグは User interface の部分がメインです。PC から書き込んだ WAV file の Up/Down 再生や Repeat 再生などの機能追加を行いながら最終の仕様が完成しました。仕様には、4つの Push SW を使用して出来得るかぎりの機能を詰め込んでいます。仕様の詳細はここにあります。
最後に FAT16 File Syatem への対応について書いておきます。この製作では、LED 以外の表示機能がないため、ディレクトリは root のみで、最大ファイル数は FAT16 では 512 です。ファイル名の操作、ファイルの選択消去には対応しません。消去は一括消去のみ可能です。録音ファイルは、通常の操作で PC に転送できますが、ファイル名は"AUDIO***.WAV"(***は番号)になります。PC から転送した WAV ファイルの再生も可能ですが、使用している CF メモリの読み出し速度が遅い場合や連続したセクタに書き込まれていない場合には、正しく再生できません。個人的には Buffallo 128M/64M CF を推奨します。また、SanDisk は、22.05KHz の再生でノイズが出るので推奨しません。