マイコン工作実験日記

Microcontroller を用いての工作、実験記録

LPC2388の I2C と I2Sを使う

2009-05-20 23:40:29 | MP3プレーヤ
MMcodec01をつなげるハードの準備(と、言ってもコネクタだけですが)ができたので、ソフトの作成です。MMcodec01に載っているTLV320AIC23Bを使うには、レジスタの設定に使用するI2CとPCMデータ出力に使用するI2Sのふたつのインタフェースのドライバを用意してやる必要があります。

まずはI2Cから。LPC2388のI2Cの使い方は、AVRとほぼ同じだったのですぐに理解できました。TLV320AIC23Bのレジスタへの書き込みは、16bitでレジスタ番号と書き込むデータを指定するのですが、レジスタ番号を7ビット、データを9ビットで指定します。ついつい、8ビットづつだと勝手に思い込んでしまい、しばらくハマッテいました。

いつもの手順だと、まずI2Cを動かしてレジスタの読み書きができることを確認して一安心するのですが、TLV320AIC23Bのレジスタは書き込み専用で読み出しができません。そこでI2Sマスターに設定した後、Sample Rate Controlレジスタを書き込んでクロックを生成させてみることで動作確認しました。Sample Rateを44.1Kに設定すると、BLCKから12MHz, LRCIN/LRCOUTから44.1KHzが出てくることが確認できて、一安心です。

続いてI2S。こちらは44.1KHzとか48KHzというクロックに同期してPCMデータを送出するインタフェースです。したがって、このレートに間に合うようにデータを次々と書き込んでやらねばなりません。割り込みで処理するにしてもこのペースはつらいので、LPC2388では8レベルのFIFOが用意されています。FIFOに溜められたデータが順次送出されていき、FIFOの残りが指定されたレベル以下に達すると割り込みをかけることができます。FIFOの残りレベル数もレジスタで確認できるので、割り込み処理ではFIFOがいっぱいになるまで送出データを書き込んでやります。送出するデータがなくなったら、割り込みを禁止して演奏終了となります。今回は、レベルが3になったら割り込みをかけるように設定してみました。

MP3デコーダとつなげてやって、再生実験です。本来であればMP3のデコード結果から検出したサンプリングデータに基づいてTLV320AIC23Bの設定をする必要があるのですが、今のところCDから取り込んだ固定曲データですので、44.1Kで決め打ちにしています。以下、実行の様子。最初のmp3コマンドは、前回と同じダミー再生です。その後、codec init によりTLV320AIC23Bを初期化。playコマンドでデコードの結果生成された16bit PCMをI2SでTLV320AIC23Bに送っています。



MMcodec01につなげたヘッドホンからきれいに音が出てきました。嬉しい! 再生時間も元データと同じ16秒程度になり、割り込み処理も問題なく間に合っているようです。