CODECへの出力に続いて、CODECからの入力についてもI2SのDMA対応を行いました。仕組みは出力の場合と基本的に同じなので、説明省略します。ただし、追加でもうひとつ対処した問題があります。それが、CODECとUSBのクロックの同期です。この問題も、放置したままになっていたので。。
これまで、CODECの動作クロックにはCODECモジュール上に載っている12MHzのクリスタルを使用していました。これを使うのが作業的には一番簡単だったからです。実用上も音楽プレーヤとして使っている場合には、これで何の問題もありません。ところが、FMラジオとして使って、USBスピーカへ出力する場合には問題が生じます。なぜなら、CODECがFMチューナからのアナログ信号をデジタル化する作業は、CODEC上の12MHzクリスタルをもとにして行われるのに対して、USBスピーカへの出力はLPC2388基板上のクリスタルをもとにして生成されたクロックを用いておこなわれるからです。両者が完全に同一周波数になっていれば問題ありませんが、個別のクリスタルがもとになっているのですから、そうはなりません。
実際にFM放送を聞いていると、ちゃんとキレイに聞こえていることもありますが、しばらくすると次第に音がかすれてきて、まるでチューニングがずれたかのように聞こえたりします。そして、しばらくするとまたキレイに聞こえるようになったりします。CODECとUSBの双方のクロックが互いにゆらぐので、こんな症状が発生するのでしょう。普段はヘッドフォンで聞いていることの方が多いので、USBスピーカ出力で問題があることはわかっていたのですが、放置したままになっていました。
問題の原因はCODECとUSBが違うクロックで動いていることですので、同じクロックを使って同期がとれれば、問題は解決できるはずです。そこで、↓のようにLPC2388とCODECの接続を変更しました。
CODECモジュールでは、MCKをモジュール上のクリスタルではなく、外部から入力することができるようになっているので、これを使います。LPC2388は72MHzで動作していますので、それを3分周した24MHzでタイマのMAT出力を反転させてやることで、12MHz出力を作りました。これで、きれいに問題解決できました。
これまで、CODECの動作クロックにはCODECモジュール上に載っている12MHzのクリスタルを使用していました。これを使うのが作業的には一番簡単だったからです。実用上も音楽プレーヤとして使っている場合には、これで何の問題もありません。ところが、FMラジオとして使って、USBスピーカへ出力する場合には問題が生じます。なぜなら、CODECがFMチューナからのアナログ信号をデジタル化する作業は、CODEC上の12MHzクリスタルをもとにして行われるのに対して、USBスピーカへの出力はLPC2388基板上のクリスタルをもとにして生成されたクロックを用いておこなわれるからです。両者が完全に同一周波数になっていれば問題ありませんが、個別のクリスタルがもとになっているのですから、そうはなりません。
実際にFM放送を聞いていると、ちゃんとキレイに聞こえていることもありますが、しばらくすると次第に音がかすれてきて、まるでチューニングがずれたかのように聞こえたりします。そして、しばらくするとまたキレイに聞こえるようになったりします。CODECとUSBの双方のクロックが互いにゆらぐので、こんな症状が発生するのでしょう。普段はヘッドフォンで聞いていることの方が多いので、USBスピーカ出力で問題があることはわかっていたのですが、放置したままになっていました。
問題の原因はCODECとUSBが違うクロックで動いていることですので、同じクロックを使って同期がとれれば、問題は解決できるはずです。そこで、↓のようにLPC2388とCODECの接続を変更しました。
CODECモジュールでは、MCKをモジュール上のクリスタルではなく、外部から入力することができるようになっているので、これを使います。LPC2388は72MHzで動作していますので、それを3分周した24MHzでタイマのMAT出力を反転させてやることで、12MHz出力を作りました。これで、きれいに問題解決できました。