SH-2A 基板に AC97 コーデックをつなぐ (4)

今回からは、実際の接続について、いくつかの方法を説明します。実験に使った回路については次回説明します。
まずは、外部回路を使うものの、SH-2A 側のリソースの消費が小さく、ソフトウェアの面でも負担の少ない「実用的」な接続方法を下に示します。

この構成では、プライマリ・コーデックで発生した BIT_CLK をもとに動作し、SH-2A 内部のオーディオ・クロック等のリソースを使用していません。
逆に言うと、SH-2A 側のオーディオ・クロックを使用した SSIF や SPDIF モジュールと同期して出力することはできません。
SSIWS や SYNC 信号は外部のマイコンで発生させるものとしています。
したがって、SSIF はスレーブモード (SCKD = 0, SWSD = 0) で使用します。
メインとサブの SSIF を使用していますが、サブ SSIF は SYNC 信号を生成するためのものではなく、以前に文章のみで説明した、データを分割して2つの SSIF で分担して扱う構成のものです。
SH-2A に 4 個内蔵されている SSIF のうち、SSIF0 だけが、全2重で同時に送受信可能なので、SSIF0 を使用するのは、ほぼ確定で、この例ではメインに SSIF0、サブに SSIF3 を使用する構成となっています。
「ほぼ」と言ったのは、SSIF0 の端子は LCD_DATA の端子ともろに「かぶって」いるので、ビデオ・コントローラ機能と SSIF 機能を同時に使いたい場合には SSIF0 以外を使わざるを得なくなるためです。
もちろん、複数の SSIF で分担しない場合には、メインの SSIF だけを使います。
タイミング・チャートを下に示します。

SSIF-(A) 側がタグ/アドレス/データのコントロール用の 3 スロット分を担当し、SSIF-(B) 側では PCM オーディオ・データの 2 スロット分を担当します。
それぞれ、データワード幅はスロット幅と同じ 20 ビットとし、(A) 側では (padding, data) の順 (SDTA = 1) とし、(B) 側では (data, padding) の順 (SDTA = 0) としています。
それぞれのシリアルデータ出力を OR ゲートで合成し、AC97 コーデックの SDATA_OUT 入力へ供給しています。
タグスロット幅は 16 ビットですから、20 ビット・データワードの上位 4 ビットはゼロとし、下位 16 ビットにタグデータを書き込みます。
SSIF (A) と (B) の割り当ては、通常は同時に入出力可能な SSIF0 を (B) のオーディオ・データ側に割り当て、コントロール・データ側の (A) を出力専用にした SSIF3 に割り当てます。
この場合、レジスタの値を読み込めなくなるので、実行時にレジスタに書き込むデータを動的に変化させることはできず、コンパイル時に決定したデータを、決め打ちで流し込むことになります。
コーデックの拡張部分を使わず、基本部分だけにとどめるなら、これで十分だと思います。
拡張部分の、たとえば AD の可変サンプリングレート機能を使う場合には、現フレームの AD 変換値が有効かどうかの判定に SDATA_IN 側のタグビットを読み込む必要が生じます。
このコントロール・データと、オーディオ・データを分離する方式では、それぞれのデータバッファも分離されることになるので、コーデック・レジスタ・アクセスと、オーディオ・データの読み書きとは、互いの干渉を気にすることなく独立に実行できます。
また、20 ビット・データワード幅を 32 ビット・ロングワードに左詰めする設定 (PDTA = 0) にすると、 16 ビット幅オーディオ・データは 32 ビット・ロングワードの上位 16 ビット・ワードにおさまるので、アクセスが簡単になります。