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

PIC32MX のフラッシュに書き込む「プログラマ」ができたので、PIC32MX 上で走る自前の「プログラム」を書き始めました。
例によって、ディジタル・オーディオ関係の応用として、DAC や MMC/SD カード・スロット などを接続することを考えています。
検討した結果、下の回路図のように決めました。

DAC、UART については実際に配線しました。
PIC32MX では、周辺モジュールの入出力機能のピンへの割り当てが固定化されている信号と、PPS (Peripheral Pin Select) 機能によって割り当て先を複数のピンの中から選べる信号があります。
PIC32MX1XX/2XX シリースでは、2 ユニット実装されている SPI モジュールが I2S などのディジタル・オーディオ・インターフェースとしても動作可能で、その「ビット・クロック」となる SCK1/SCK2 はピン固定の信号となっています。
シリアル出力データ SDO1/SDO2、シリアル入力データ SDI1/SDI2、LRCK/WS 信号の SS1/SS2 については PPS で使用するピンを選択可能です。
上の回路図で SDIO1 のような表記になっているのは、SDI1 / SDO1 のいずれかが選択できることを示しています。
PIC32MX1XX/2XX には UART も 2 ユニット内蔵されており、上の回路図では PPS 割り当て可能な U1TX / U1RX / U2TX / U2RX も合わせて示してあります。
ピンの選択の基準として、外部クリスタルの接続端子や、数少ない AD 入力端子、ICSP 端子などにはその機能を優先して候補から外し、主に I/O ポートの機能しか持たない端子を SPI / UART 入出力端子に割り当てています。
ディジタル・オーディオのサンプリング周波数について検討した結果、16 ビットのノンオーバーサンプリング DAC (1 オーディオ・フレームが 32 ビット) に対しては、ひとつの外付け水晶振動子を用いて 48 kHz および 44.1 kHz の fs をサポートできることが分かり、実際にプログラムを組んで実測したところ、ジッタもなく実現できているようです。
USB モジュールを内蔵する PIC32MX2XX では、USB モジュールで必要とする 48 MHz クロックを得るために USB 用の PLL が内蔵されています。
システム用の PLL と合わせて 2 系統の PLL があるので、それぞれを 44.1 kHz 系と 48 kHz 系のサンプリング周波数を発生させるのに使います。
オシレータ部と SPI 部のブロック・ダイアグラムを下に示します。
実際には何箇所にも、信号のマルチプレクサが入っていますが、それらは省略しています。

源発振は、毎度おなじみの 12.096 MHz です。
USB PLL については、倍率は 24 倍固定で、入力分周比のみが設定可能ですが、REFCLK 出力用にフラクショナル・ディバイダが実装されているので、そこで細かい設定が可能です。
システム PLL では倍率 (FPLLMULT) は

  • 15 倍 = (3 * 5)
  • 16 倍 = (2 * 2 * 2 * 2)
  • 17 倍
  • 18 倍 = (2 * 3 * 3)
  • 19 倍
  • 20 倍 = (2 * 2 * 5)
  • 21 倍 = (3 * 7)
  • 24 倍 = (2 * 2 * 2 * 3)

しか選べませんが、21 倍に含まれる因数「7」により、12.096 MHz の源発振周波数が 44.1 kHz 系のサンプリング周波数発生に都合の良い値 (84.672 MHz) となります。
CPU クロック (SYSCLK) および周辺クロック (PBCLK) は、これを 1/2 にした 42.336 MHz となり、スペックの 40 MHz に対して約 5 % のオーバークロックとなります。
SPI モジュールでは、SPI クロックとして周辺クロック (PBCLK) を使うか、REFCLK を使うかを選択でき、PBCLK を使う場合が上のブロック図で下側の系統になります。
PBCLK は SPI モジュール内のボーレート・ジェネレータで 1/30 にされ、1.4112 MHz のビット・クロックとしてノンオーバーサンプリング DAC に供給されます。
サンプリング周波数は、1 オーディオ・フレーム 32 ビットなので、1/32 して 44.1 kHz となります。
ブロック図上側の 48 kHz 系統の説明については次回に回します。