STM32F446RE 内蔵の SAI モジュールの AC97 モード (2)

 AC97 では、1 オーディオ・フレームは 256 ビットから構成されており、「BIT_CLK」 (ビット・クロック) の周波数は、 256 × 48 kHz = 12.288 MHz となります。
 256 ビットの 1 フレームはさらに、16 ビット幅のスロットが 1 個、20 ビット幅のスロットが12 個の、合計 13 個のスロットに分割されます。 各スロット内のデータは MSB ファーストで送受されます。
 オーディオ・フレームの同期信号である「SYNC」信号は、16 クロック間だけ「1」となって16 ビット幅のスロット (タグ・スロット、スロット0) の位置を示すようになっています。 ただし、SDATA_OUT/SDATA_IN 信号に対して SYNC 信号は本来の位置より 1 クロック分先行して変化します。

 タグ・スロットの各ビットは、対応するスロットのデータが有効化どうかを「ビットマップ」として表しています。
 その対応関係は、

  • b15 — Valid Frame (スロット 1 以降にひとつでも有効なデータがあるかどうか)
  • b14 — スロット 1 (レジスタ・アドレス)
  • b13 — スロット 2 (レジスタ・データ)
  • b12 — スロット 3
  • b11 — スロット 4

. . .

  • b4 — スロット 11
  • b3 — スロット 12

となっています。
 AC97 コーデック内部のレジスタのアクセスは、オーディオ・フレームの中に設けられたレジスタ・アドレス/レジスタ・データのための専用スロット (スロット 1、スロット 2) を介して行います。
 スロット 3 以降はオーディオ・データのためのスロットで、下の図のように割り付けられています。

 空白になっているスロットは、MC97 (モデム・コーデック) と共用するために予約されており、オーディオ用としては使用しないスロットです。
 SAI モジュールの一般的なマルチ・チャネル・オーディオ・フレーム構成では、SAI モジュール内のハードウェア・レジスタのビットの上げ下げで転送の有効化/無効化を切り替えますが、AC97 モードでは、ハードウェア・レジスタは使用されず、タグ・スロットのビットマップ・データが読み取られて自動的に転送の有効化/無効化が行われます。
 コーデック内部レジスタアドレス空間は 7 ビットとなっており、その中の偶数アドレスのみを使用していて、最大 64 個のレジスタから構成されています。 アクセス対象のコーデック内部レジスタのアドレスはスロット 1 のデータとして指定します。
 内部レジスタへの書き込み時のレジスタ・データは、スロット 2 で指定します。
 内部レジスタへのアクセスがない場合には、タグ・スロットの b14 および b13 をゼロにすることでスロット 1, 2 が有効でないことを示します。
 AC97 コーデックのリセット後のデフォルト状態では、アナログ・ミキサの PC_BEEP 入力以外の入力はミュートされており、DAC にデータを書き込んでも出力には全く反映されません。
 実動作中にレジスタ・アクセスの必要がなくても、初期設定として少なくとも 1 回はミュートを外すためにレジスタに書き込む必要があります。