Dreamcast シリアルポートアダプター (1.5Mbps)
The original article, written by jj1odm, is available at http://jj1odm.sizious.com/
RS-232C の規格のままでは 230.4kbps 辺りまでですが、それ以上の通信スピードではロジックレベルで行ないます。 本来なら差動型のインターフェースを使用したいところですが FT232BM Dreamcast 間の距離を短くする事を前提で ロジックレベルのまま使用します。
FT232BM の信号は 5V 系 なので Dreamcast の 3.3V 系 と接続するためレベル変換とバッファーを兼ねて VHC244 を使用しました。 回路図中ドリームキャストのリセット信号がアクティブの間バッファーをフローティングしていますが、その理由は こちら を参照。
物理的にはこれで OK ですが、問題は FT232BM と Dreamcast の通信スピードの設定です。
Dreamcast は最大 1.56Mbps、FT232BM は最大 3Mbps ですが残念な事に互いに誤差ほぼゼロで設定できる最大のボーレートはかなり低い 57600bps という値になります。但し誤差があってもとりあえず通信が出来る 500Kbps がいちようの最大ボーレートという事になります。
(Dreamcast の場合は 50MHz から 50MHz / (32 * bps) - 1 の計算式で、FT232BM の場合は基本的に 3MHz からの分周比ですが内部的には 48MHz をベースに目的のボーレートに対する分周比を算出するため互いに誤差ゼロでスピードを合わせるのが難しくなります。)
そこで 外部ボーレート端子 の登場です。
外部ボーレート端子は DC シリアルポートの 2番ピン にあります。(外部ボーレート端子発見に関しては こちら を参照)
使い方は使用したい ボーレートの16倍 のクロックを供給するだけです。
ソフトウエア上の設定は SCI インターフェースの SCSCR2 レジスタの CKE1 (bit 1) ビットを ON にするだけですが、以下に外部ボーレート使用時 の SCI インターフェース初期化ルーチンのサンプルを示します。 scif_init() 関数の引数は使用したいボーレート値で 0 以外の値では内部 ボーレートの設定 になり、0 の時は外部ボーレート に初期化します。
// ---- example scif_init() -----
void scif_init(int bps)
{
int i;
*SCSCR2 = bps ? 0x0 : 0x02; //////// clear TE and RE bits / if (bps == 0) CKE1 on (bit 1)
*SCFCR2 = 0x6;
*SCSMR2 = 0x0;
if (bps) *SCBRR2 = (50 * 1000000) / (32 * bps) - 1; //////// if (bps != 0) set internal baudrate
for (i = 0; i < 100000; i++);
*SCFCR2 = 12;
*SCFCR2 = 0x8;
*SCSPTR2 = 0;
*SCFSR2 = 0x60;
*SCLSR2 = 0;
*SCSCR2 = bps ? 0x30 : 0x32; //////// set TE and RE bits / if (bps == 0) CKE1 on (bit 1)
for (i = 0; i < 100000; i++);
}
// sci init and set external baudrate
scif_init(0);
今回 FT232BM のベース回路には 1.5Mpbs x 16 = 24Mhz のクロックを内蔵させています。
なぜ 2Mbps : 32MHz あるいは最大の 3Mbps : 48MHz にしなかったかというと実際に試してみた結果ケーブルの影響もありますが DC本体のマザーボード内のパターンがかなり長い距離を引き回しているのと EMI 対策の部品の影響で 24MHz が限界でした。
(普通は数10メガのクロックをロジック信号のまま外部からケーブルで供給するという事はしません。本来なら DC 本体に搭載すべきですね。)
恐らく SH4 の SCI インターフェース自体は 3Mbps (48MHz) でも動作するのではないかと思われます。