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

前回は、実用性はともかく、原理的には SH-2A のシリアルサウンドインターフェース (SSIF) で AC97 コーデックの 1 フレーム分の全データ 256 ビットを取り扱えることを示しました。
実用的には、全データではなく、一部のデータを扱うことになります。
今回は、AC97 コーデックと SSIF を同期させる方法について考えます。
まず、SSIF では、DAC などとのタイミング同期のために、

  • SSISCK (シリアルビットクロック)
  • SSIWS (シリアルワード選択)

の2つの信号を、その SSIF 自身が両方とも発生する (マスタモード) か、両方とも外部から与えられる (スレーブモード) かの選択ができるようになっています。
これは、両者とも出力、あるいは両者とも入力の設定のみが可能で、たとえば SSISCK を外部から入力しつつ、SSIWS を出力するような設定はサポートされていません。
また、AC97 コーデックでは、

  • BIT_CLK (プライマリ・コーデックでは基本的には出力、セカンダリ・コーデックでは入力)
  • SYNC (AC97 コントローラ側で発生)

の2つの信号を使って同期を取ります。
AC97 コーデックと SSIF が同期して動作するためには、まず第一に、両者のクロックが等しい、つまり、

  • BIT_CLK = SSISCK

の関係が必要です。
したがって、最も自然な接続は、

  • AC97 (プライマリ) BIT_CLK 出力 → スレーブモード SSIF SSISCK 入力
  • AC97 (セカンダリ) BIT_CLK 入力 ← マスタモード SSIF SSISCK 出力

のいずれかとなります。
次に、AC97 コーデックの動作のために SYNC 信号が必要ですが、当然、SSIF で自動的に生成されることはないので、

  • 外部回路による発生
  • SH-2A 内部リソース (具体的には別の SSIF) の利用

のいずれかの方法をとる必要があります。
外部回路で SSIWS から SYNC 信号を作り出す素直な実現方法の一例として、SSIWS のエッジと SYNC のエッジが揃っている場合に 16 ビットのシフトレジスタを使って同期微分する回路を下に示します。

上の図は、AC97 の 1 フレームと SSIF の 1 フレームを一致させた場合です。
SSIF のサンプリング周波数を 24 kHz として、第一および第二の、各システムワードを AC97 の 1 フレームに一致させた場合には、たとえば、次の図のようになります。

上ふたつの回路は、74 シリーズのロジック IC を使った実現でしたが、ATtiny 程度のマイコンでも実現できます。
マイコンでは SSIWS から SYNC を作る方法は実現しにくいので、BIT_CLK を CPU および PWM/タイマ回路のクロックとして入力して、SSIWS と SYNC を同時に作り出します。
SSIWS と SYNC のエッジが揃っている場合には、8 ビットのタイマひとつで SSIWS と SYNC を作り出せるので、8 ピンの ATtiny13 でも容易に実現できます。
SSIWS と SYNC のエッジ位置が揃っていない場合にはタイマが 2 個必要になるので、8 ピンで言えば ATtiny45 クラスが必要になってきます。
マイコンのソフトウェアとしては、タイマに必要な初期化をしたあとは CPU は何もする必要はなく、タイマ・ハードウェアが勝手に信号を生成し続けます。
外部ハードウェアを使わない方法としては、SDATA_OUT / SDATA_IN を扱うメインの SSIF とは別のサブ SSIF を用意し、その SSIDATA 出力を SYNC 信号として利用する方法があります。
具体的には、メイン/サブの SSIF の SSISCK どうし、SSIWS どうしを接続し、サブ SSIF はスレーブモードにして、メイン/サブの SSIF が同じタイミングで動くようにします。
そして、メインの SSIF でタグスロットのデータを作り出している部分に対応するサブ SSIF のデータは、常に 16 ビット幅の「H」に固定した設定にします。
SSIF でデータ出力タイミングなのに出力 FIFO にデータがない場合にはアンダーフローエラーとなりますが、正常動作だった最後のデータを繰り返し使って、送信動作自体は実行されますから、適切な初期設定と、初期出力データとを書き込んでおけば、以降は CPU / DMA の介在なしに SYNC 信号を発生し続けます。
メイン/サブの SSIF のコントロールレジスタ設定は、ほぼ同一にしますが、SYNC 信号を作り出すサブ SSIF ではシリアルデータディレイ「なし」(DEL = 1)、メイン SSIF ではシリアルデータディレイ「あり」(DEL = 0) にする必要があります。