PCからBULK転送によるインターフェース2010年5月号の付録SH-2A基板を使ったUSBオーディオの再生実験


先回
PCM2706を使ってUSB-I2S変換した後の信号をCQ出版社のインターフェース2010年5月号の付録SH-2A基板に入力して、DACで再生して音を聞く実験をしてみた。今回は、PCから直接オーディオデータをUSB接続によるバルク転送でSH-2A基板に送って、DAC再生する実験をしてみた。


仕組み
このSH-2Aマイコンは1Mバイトの内臓RAMを持っている。
PC側では、WAVファイルを読み込んで、2バイトデータのエンディアンを入れ替えて、バルク転送でSH-2Aの内臓RAMに送る。
再生する方は、SH-2Aでオーディオ再生専用の発振子(水晶発振子、CD再生の44.1KHzの256倍の周波数11.2896MHz 叉はCD再生の 44.1KHzの384倍の周波数16.9344MHz)を使って内臓RAMのデータをDACに送る。

sikumi

SH-2A基板にもともと付いているLEDは、バルク転送受信開始時に点灯し、262144(=65536 x 4)バイト受信完了後に、消灯する。


回路
CQ出版社のオリジナルのSH-2A基板を下図のように改造して、USB-I2S変化用のPCM2706回路 とDAC回路に接続してみた。回路は先回と同じ。PCM2706からの信号は未接続(SH-2AのソフトもPCM2706からの信号は未対応)で、その代わり、SH-2AをPCとUSBケーブルで接続する。 今回は、X4は16.9344MHzの水晶振動子を使用した。




ソフト
雑誌インターフェイス関連のサイトにあるサンプル・プログラム sh7264_usb_function_sample.zip を元に、
①プログラムサイズを小さくするため、USB機能に特化。 SIFや文字変換は無しにした。
②コメント文(//...)にされていたUSBバッファのDMA転送の部分を使えるようにもとに戻した。もともと、CPU転送とDMA転送の両対応できるように書かれているみたいであるが、サイズ小さくするためか、CPU転送のみになっていた。
③DAC出力のためのSSIの設定とDMACの設定を追加した。
④HEWで、大容量RAMを使うためのBのセッション変更と、ROM化のための設定変更。
⑤CDCクラスの設定の中で、STOP BITが0のときは動作待機。1以上で動作中。
などの修正追加をしたものである。

PC側のWAVファイルを1つ読み込んでBULK転送するソフトを作成するにあたっては、
汎用USBドライバー libusb-win32-bin-1.2.6.0 を使わさせて頂いた。
SH-2A基板のPIDとVIDはそのままなので、別途、ROM化したSH-2A基板をPCに接続したときに、標準ドライバーではなく、 libusb-win32 のドライバーの方を認識するように、PC側を設定する必要がある。 

PCからSH-2A基板に262144バイト転送するための時間は
USB2のハイスピードだと、50mS程度、 USB1.1のフルスピードだと、その10倍ぐらいの時間がかかるようだ。
下図中の len0=1: 1 は、1バイト受信で内臓RAMのData0[1]の方に書き込みしていることを示す。
SH-2Aの内臓RAMでは約2秒間くらのデータをプールできる。つまり、PCの再生データは2秒くらい遅れて再生される。また、サンプリン グ周波数が44.1KHzの音楽に限定される。


参考用:bulk_test_src.zip 更新作成したソースファイル


(追記)少し手を加えたソフトも作ってみた。
bulk time
①PC側のソフト: バルク転送する箇所をスレッド動作にさせて、メニュー画面上の動きを軽くした。複数の曲を連続して再生できるようにした。  0(Stop)ボタンを押すとSTOP BITを0に設定する。応答が遅いので止まるまで少し待つこと。 
②SH-2A基板のソフト: バルク転送で規定のデータ数を受信できなかったときに、強制的に受信DMA転送を終了することにより、待ち状態になり続ける ことを避けるようにした。 致命的な問題が発生したときに音はどぎれるが、復帰はするようになった。(一部 復帰できない時もあり。) 叉、この異常発生時に、PCホスト側にバルク 転送で受信したデータ数を送るようにした。(PC側のソフトのShow sent data をONにすると表示する。)
③TDA1543を4倍速(サンプリング周波数176.4KHz)叉は2倍速(サンプリング周波数88.2KHz)で再生: PC上でサンプリングレート コンバーターソフトを使って、4倍叉は2倍のデータを作って、SH-2A基板にバルク転送で送りこむもの。データ量が増えるためUSBのハイスピードでな いと追いつかず、転送エラーが発生する確率も増えてしまうのだが、試しに作ってみた。 4倍速にすると少し音質が改善したように聞こえる。 設定の仕方 は、一度、STOP BITを0に設定して動作待機にさせてから、14(4倍)または 12(2倍)または 11(1倍)を(14、12、11のボタンを使って)STOP BITとして再設定する。SSIの設定切 り替え時の処理箇所のソフトがちゃんと実装されていないので、左右のチャンネルが反転することがあるかもしれない。
④もしも、AUDIO CLKに外部から12.288MHzの信号を加えた場合には、サンプリング周波数48KHzにも切り替えて動作するようにした。サンプリング周波数を48KHzに切り替えるためには、一度、STOP BITを0に設定して動作待機にさせてから、15(4倍)または 13(2倍)または 10(1倍)をSTOP BITとして再設定する。
⑤PC側のソフト: 24bitのWAVファイルの読み込みにも対応。 世の中には、いろいろな形式があるようなので正常に読み込めないものもあるだろ う。 SH-2Aからの受信信号が従来どうり1叉は2のとき、3バイトの24ビットデータの頭の16bit分を送る。 また新たに、受信信号が2叉は3のとき は、WAVファイルのデータはもともとはCH1の次にCH2の順番に並んでいるのだが、 CH1用の DAC とCH2用 DACの2個のDAC駆動に便利なように、 順番を入れ替 えてCH1だけのかたまりとCH2だけのかたまりにして24bit分(元が16ビットのときはお尻に8ビットの零データを追加して)送るようにした。

参考用2: bulk_test_src_2.zip 更新作成したソースその2

叉、FFT OVERLAP ADD法による4倍のオーバーサンプリング用デジタルフィルタも作ってみた。



⑦SH-2A基板からPCへのバルク転送通信が上手く行かないときがある。そこで、SH-2AのRAM(2面)の切り替り時のPC側からWAVデータを送 る開始制御を、バルク転送方式はあきらめて、FLOW制御設定のためのデータ領域にRAMの切り替え情報を書いて、PC側からコントロール転送のクラスリクエストの GetLineCodingを使ってSH-2A側の状態を読み取って、開始制御する方法に変更してみた。(過去作ったものとの互換性がなくなってしまった が。PC側からSH-2A側へのWAVデータはバルク転送で送るのは変わらない。)

参考用3: bulk_test_src_3.zip 更新作成したソースその3


致命的な問題
 ①PCからSH-2A基板へのバルク転送中に、バルク転送が途中で失敗して、待ち状態になってしまう症状が発生する。 これは、何らかの原因で、規定されたデータ数(262144バイト)の一部叉は全部を受け取れなかったときに発生する。

②上記①の全部のデータが受信できないで、ホスト側は全部送信したつもりでもSH-2A側の受信データ数が0になるのは、 SH-2AからホストPCへ USB転送した後、SH-2Aが受信開始まで、ホストPC側が間をあけてやると改善される傾向にあるようだが、まだ、発生するときがある。

③WAVファイル再生中に、PC側のソフトが強制終了する症状が発生する。メモリーのアクセス違反?など何らかの問題がありそうだ。 (PC側ソフトのスレッド間のメモリーアクセス問題)





警告
SH-2A基板をつかって接続する場合は、電気的なことをよく理解した上でお 使いください。そうしないと、PCやその基板と接続した相手などを破壊する危険があります。
供給元が違うVBUS+5V同士を接続すると、電源が喧嘩をして破壊する恐れがあります。供給元が違う電源は一緒に接続しないように。

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