SH-2A 基板 (14)

おくればせながら、やっとインターフェース 2010 年 7 月号を買って来ました。
気になっていた SPDIF モジュールのオーバーサンプリングクロックの設定ですが、やはり 512 fs 以外の選択肢はないようです。
pp.102 のコラム 1 に、X4 に実装すべき水晶振動子の周波数について

  • サンプリング周波数 48 kHz ……… 24.5760 MHz
  • サンプリング周波数 44.1 kHz …… 22.5792 MHz
  • サンプリング周波数 32 kHz ……… 16.3840 MHz

のように明確に表記されています。
それと同時に、若松通商の SPDIF 拡張キットには水晶が付属することも書かれています。
3 種類とも付属するのかどうかは不明ですが、ともかく、これで SPDIF 拡張キットを買った人が途方に暮れる事態は避けられることになって、なによりです。
ベースボードの方には、オーバーサンプリング DAC である AK4321VF (旭化成マイクロエレクトロニクス) を実装しました。
これは、以前 PC 上で DVD を再生するために使っていた、ハードウェア MPEG2 デコーダPCI カードから取り外したものです。
オーバーサンプリング DAC としては、STM8S-Discovery で使った PCM1716E がすでにあるのですが、5V 電源に限定されるので、クリーンでない USB 5 V 電源ではノイズで悩まされる可能性が大きく、今回は 3.3 V 動作可能な AK4321VF を使うことにしました。
回路図を下に示します。

オーバーサンプリング DAC には、ディジタルフィルタの動作のためのマスタークロック (システムクロック) を供給しなければなりませんが、CQ-FRK-SH2A 基板では、ボード上に実装する水晶 X4 の発振出力はコネクタに引き出されていません。
大容量内蔵 RAM 640 KB 版の SH-2A では、オーディオ・クロック出力を PF12 あるいは PJ9 から出力する設定ができますが、CQ-FRK-SH2A 基板に使われている 1 MB 版では、その機能はありません。
そこで、「FIFO 付きクロック同期シリアル I/O」(SIOF) モジュールのボーレートジェネレータ部分だけを利用して、本来はシリアルクロック出力である SIOFSCK からオーバーサンプリングクロックを出力することにしました。
ボーレートジェネレータの最小分周比は 1/2 であり、512 fs を分周して 256 fs を作り出すことが可能です。
最近の DAC では、128 fs から 768 fs 程度の範囲のクロックに自動対応するものが多いですが、CD プレーヤでの使用を主な用途としていた昔の DAC では 256 fs と 384 fs ぐらいしか対応しないものが多いので、256 fs が取り出せると使える DAC の幅が広がります。
ただし、SIOFSCK 出力は PG8 のピンに割り付けられており、これは LCD_DATA8 出力と重なっているので、LCD 出力とは両立しないことになります。
ピクセルデータが RGB565 形式では、ビット 8 は G3 のビットに対応し、かなり上位側のビットとなります。
これが、仮に G0 が潰れるのであれば G0 は無視して RGB それぞれ 5 ビットとして扱うこともできますが、G3 が使えなくなると影響は大きくなります。
ピクセルデータが αRGB4444 形式ではビット 8 は R0 の位置ですから、 αRGB4344 形式としては使えることになります。
ディスプレイコントローラのアルファブレンディングやクロマキーの機能を使わず、単なるフレームバッファとしてメモリからワードデータを読み出して出力するだけの用途で使うなら、ワードデータ内の RGB データの割り付けは自由ですから、ビット 8 を避けるように RGB555 データとして割り付ければ、オーディオクロックとの両立は可能です。
この場合、画像データはあらかじめ変換しておくか、実行時に標準の形式から変換するようにプログラムを組むことになります。
FIFO 付きクロック同期シリアル I/O」(SIOF) モジュールの初期化のコードを下に示します。 この初期化だけでクロックは出続けるので、それ以降の操作は必要ありません。

// AUDIO clock select, 0 for AUDIO_X1, 1 for AUDIO_CLK
#define USE_AUDIO_CLK 0

// Synchronouse Serial I/O interface with FIFO setup
// for oversampling DAC system clock generation (audio_clk/2)
void SIOF_setup()
{
    CPG.STBCR7.BIT.MSTP77   = 0; // enable SIOF clock
    PORT.PGCR2.BIT.PG8MD    = 5; // enable SIOFSCK on PG8
    SIOF.SIMDR.BIT.TRMD     = 2; // master mode
    SIOF.SISCR.BIT.MSSEL    = USE_AUDIO_CLK; // clock select
    SIOF.SISCR.BIT.BRPS     = 0; // Baud rate prescaler = 1/1
    SIOF.SISCR.BIT.BRDV     = 0; // Baud rate divider   = 1/2
    SIOF.SICTR.BIT.SCKE     = 1; // enable SIOFSCK output
} // void SIOF_setup()