R8C SDカードを使ったWAVファイルの再生

以前にSDカードをSPI接続で読み書きするテストを行ったが、パフォーマンスの評価
を行うのに、WAV形式の音楽を再生するのが丁度良いと思い実験してみた。

事前の懸念事項として:
・SDカードを読み書きするSPIポートは、完全なソフトウェアー仕様なので、あまり
速度が出ない。
※UARTと共有になっている同期式シリアル変換を使えば、速度は改善するものと思う
が、シリアル通信が使えなくなる為、今回は見送った。
・パラレル⇔シリアル変換では、C++ コンパイラの最適化度合いが非常に大きなファクタ
ーを占める。

以上の点を考慮して、コンパイルされたアセンブリコードを眺めながら、ソースコードに
修正を加えたりしながら、色々実験した。

8ビット、ステレオで、11.025KHz(44.1KHzの 1/4)くらいならギリギリ再生できる事が
判った。
これには、11.025KHz でサンプリングループを回す割り込みや、PWM で変換する為の処理
も含まれる。

再生させてみると、多少ノイズが乗る、PWM レジスターの書き換えは割り込みを使って行
っているものの、何かノイズが乗る要因があるものと思われるが、原因を究明できなかっ
たので、とりあえず、この状態で公開する。

タイマーCのPWMはB、Cチャネルを使っている。
それぞれ、ポートP12、P13から出力される。
これを、単純なRCフィルター(C:0.1uF、R:2200)に通している。
ライン出力のGNDは、VCCとGNDの中点(470オームで分圧)にしている。

IMG_0758

現在の実装では、「OHAYODEL.WAV」ファイルを再生するようになっている。
※再生するWAVファイルは、8ビット、ステレオ、11.025KHzにしておく必要がある。
※フォーマットが違う場合、エラーを出力する。
※再生開始時や終了時などにポップノイズが発生する場合があるので、ボリュームに注意する事。

SD_WAV_play