PIC32MX220F032B (9) -- AC97 コーデックを接続する (6)

別の AC97 コーデック (SigmaTel 製 STAC9708) との接続を試してみました。
これは古い 5.1 ch 出力オーディオ PCI カードから取り外してきたものです。
STAC9708 には 18 ビット分解能の DAC が 4 ch 内蔵されており、オーディオ・カードでは 2ch DAC 内蔵の STAC9721 と合わせて 5.1 ch 分の出力を得る構成になっています。
結果としては、DAC には HPF は入っておらず、ADC 側に HPF が入っているという、普通の仕様でした。
さらに、現行品種の SigmaTel (現 IDT) STAC9750/9751 のデータシートを参考にして、ADC の HPF をバイパスする設定を見つけることができました。
STAC9750/9751 では、

  1. アドレス 0x76 のレジスタに 0xABBA を書き込んで
    0x78 レジスタのロックを外す
     
  2. アドレス 0x78 のレジスタの b0 を「1」にする

という手順で ADC の HPF をバイパスすることができます。
STAC9708 では、2. のビット位置が違っていて、b11 を「1」に設定すると HPF がバイパスされました。
内部レジスタのダンプリストを下に示します。

      +0   +2   +4   +6   +8   +A   +C   +E
00: 6940 8000 8808 8000 0000 0000 8008 8008
10: 8808 8808 8808 8808 8808 0000 8000 0000
20: 0000 0000 0000 000F 0080 0080 0000 0000
30: 0000 0000 0000 0000 8080 0000 0000 0000
40: 0000 0000 0000 0000 0000 0000 0000 0000
50: 0000 0000 0000 0000 0000 0000 0000 0000
60: 0000 0000 0000 0000 0000 0000 0000 0000
70: 0000 8000 0380 0000 8380 0000 8384 7608

      +0   +2   +4   +6   +8   +A   +C   +E
00: 6940 0000 8808 0000 0000 800E 8008 8008
10: 8808 8808 8808 8808 0808 0101 0202 0000
20: 0000 0000 0000 000F 0080 0080 0000 0000
30: 0000 0000 0000 0000 0000 0000 0000 0000
40: 0000 0000 0000 0000 0000 0000 0000 0000
50: 0000 0000 0000 0000 0000 0000 0000 0000
60: 0000 0000 0000 0000 0000 0000 0000 0000
70: 0000 8000 0B80 ABBA 8B80 0000 8384 7608

前半がリセット後のデフォルト状態で、後半は各種の初期設定を行ったあとの状態です。
HPF バイパスのためにアドレス 0x76 のレジスタに 0xABBA が書き込まれており、アドレス 0x78 のレジスタでは、デフォルト値の 0x8380 から 0x8B80 へと変化しています。
STAC9708 には SPDIF 出力がなく、手軽に PC で ADC 出力をキャプチャできないので、代わりに DAC 出力のアナログ電圧をオシロで観察します。

約 11 Hz の方形波発生 (PIC32MX) → AC-Link → サラウンド DAC → アナログ電圧 → ADC → AC-Link → PIC32MX → AC-Link → フロント DAC → アナログ電圧

という経路で AD / DA ループバックした波形の写真を下に示します。 これはデフォルトの HPF「あり」の状態です。

下のトレース (Ch.2) がサラウンド DAC 出力のアナログ電圧で、約 11 Hz の方形波です。
上のトレース (Ch.1) がサラウンド DAC 出力のアナログ電圧を ADC でキャプチャし、そのディジタル値をフロンド DAC にループバックして出力したアナログ電圧です。
本来は ADC からフロント DAC へのループバックは AC97 の基本構成の中に含まれており、AC97 コントローラ側の介在なしでハードウェアだけでデータを流すことができ、実際に STAC9708 でも機能します。
しかし、STAC9708 の場合には、サラウンド DAC 出力が無効になってしまうので、この機能は使わず、PIC32MX (AC97 コントローラ) 側のプログラムでソフト的にループバックしています。
HPF をバイパスする設定にした場合の波形写真を下に示します。

直流分が通るので、方形波が正しく出力されています。
ループバック後の波形の振幅が小さいのは、HPF ありの場合に ADC 出力側でクリップしないように、あらかじめ ADC へのアナログ入力電圧の振幅を絞ってあるからです。