多機能デコーダ VS1053b (8) -- VS1053b 簡易モニタ (2)

ATtiny2313 を使った簡易モニタのハード/ソフトは、まだ部分的にしかできていませんが、VS1053b の内部レジスタを参照/変更してみて、少し進展があったので報告します。
簡易モニタのハード/ソフトについての説明は後に回します。
まず、発音が停止した状態では、秒単位で経過時間を示す DECODE_TIME レジスタ (アドレス 0x04、以下 16 進数のみで表記) も更新されなくなります。
まあ、DECODE_TIME はソフトウェアで更新していると思われるので、これは当然ですが、これだけでは、バグ等によりプログラムの機能が停止したのか、ノイズによる DSP コアの誤動作なのかの判断は付きません。
SCI (Serial Command Interface) によるレジスタ・アクセスは独立したハードウェアで実装されていると思われるので、発音が停止した状況でもレジスタ・アクセスは問題なく行えますし、MODE レジスタ (0x00) の SM_RESET ビットを立ててソフトリセットも可能です。
AUDATA レジスタ (0x05) にはサンプリング周波数とステレオ/モノの設定が入っています。
その値を読み出すと 0xAC45 で、b0 = 1 はステレオを示すので、サンプリング周波数としては 0xAC44 = 44100 Hz です。
データシートではリアルタイム MIDI モードでのサンプリング周波数について不明でしたが、これで確定しました。
サンプリング周波数は読み出しだけでなく、設定もでき、試してみると実際にサンプリング周波数が変化して音程も変わりました。
また、データシートでは、リアルタイム MIDI モードでは 4.0x クロック・モードで立ち上がる旨の記述がありますが、実際に CLOCKF レジスタ (0x03) の内容は 0x0000 で、これは 1.0x クロック・モードに相当します。
たぶん、小さな DSP プログラムを作って走らせてみないと、DSP コアの実際のクロックの値を直接的に知ることはできないと思います。
次の項で示すように、クロック倍率を変化させると、振るまいも変わってきますから、やはり表示通り 1.0x クロックで立ち上がっている可能性が大きいです。

クロック倍率変更

たとえば、サンプリング周波数を 44.1 kHz のままでクロック倍率を 1.0x から 2.0x にするのと、クロック倍率を 1.0x のままでサンプリング周波数を 44.1 kHz から 22.05 kHz にするのは、DSP コアに対する負荷率の点から言えば同じことになります。
実際、この2種の方法で負荷率を下げると、デフォルトでは「飛んで」しまう MIDI データに対して演奏が停止しなくなる場合も出てきました。
スペック外となる 5.0x クロック (61.44 MHz) まで上げても、すべてのデータが OK になるわけではなく、停止するデータもあります。
それでも、負荷率を下げれば「通りやすく」なることが分かりました。
ノイズ等による DSP コアの (ハード的な) 誤動作であれば、クロック周波数が高くなるほど不利だと思われますから、不具合はソフト的な原因、

  • 処理速度の不足により処理が立て込んできて、リエントラント (再入可能) でないルーチンに再入してしまってデータを壊す
  • 処理速度の不足により、割り込み処理中に新たな割り込みが入って多重割り込みとなり、あっという間にスタック領域を食いつぶす

などによるものではないかと考えられます。
現状は、「スタンドアロン」でも MCU (ATtiny2313) を付けてありますから、リセット時にクロック倍率を上げてやることは可能です。

その他

  • SCI からコントロールできるテストコマンドである「Sine Sweep」を AIADDR (0x0A) に 0x4022 を書き込んで試して見ましたが、ちゃんと実行されました。
  • X data RAM の 0x1E00-0x1E01 に chip ID がコピーされるとデータシートには書いてありますが、実際に読み出すと 0x0000 でした。 リアルタイム MIDI モード以外では試していないので、通常のモードでどうなのかは不明です。
  • X data RAM の 0x1E02 の 「structure version」はデータシート通り 0x0003 でした。
  • モニタプログラムのデバッグのため、SCLK や XCS にオシロのプローブをつないで動作させていると、何時間動かしても停止しない「鉄板データ」でも発音停止になる場合がありました。 これは、ちょっとショックです。 ノイズの影響が皆無というわけではないようです。