マイコン工作実験日記

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

32KクリスタルでUSBを動かす

2013-06-17 00:22:10 | SAM4
ABDACBからサイン波を出力した際のノイズが気になるので、クリスタルを変更してみようと思います。しかし、現在使用している12MHzのクリスタルはPLLを通してUSBの48MHzを作るのにも使っています。これまでのクロックの使い方はこんな感じです。

このままでクリスタルを24.576MHzに変更してしまうと、USBクロックが狂ってしまうので、別途48MHzを作る方法を考えねばなりません。SAM4LにはPLLとは別にDFLL (Digital Frequency Locked Loop)という機能が用意されており、既存のクロックを逓倍した周波数を生成することができます。仕様では8~150KHzのクロック源から、20~150MHzのクロックを生成できるようです。PLLと違ってdivierはありませんが、multiplierに設定する乗数を大きくできるので、低い周波数から高い周波数を作れるようです。そこで、32KHzクリスタルの出力から48Mhzを生成してUSBを動かしてみることにしました。具体的には、32768Hzを1465倍して48.00512MHzを作ります。


新しいクロック系統は上図のようになります。DFLLの入力クロックはGCLK0という約束になっているので、32KHzクリスタルの出力を加えるにはOSC32の出力をいったんGCCTRL0を通してやる必要があります。DFLL出力が48MHzになるので、GCCTRL7も素通しになりました。

最初は、DFLLがロックしなくてしばらく悩みましたが、DFLL0CONFのCALIBフィールドを誤って0にしてしまったのが原因でした。この部分を書き換えないようにレジスタを設定しないと、出力周波数によってはロックしなくなってしまうようです。こうして、無事32KHzからUSB 48MHzを生成して、動かすことに成功。CDCでコンソールアクセスに使ってるだけですが、問題無く使えています。FREQMを使って、各クロックの周波数を計ってみた結果がこちらです。

各クロックはFREQMを使って順番に測定していますが、測定値にはばらつきが生じます。DFLL0とGCLK7は同じになるべきですが、値が違うのはそのためです。

FREQMに関連して、ひとつ面白いことに気がついたのですが、次の記事ネタにすることにします。これで安心して、12MHzクロックの方を交換できます。近日中に秋月で24.576MHzを買ってこよう。

6月18日追記
44.1KHz系列で必要なクロックは 24.576MHzではなくて、22.5792MHzでした。データシートの数字を1段間違えて拾っていました。あぁ。。。これは秋月には無いみたい。