すごいぞメガドライブミニ!(収録ソフト2回目発表後)
というわけで「YM2612 + SN76489 メガドライブ音源を ESP32 で鳴らす (クロックジェネレーター編)」です。この記事で使われているソースコードや結線などは github で公開しています。
https://github.com/h1romas4/esp32-genesis-player
esp32-genesis-player (work in progress)
メガドライブの音源となっています YM2612 と SN76489 はそれぞれ 7.670453MHz と 3.579545MHz で動いていますが、3.579545MHz のクリスタルオシレーターの入手は容易であるものの、7.670453MHz みたことない。。
というわけでクロックジェネレーターを使うにあたって起きた顛末です。
LTC6904
最初に試したのは I2C で任意のクロックを設定できる LTC6904 で、YM2612 を鳴らしている海外勢の方々もよく使われているチップです。
LTC6904 データシートおよび製品情報 | アナログ・デバイセズ
シリアル・ポートでプログラム可能な1kHz~68MHz発振器
MSOP パッケージでしたので DIP 変換して動作させています。(老眼には厳しいはんだ付けでした。。。
I2C 的には ADR(4) でアドレスを 1bit 分設定できるので 2つまで同時にぶら下げることができます。 この機能を利用して YM と SN 用でふたつ接続しました。
このチップで最初につまずいたのが I2C による周波数の設定がうまくいったりいかなかったり… 具体的には I2C のコマンドが ACK が返ってこないことがあって原因が分からず。
I2C のプルアップ値などを変えたりいろいろためしていったところ、どうやら発振している間はコマンドが失敗することが多かったので OE(7) を L に落としてからコマンドを送ることで確実に受け付けるようになりました。
次にでた問題は I2C のコマンドは通るものの、クロック周波数が設定値にならないパターンです。
7.67MHz を設定するものの 8MHz くらいになったりで、、これについては最後まで原因不明。。電源を入れたりリセットしたりしているとうまくいくのですが、なにぶん 2こ接続しているので両方がぴたっと揃う確率が低く… テストしすぎて絶対音感に目覚めるところでした(目覚めない)
パスコンなどの入れ方が悪いのか?電源を変更してみよう?などいろいろ試行錯誤したのですが残念ながら安定させることができませんでした。
ちなみに Arduino 向けの LTC6904 ライブラリーを書いている方の ソースコード を見ていたところ次のようなコメントアウトを発見。いったん完全に電源を落としてから 100ms 待つというのが NECESSARY TO USE となっているので、もしかするとちょっと癖があるのかもしれません。
// NECESSARY TO USE
//#define pwrpin PORTC2
//#define gndpin PORTC3
//DDRC |= _BV(pwrpin) | _BV(gndpin);
//PORTC &=~ _BV(gndpin);
//PORTC |= _BV(pwrpin);
//delay(100); // wait for things to stabilize
//Wire.begin();
Si5351A (AE-Si5351A-B)
次に試したのは秋月さんで売っている AE-Si5351A-B でこちらはうまく動きました。 🙂
LTC6904 同様に I2C で周波数を設定できるクロックジェネレーターになっています。残念ながら I2C アドレスはひとつに固定ですが、3ch 分のクロックを取り出すことができますので、YM と SN で 2ch 使っています。
クロックの設定方法が秋月さんの取扱説明書に記載されていますが、基本は PLL / Multisynth という式の割り算でほしいクロックをつくれば OK です。少数も使えますがなんとなく整数値で次のようにしています。
# 本当は PLL(4725) / Multisynth(616) で正確
YM2612(7.670453MHz) PLL(675) / Multisynth(88)
SN76489(3.579545MHz)PLL(630) / Multisynth(176)
AE-Si5351A-B はリセット後などの操作でも安定して動作させられましたのでこちらを使うことにしました。
動作確認用に簡略化されていますが、LTC6904 と Si5351A とも esp-idf 用のソースコードを github においてあります。
以上、というわけで部品が定まりましたのでいよいよ次回は基板をつくっていきたいと思います。 🙂