インターフェース付録マイコン基板のUSB HOST機能を使った音楽の再生の検討

先回は、PCから音楽データをUSB接続によるバルク転送でSH-2A基板に送って、DAC再生する実験をしてみた。今回は、PCなしで、マイコンのUSB HOST機能を使って USBメモリーから直接 音楽再生できないかを検討してみた。


仕組み
方法としては、
 ①インターフェイス2012年6月付属FM3マイコンのUSB HOSTプログラムを改造する
 ②SH-2A基板にUSB HOST機能やMSCクラスやFATなどソフトを実装する。 SH-2A基板を使っての再生実験はこちらを参照。
が考えられる。 ②はハード的には良いが、ソフト的な開発?の負担が大きいそうなので、まずは、①のFMマイコンの記事をもとにできないかどうかを検討してみた。

何人かの方がSDカードの音楽データを再生する方法を発表されている。SH-2A基板で実験された方によると、ネイティブモードではないSPI接続のときの動作速度は 553KByte/sec, 4.42Mbit/sec 程度とのこと。48KHzサンプリングの24ビットの4倍速データの扱おうとすると 1.1MByte/sec の計算となり、読み込み速度が不足してしまう。


①インターフェイス2012年6月号付録FM3マイコンのUSB HOSTプログラムを改造する方法

雑誌インターフェイス2012年7月号付録DVDのUSB HOSTプログラム, fm3_sample_usbhost.20120313 をコンパイル&実行できる環境を整えてみた。 MakefileのLinker flags の LINC +=の4.4.1を4.5.2に直さないと、libgcc.aが存在しないというエラーになってしまう。

このプログラムで使用しているファイル アクセス ライブラリー MDF_minimum.lib arm  MDFのかわりにFatFs動くようにしてみた。インターフェイスのSDカードによるMP3再生の記事の中のFatFs読み出しのみ、セクター512バイト、ロング名は未使用の設定を参考にさせていただいた。

手 持ちのUSBメモリー(1G)を、フォーマット コマンドの format  ドライブ名  /FS:32  /A:512 で512バイトのFAT32で再フォーマットしたら、USBメモリーの中のWAVデータを再生することができた。UBSメモリーのフォー マットが非対応フォーマットであると、エラーコードを表示させるようにプログラムの追加変更した場合、 エラーコード -910が出て、音は出ない。ちなみに、debug_printfの%dで マイナスの表示をさせるためにはvsnprintf.c のxput_nのバグ(ここで符号なし整数で宣言して、不要なlong longの64ビットを使っている)の変更が必要のようだ。
 音の出力は片チャンネルのみのPWM出力の仕様になっているが、オリジナルのソフトはLとRの両方のチャンネル出力にも対応していて、変更を加えると両チャンネル出力するようになった。 叉、タイマー周期を決める割り算の精度?を変更してみた。

基板単独でも操作できるように JoyStickの代わりに 基板にキー(ボタン)を2個つけて、出力する音質改善のため、pcm1723さんのCQ-FRK-FM3基板用FM音源プログラムを参考にしながら外部DACとしてTDA1543つなげるようにしてみた。DACからの音が、正常な音とノイズだらけの音と交互に繰り返すの問題に遭遇したので、試しに、バッファ容量を上げてみたが、正常に出力できる時間は以前よりは長くなったが。
また、オリジナルままであるとRAM容量が64K版の506の設定になっているので、FM3基板の128KのRAMをフルに使うため、Makefileの 中のリンクフラグのLDFLAGSをmb9bf506.ldから mb9bf618.ldに変更した。これで、内臓RAMの1fff0000の零番からマップされるようになった。

 さて、残念ながらMB9BF618TのUSB通信速度は、フルスピード(12Mbps)までのようだ。実際に、44100Hzの2倍の88200Hzの WAVファイルを再生させると、ノイズだらけになってしまう。処理速度が追いていないようだ。48000HzのWAV再生だと WAV_RET_BUF_EMPTYが発生するときがあり、データ供給が再生側に追いついていないことがわかる。叉、USBメモリーから取り込んだWAV データを一旦  FM3のメモリーにプールして 別のUSB機器に 容量384Kのデータを 一気に バルク 転送するには 内臓RAM容量(128K)では不足していることに気づいた。このFM3基板では当初の目的にはそぐわないことが判明した。


FM3基板に追加した回路図
fm3 board circuit

更に以下の実験もしてみた。

MP3デコーダーのlibmadもリンクして出力するようにしてみた。もともと、fm3_sample_usbhost.20120313と libmadでは制御の考え方が違うため、うまくマージできない。なんとか、切り貼りして作ってみた。 しかし、サンプリング周波数44100Hzのビット レート64KのMP3ファイルならば、再生可能(処理速度は間に合っている)であるが、普段使っているビットレート128Kだと再生要求に対して処理速度 が追いつかず音が抜けしてしまう問題があることが分かった。USBメモリーからデータ読み込み用の入力バッファや出力用のリングバッファの容量を増やして みたが、 ビットレート128Kの処理にはもう一歩不足のようだ。外部DACのTDA1543へI2Sもどきの信号を出力するためタイマーを2倍速でまわしているこ とが処理不足となっている原因のようだ。追加した外部DACの処理を止めると128Kでも再生可能となった。また、decode()を呼ぶとプログラムが 暴走して制御不能になってしまう、メモリー破壊も起きているようだ。

PHYの接続実験:
オプティマイズの100BASEのPHYモジュールのキットを作ってFM3基板とRMII接続でつなぎ、インサーネットの接続実験をしてみた。ソフトは、雑誌インター フェイス2012年7月号(fm3_sample_ether)と9月号(nonos_uip_webserver)をこのモジュールに使われている PHY ICのDP83848C用に変更したものを使っている。雑誌インターフェイスで紹介されているPHY ICとでは、PHYモジュールからの割り込みの論理が逆になっている。
50MHzの信号ラインがあるので、もしや動かないのではないかと危惧していたが(FM3基板とPHYモジュール基板の間はできるだけ短く配線した)、なんとなく動いているようである。サーバーの応答が遅いのが気にかかるが原因不明である。

uIP WebClientを利用して、WebサーバーからのデータをGet受信できるようにしてみた。サーバーからの(ヘッダ部分を含む)全データが欲しかったので、uIPのオリジナルにあったヘッダ解析部分はパスすることにした。
下図は、www yahoo comの頭の30文字を表示させたときの様子。

webcleint-uip

この例では、485バイトごとに回っている。データの受信速度は早くはない。





参考となる資料



警告
マイコン基板をつかって接続する場合は、電気的なことをよく理解した上でお 使いください。そうしないと、PCやその基板と接続した相手などを破壊する危険があります。
供給元が違うVBUS+5V同士を接続すると、電源が喧嘩をして破壊する恐れがあります。供給元が違う電源は一緒に接続しないように。
PHYのモジュールの動作を保証するものではありません。
WAV再生の動作は不安定な状態です。


免責
(1)回路図やプログラムやデータの使用により、使用者に損失が生じたとしても、その責任 を負いません。
(2)回路図やプログラムやデータにバグや欠陥があったとしても、修正や改良の義務を負い ません。