マイコン工作実験日記

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

LPC2388とPCM信号 -- その1

2010-09-06 23:43:16 | W-SIM
LPC2388のSSPはショート・フレーム形式のPCM信号はサポートできますが、ロング・プレーム形式はサポートしていません。W-SIMのPCM信号を直接SSPにつないでしまった場合には、下図に示すようにSSPは1ビット遅れてデータを送受することになってしまいます。



SSPを使って正しく送受するためには、フレーム同期信号であるPCMSYNCが1クロック分早く出てくれればいいことになります。PCMSYNCの周期は48 PCMCLKなので、1クロック早くすることは47クロック遅らせることと同じです。1クロックだけならフリップ・フロップを使うという手もありますが、47クロックを数えるにはカウンタが必要です。そこでPWM1を使って希望する同期信号を生成することにします。

PWM1はPWMモードで使い、PCAP1.1につないだPCMCLKをカウントさせます。周期が48 PCLKですからカウント値の範囲を1~48とし、49になったら1にリセットするためにマッチレジスタMR0を49に設定しておき、MR0との一致でリセットする設定とします。さらにPCMSYNCをPCAP1.0につないでおき、この立ち上がりを検出してCR0でキャプチャしてやります。これで、クロック1から48までのどの位置でPCMSYNCが立ち上がったかがわかります。下図の例ではCR0にキャプチャされる値は、PCMSYNCのタイミングやPWMの動作により、3あるいは4のいずれかになるものと考えられますが、これは実験で確認することにします。



欲しい同期信号はキャプチャできた位置から1クロック早く立ち上がって、1クロック後に落ちてくれればいいいので、キャプチャができたら、CR0の値に基づいてMR5とMR6を設定して、PWM1.6の出力にはダブル・エッジモードを選択。MR5との一致でセット、MR6との一致でリセットするように設定してやります。このPWM1.6の出力をPCMSYNCの代わりとしてSPPに与えてやればいいわけです。



実際に実験するためには、音声データを送受信する仕掛けも必要です。今回は送信側だけを実験してみることとし、あらかじめ用意しておいた音声データを順次SSPへ送信していくこととします。送信データは、MR5との一致が生じた時点で割り込みを発生させて、そのタイミングでFIFOに書き込むこととしました。ホントはこのタイミングでは遅いわけですが、1/8000秒遅れるだけですので、気にしないことにします。

ちょっと説明が長くなってしまったので、実際に実験してみた様子と、その結果わかったことについては、また次回。