RX64MにSDRAMを接続する

ようやく、SDRAMのテストを開始、結線は多いが、高速な大容量外部
メモリを得られる。
デバイスだけでも512Kバイトのメモリーを持っているので、通常は十
分ではあるけど、このようなデバイスじゃないと、SDRAMを制御する
為のハードウェアーを内臓していない、又、169ピンのデバイスじゃな
いと、32ビットの外部バスをサポートしていない。
※最大のパフォーマンスを得たいので32ビットバスで動かしてみたい。

普通は、基板を起こすべきなのだろうけど、実験ではそうもいかない。
と、言っても最近では、海外のメーカーに発注すれば、基板を新規に作成
するコストは尋常じゃ無く安いので、いきなり基板を起こしてみるのも悪
くないかもしれない。

クロックが高いので、手配線では動作が難しいかもしれないが、バスに接
続するSDRAMは、CPUの動作速度の半分でしかないので、(およそ
60MHz)このくらいなら、手配線でも何とか動作すると思う。
「反射」が起こって動作が不安定になった場合は、ダンピング抵抗を調整
してインピーダンスの整合を行えば、何とかなるのでは無いかと考えてい
る。
※変換基板では、電源ラインが相対的に弱くなるのが多少気になる。

デバイスは300円(128メガビット)なのに、変換基板(Aitendo 産)
が250円するけど、他に、収まりが良く、スペースが少ない変換基板が
無かった。
img_0867s
※基板を起こす時には256メガビット品を使うと思うが、組み込み用途
のSDRAMを単体で入手(秋葉原などで)できるのは限られている。

最近は、0.5mmピッチのハンダ付けが多かったので、0.8mmピッ
チは、凄く楽だったーー
変換基板には、何故か余分な部分があるので、カットして、裏面にある謎
の端子パッドも、いつものようにポリイミドテープで絶縁、ベース基板と
直接コンタクトさせる。
img_0870s
※ピン番号のシルクが一部間違っている・・(28、29ではなく、27、
28ね・・)
※ポリイミドテープの存在を知らない時は、「紙」を貼っていた。www

まず、電源ラインを配線してから、十分なパスコンを接続、それから配線
を行った、データバスは、液晶を接続するのにも使うので、別途、コネク
ターに出す。
・電源の配線
img_0871s

参考回路(ルネサスのRX64Mボードの例)
rx64m_sdram

厄介なのは、SDRAMの場合、初期化処理を行わないと、使う事ができな
い点で、それなりのパラメーターがある、とりあえず、ベストな設定より、
必ず動作しそうな無難な設定を考えてみた。
後は、SDRAMのマニュアルと、RX64Mのマニュアルを見ながら、行
い、とりあえず、書いたデータを読み出せた~
※もっと苦労すると思っていたので、意外な感じはあるが、メモリー空間は
32メガバイトもあるので、詳細なテストを行わないと、分からない。

バス・インターフェースの初期化

    // SDRAM 初期化 128M/32bits bus
    device::MPC::PFAOE0 = 0xff;  // A8 to A15
    device::MPC::PFBCR0 = device::MPC::PFBCR0.ADRLE.b(1) |
                          device::MPC::PFBCR0.DHE.b(1) |
                          device::MPC::PFBCR0.DH32E.b(1);
    device::MPC::PFBCR1 = device::MPC::PFBCR1.MDSDE.b(1) |
                          device::MPC::PFBCR1.DQM1E.b(1) |
                          device::MPC::PFBCR1.SDCLKE.b(1);
    device::SYSTEM::SYSCR0 = device::SYSTEM::SYSCR0.KEY.b(0x5A) |
                             device::SYSTEM::SYSCR0.ROME.b(1) |
                             device::SYSTEM::SYSCR0.EXBE.b(1);
    while(device::SYSTEM::SYSCR0.EXBE() == 0) asm("nop");

SDRAM の初期化

    device::BUS::SDIR = device::BUS::SDIR.ARFI.b(0) |
                        device::BUS::SDIR.ARFC.b(1) |
                        device::BUS::SDIR.PRC.b(0);
    device::BUS::SDICR = device::BUS::SDICR.INIRQ.b(1);  // 初期化シーケンス開始
    while(device::BUS::SDSR() != 0) asm("nop");
    // 動作許可、32ビットアクセス
    device::BUS::SDCCR = device::BUS::SDCCR.BSIZE.b(1);
    // Burst read and burst write, CAS latency: 3, Burst type: Sequential, Burst length: 1
    device::BUS::SDMOD = 0b00000000110000;
    // CAS latency: 3, Write recovery: 1, ROW prechage: 4, RAS latency: 3, RAS active: 4
    device::BUS::SDTR = device::BUS::SDTR.CL.b(3) |
                        device::BUS::SDTR.RP.b(3) |
                        device::BUS::SDTR.RCD.b(2) |
                        device::BUS::SDTR.RAS.b(3);
    // 128M/16 カラム9ビット、ロウ12ビット
    device::BUS::SDADR = device::BUS::SDADR.MXC.b(1);
    // Refresh cycle
    device::BUS::SDRFCR = device::BUS::SDRFCR.RFC.b(2048) |
                          device::BUS::SDRFCR.REFW.b(7);
    device::BUS::SDRFEN = device::BUS::SDRFEN.RFEN.b(1);
    // SDRAM 動作開始
    device::BUS::SDCCR.EXENB = 1;

img_0872s

SDRAM サンプル