マイコン工作実験日記

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

録音/再生が動いた

2008-07-07 23:07:13 | W-SIM
しばらく進展のない状態でしたが、ようやくとDataFlashを使っての通話相手音声の録音と再生が動くようになりました。

録音/再生で悩んでいたのは、次の2つの問題でした。
  1. 再生時にCODECに供給するクロックをどう作るか?
  2. 録音した音声を再生してみると、音が割れている。何が原因か?

まずはクロックの問題です。以前の記事にも書いたように、再生時にはCODECのBCLKとBSYNC信号をMCUから供給してやる必要があります。SSCの持つTK/TFピンを使ってこれらの信号を供給することができるのですが、この信号をどうやって作るかです。BCLKとBSYNCは同期しており、BSYNCは8000Hzの周期を持っている必要があります。実現方法として調べたのは次の2つの方式でした。
  1. 2.048MHzをタイマ0を使って4分周して作った512KHzをBCLKとしてTKピンにつなぐ。TKピンは入力に設定。タイマ2を使って、2.048MHzをカウントして8000Hz周期のBSYNCを作成して、TFピンにつなぐ。TFピンは入力に設定。
  2. 2.048MHzをタイマ0を使って4分周して作った512KHzをBCLKとしてTKピンにつなぐ。TKピンは入力に設定。SSCでTKクロックを数えてTFピンより8000Hzを出力。TFピンは出力に設定。

どちらもBCLKとして512Kを使うところは同じで、BSYNCの作り方が違うだけです。最初に1の方式で基本動作が確認できたので、次に2の方式を試してみました。1の方式ではタイマを2つ使うのに対して、2の方式では1つしか使わないので好ましいのですが、この方法だとちゃんと音が出てくれませんでした。原因の究明ができていないのですが、SSCが出力するデータのタイミングがCODECの受信タイミングと合致していないようです。SSCの設定を変更することで解決できるかもしれないのですが、とりあえず1の方式に戻して使っています。

BCLKは512KHzを使っていますが、ML7041 CODECのデータシートによるとMCKと同じ2.048MHzを使ってもかまわないようです。今のところ他にタイマを使う用途がないので、タイマを2つ使ってしまっていても問題はないのですが、もったいなくなったら、512KHzの生成はサボることにしようかと思います。

2つ目の「音が割れる」問題は、当初割り込み発生周期に処理が間に合っていないのかと想像して調査して時間を費やしてしまいました。試験データを書き込み/読み出して確認してみたところ、読み出しのコマンドを送出後、データの読み出し前に1バイト分のダミークロックを送信する必要があるのを見落としていただけのことでした。これが原因で、読み出した512バイトのデータが1バイト分ずれてしまい、先頭の1バイトが常に0xffになってしまっていたのでした。

DataFlashへの録音と再生の基本処理はできたのですが、まだ、タッチパネルからのユーザインタフェースが無いので、そいつを作らなくてはなりません。