VS1053bを使ったDecorderの使い方はここで説明しています。ただこれは基板が大きくてもっと小さいサイズの製品を探したらこれが見つかったのですが、これ意外と曲者でした。
Aliexpressの製品は写真と実物が違って意図しないものを買ってしまう事が良く有ります。今回は、LSIがVS1053bである事が注意点。(似たLSIでVS1003bが有り、これは性能が劣る)HPの当てにならない写真と明細書を確認してオーダーし希望の製品を入手出来ました。
ところが動かない
VS1053bを使うと同じ様にESP32を使ってサンプルプログラム(サイン波を出力するプログラム)を実行したところ、全く音が出ません。配線とプログラムを確認しましたが間違っていません。同じESP32と赤いVS1053bを接続すると問題無く動作します。どうもこの基板(緑のもの)に問題が有るように思えます。
この基板全く動かないかというとそうでも無いのです。レジスタの読み書き(レジスタに書いた値を読み出す)は出来ます。書いたデータを読み出す事は出来ないのでデータの読み書きが出来ないのかは確認出来ませんが、配線は間違っていない事は再度確認しています。
Webで検索すると
vs1053b SDI Sine test not working, SCI works – SOLVEDが見つかりました。要約すると
- VS1053Bには8ビットのGPIOが有り。リセット後には全て入力設定になる。
- 起動時に
- GPIO 0がLOW、GPIO 1 LOWの場合、通常のデコードモード起動。
- GPIO 0がLOW、GPIO 1 HIGHの場合、Real-Time MIDI モードで起動。
VS1053Bが Real-Time MIDI モードで起動して、サイン波が出ないとの事。そこでボードを確認すると
GPIO 0は10k(104)の抵抗を通してGNDに接続されている(LOWになっている)が、GPIO 1はオープンになっています。GPIO 1がHIGHで有る可能性はかなり高い。リンク先では、GPIOの0と1をショートさせたら動いたと有ったのでやってみたら確かに動きました。参考までに赤い基板の同じ箇所を確認すると
各ピン抵抗を通してGNDに接続されています(両方LOW)。また、SPECVS1053の資料に載っている推奨回路もGNDに落としていました。
ピンをショートしてからは問題無く動作しました。この基板はMIDI用として設計されていると言えばこれで良いのですが。、この基板をReal Time MIDI用に使う人がどれくらいいるのか。
このモジュールGPIOポートを持っていました
このモジュールは8ビットの汎用IOを持っていてピン番 33,34,9,10,36,25,11,12が、GPIO 0,1,2,3,4,5,6,7に対応しています。ポートの設定は、以下の様に行います。
- レジスタ 0XC017: 入出力の設定
- 0:入力 1:出力
- レジスタ 0XC018: ピン状態の読み込み
- 戻り値は11ビット。
- 8ビットのピン状態と、SCLK = GPIO_IDATA[8], XCS = GPIO_IDATA[9], SI =GPIO_IDATA[10], and XDCS = GPIO_IDATA[11].
- レジスタ 0XC019: ピン状態の書き込み
- 8ビットの出力状態を書く。書き込んだ値はポートの設定がN /OUTに関わらず読み読み込める
ポートへのアクセスは SCI_WRAMADDR(0x07)と SCI_WRAM(0x06) レジスタを使って行います。例えば
- GPIOの0,1を出力に 2,3,4,5,6,7を入力に設定
- GPIO 0を1(High)に設定
- ピンに状態を読み込む
は以下の様になります。
VLSIWriteReg(0x07, 0xC017); // WRAMADDRに入出力設定レジスタ0xC017を書き込む
VLSIWriteReg(0x06, 0x03); // WRAMに設定値(00000011)を書く
VLSIWriteReg(0x07, 0xC019); // WRAMADDRに出力値設定レジスタ0xC019を書き込む
VLSIWriteReg(0x06, 0x01); // WRAMに1を書き込む(GPIO0を1に設定)
VLSIWriteReg(0x07, 0xC018); // WRAMADDRに入力設定レジスタ0xC018を書き込む
int a = VLSIWriteReg(0x06); // WRAMを読み込む(ピンの状態を読み込む)
実行したい動作をWRAMADDRで 対応する値をWRAM で処理する様です。ESP32でポートが不足した場合に重宝するかもしてません。