RX62NのシリアルモニタとSDRAM
RX62N用にシンプルなモニタをつくり、シリアルのコンソールから、ROM上にHEXファイルをロードして、実行できるようにしました。そのほか、メモリダンプや、1~4バイトのメモリ書き込み、メモリフィルなどの機能もつけました。
JTAG ICEを使わなくてもプログラムのロードができるようになったので、JTAGはバウンダリスキャン専用に使えます。
そもそも、RX62NのSDRAMのデバッグをしたかったのですが、どうもうまく動いていません。
SDRAMの初期化ルーチンはこんな感じです。
void HardwareSetup(void)
{
SYSTEM.SCKCR.LONG = 0x00010100; // ICLK=96MHz,BCLK=48MHz,PCLK=48MHz SDCLK出力,BCLK出力
SYSTEM.SYSCR0.WORD = 0x5A03; // 外部バス有効
IOPORT.PF6BUS.BYTE = 0xD0; // SDCLK出力,SDRAM有効
IOPORT.PF4BUS.BYTE = 0x3F; // A15,14出力無効、A13-0出力有効
IOPORT.PF5BUS.BYTE = 0x30; // P56,57はI/Oポート、P51はI/Oポート、D31~D8有効
// PC[7:0]を外部アドレスA23~A16として使う
BSC.SDCCR.BYTE = 0; // SDRAM無効
BSC.SDSELF.BIT.SFEN = 0; // セルフリフレッシュ無効
BSC.SDRFEN.BIT.RFEN = 0; // オートリフレッシュ無効
BSC.SDIR.WORD = 0x00FF; // 初期化オートリフレッシュ間隔3サイクル、
BSC.SDICR.BIT.INIRQ = 1; // INIRQビットを1にして初期化開始
while(BSC.SDSR.BIT.INIST) {}
BSC.SDCCR.BYTE = 0x30; // バス幅を32bitに設定 SDRAM動作はまだ許可しない
BSC.SDMOD.WORD = 0x0880; // モードレジスタ設定 CASレイテンシ2
while(BSC.SDSR.BYTE != 0) {}
BSC.SDTR.LONG = 0x00000003; // ライトリカバリ1 CASレイテンシ2
BSC.SDADR.BYTE = 0; // 8ビットシフト MXC=00
BSC.SDRFCR.WORD = 0xfff; // 4096サイクルごとに1サイクル ?
BSC.SDRFEN.BIT.RFEN = 0; // オートリフレッシュ有効
BSC.SDAMOD.BIT.BE = 1; // SDRAM 連続アクセス不許可
BSC.SDSELF.BIT.SFEN = 0; // セルフリフレッシュ無効
//BSC.SDCMOD.BYTE = 0; // 動作モードのエンディアンと同じ
BSC.SDCCR.BYTE = 0x31; // SDRAM動作許可
}
こうやって初期化した後に、こんなプログラムを実行すると、
while(1)
{
p = (unsigned char *)0x08000000;
or(i=0;i<1024;i++) *p++ = i;
}
バウンダリスキャンで見る限り、SDRAMのROWアドレスは出力されているのですが、同一ページ内のアクセスの際にカラムアドレスが出力されていないことがわかります。
また、SDRAMの接続を32bit幅に設定しているのに、DQM2とDQM3が正しく動いていないようにも見えます。
それから、シリアルモニタでSDRAMの領域をダンプしてみると、連続する0x400バイトで同じ値になってしまっています。やはり、カラムアドレスが動いていないのでしょう。

SDRAM関係のモードレジスタの設定が間違っているのでしょうけど、まだ解決できていません。
それにしても、組み込みの初期デバッグに、バウンダリスキャンは便利です。MITOUJTAGでバウンダリスキャンをしなければ、このバグに気付くのに軽く数日を要したと思います。
| 固定リンク





コメント