PIC32MX220F032B (2) -- SPI/I2S クロックの検討 (2)

USB モジュール内蔵の PIC32MX2XX シリーズで、ディジタル・オーディオ用の 48 kHz / 44.1 kHz サンプリング周波数に対応するビット・クロックを発生させるブロック図を下に再掲します。
このブロック図の上側の USB PLL の系統で 48 kHz 用クロックを発生させます。
当然、USB PLL 出力は 48 MHz とはならないので、USB モジュールは使えなくなります。

USB PLL 系統で選択可能なのは入力分周比 (UPLLIDIV) だけで、しかもコンフィギュレーション・ワードによる指定に限られ、実行時にレジスタを書き換えて変更することはできません。
これは USB モジュールのクロックは 48 MHz と決められているので、特に柔軟な設定ができる必要はないからです。
外部に接続する水晶振動子/クリスタル・オシレータの周波数が 4, 8, 12, 16, 20, 24, 40 MHz であれば USB モジュールを機能させることができます。
USB PLL 自体は細かい設定はできないのですが、マルチプレクサを介して接続できる REFCLK 出力回路には「フラクショナル・ディバイダ」が装備されていて、ここで小数値を含む分周比が設定できます。
USB PLL の出力周波数は、
12.096 [MHz] ÷ 3 × 24 = 96.768 [MHz]
となり、
96.768 [MHz] ÷ 63 ÷ 32 = 48 [kHz]
となるので、USB PLL 出力を 63 分周すると 48 kHz 用のビット・クロック 1.536 MHz を生成できます。
SPI モジュール内のボーレート・ジェネレータでは、偶数の分周比しか設定できず、最小値は「2」となります。
したがって、分周比 63 を得るには 63 = 31.5 × 2 を実現する必要があります。
この 31.5 の分周比は REFCLK 出力部で RODIV = 15 および ROTRIM = 384 と設定することによって実現できます。
小数分周比なのでジッタが現れそうな気がしますが、REFCLKO 出力から外部に出力し、オシロで観測したところ、ジッタはないように見えました。
もし、ここで 0.5 の分周比に起因する 2 クロック周期のジッタがあったとしても、ボーレート・ジェネレータ内での 2 分周によりジッタはなくなります。
SPI は 2 ユニット内蔵されているので両方使えば、上のブロック図のように、同時に 48 kHz サンプリングの出力と 44.1 kHz サンプリングの出力を得ることができます。
実際には 1 ユニットだけ使い、 48 kHz / 44.1 kHz を切り換えて使うことになりますが、その場合には SPI モジュールの MCLKSEL ビットを書き換えることになります。
このビットを変更するには SPI の動作をいったん停止させる必要があります。
PIC32MX1XX シリーズには USB モジュールは内蔵されていないので、当然 USB PLL も実装されていません。
その場合でも、システム PLL では ×24 の PLL 倍率が設定可能なので、上のブロック図の上側の系統のようにシステム PLL の設定を変更すれば 48 kHz サンプリングにも対応可能です。
しかし、システム・クロックの周波数自体を変更することになるので、

  • システム・クロックを PLL 出力以外に変更
  • システム PLL の倍率を ×24 に変更
  • REFCLK フラクショナル・ディバイダを設定
  • システム・クロックを PLL 出力に変更

という (時間のかかる) 手続きを踏む必要があります。