I2Cの割り込み化をしなければならないが・・、とりあえず、置いといてー
SDカードが読めるようになったので、MP3の再生を行いたい~
オーディオのコーディックICと言えば、VSxxxが思い浮かぶ、専用DSPと、デコーダー、エンコーダーのプログラムを内臓して、低消費電力で、非常に多くのフォーマットに対応している。
最近、秋月で、VS1063aが発売になった、結構最新のデバイスで、新規に新しいフォーマットに対応して、内部も、細かい所が色々とアップデートされている。
800円とちょっと高いが、I2S出力も可能なので(VS1053も可能)、今回は、このデバイスを使ってみたい。
RXマイコン100MHzでは、ソフトウェアーで、MP3のデコードは可能なようだけれど、処理負荷は大きく、他に、何も出来なくなってしまうと思うので、専用ICを使った、他にグラフィックスもやりたいし・・
そろそろ、端子をどのように使うか、戦略を立てないと駄目なようだー
SPIは、SDカードで1チャンネル、VS1063で1チャンネル占有する感じで、他にSPIのデバイスがあった場合は、考えないといけない・・
※SDカードとVS1063はシェア出来るのかもしれないが、動いてから、別途考える事にするとして・・・
他の重要なデバイスとしてグラフィックスコントローラーがある、これは、メモリーマップにアサインする予定なので、D0~D15、Ax、/CS、/RD、/WRなどを開ける必要があり、それらのポートは使わないで開けてある。
ピンアサインはとりあえずこんな感じだ・・
RX側 VS1063a側
(P26)MOSIB-A ---> SI
(P27)RSPCKB-A ---> SCLK
(P30)MISOB-A <--- SO
(P23) ---> /xCS
(P22) ---- /xDCS・BSYNC
(P47)IRQ15-B <--- DREQ
※他の接続は、参考回路を参照の事、VS1063aは、コアの電源として、1.8Vが必要なので、レギュレーターを別途使用する。
※クリスタルは、12~13MHzとなっていて、内部のPLLで、必要なクロックを得る事が出来るが、補正が必要無い、12.288MHzを使う事とした。
VS1063aは、0.5mmピッチの48ピン、LQFP-48フラットパッケージで、ちょっとだけハンダ付けが大変だ、フラックスと吸い取り線があれば、まぁ大抵大丈夫だが、変換基板にICを位置合わせするのが大変で、ここで失敗すると、取り返しが付かないので、慎重に作業する、レンズで拡大しながら、正確に位置を決め、二箇所程度にハンダを流して仮止めしてから、全部のピンをハンダ付けする、ショートしたら、吸い取り線で余分なハンダを吸い取る、出来たら全体を拡大して、ブリッジや、ハンダが足りない部分を慎重に見極めて、修正する。
VS1063aは、ピン数は多いけど、電源端子が多い、試作とは言え、AGND、DGND、3種類の電源(I/O、コア、アナログ)とパスコンを慎重に接続する。
※チップ部品が、場所をとらず、2.54mmの間隔に丁度はまると楽チンだww。
※I2Sを実験する予定なので、それらの端子は、個々にプルダウン抵抗を設けておいた。
端子を全部接続したら、早速テスト用ソフトのコーディング、SPIを使うので、前から懸案となっていた、デバイス関係を操作するC++ライブラリーの試作と実験を行った。
前にも書いたけど、C言語で、構造体にビットフィールドを宣言して、それによってデバイスをアクセスする方法は邪道、確か、言語規約的には、32ビット以外の挙動は保障されていなかったハズで、8や16ビットのアクセスによる動作は、処理系に依存するハズだ、それに、色々、不都合もある。
・エンディアンの違いを上手く吸収出来ない。
・シリアルのように複数チャネルあるデバイスでは、ドライバーを1チャネルだけ実装して、それを別チャネルでも等しく利用するのが難しい。
・リードオンリーのデバイスに書き込みを行えてしまう。
・最適化によっては、正しく無いコードが出来てしまう。(※これは rx-gcc のバグなのかもしれない)
「C++使ってるのだから、C++風に書きたい」と言うのが大きい。
で、色々考えて、C++の少ないスキルで、テンプレートを使って、作ってみたー、記述が冗長になっている部分はあるが、おおむね我慢できる範囲でまとまった。
※この話は、今度、別のブログで詳しく紹介したい、ソースコードがあるので、興味ある人は見てください。「rx62x_rspi.hpp」とかがそれです。
-----
さて、RSPI の操作をC++で出来るように記述して、とりあえずポーリングでVS1063aと通信する機能を実装して、VS1063a用ドライバーを作成した。
VSシリーズの解説では、放課後の電子工作さんが大変に詳しく、参考にさせてもらった。
通信が出来て、レジスターへの書き込み、読み出しが出来るようになったので、「テストモードの正弦波の発生」用ストリームを流してみたが、一向に正弦波を出力しない?
ハードを色々調べても、まずい部分は見つからず、どうしたもんかなぁーと悩むこと半日・・・、SDカードのテストもあるし、試しにMP3ファイルを流してみた、普通に鳴るではないか・・・
最終的にはI2S出力にD/Aコンバーターを付けて鳴らしたいので、あまり期待して無かったが、ヘッドホン出力も、それ程悪い訳でもなく、普通に聞ける~
まだ、ソフトが荒削りな部分が多く、参考程度に考えてもらいたいが、一応ソースコードを公開する。
ターミナルから、play xxx.mp3 とやれば再生する、多分、Ogg Vorbis、AAC も再生できるハズ。
それにしても、VS1063aは極めて簡単で、コンビニエンスなデバイスだ。