#include "h8_sample.h" #include "h8_lcd.h" #include // DRAM末端アドレス(4MB) #define DRAM_END (unsigned int *)0x7FFFFF char buffer[16]; int main() { volatile unsigned int *dram; dram = (unsigned int *)0x400000; // 全エリア8ビットアクセス ABWCR.BYTE = 0xFF; RTCOR = 0x09; // カウンタ=10 RTMCSR.BIT.CKS = 6; // 110 -> φ2048 .... 20MHz * 10/ 2048 = 約97.6kHz RTMCSR.BIT.CMF = 0; // CMFは使わない RTMCSR.BIT.CMIE = 0; // 割り込みは使わない RTMCSR.BIT.RESERVE=7; DRCRB.BIT.MXC = 2; // 10 -> カラムアドレス10ビット DRCRB.BIT.CSEL = 0; // UCAS/LCASにPB4/PB5を使用 DRCRB.BIT.RCYCE = 1; // リフレッシュサイクル許可 DRCRB.BIT.RESERVE=1; DRCRB.BIT.TPC = 0; // プリチャージサイクル1ステート DRCRB.BIT.RCW = 0; // RAS/CASウェイトステートなし DRCRB.BIT.RLW = 0; // Trw = 0; DRCRA.BIT.DRAS = 2; // 101 -> エリア2,3=DRAM空間 DRCRA.BIT.RESERVE=1; DRCRA.BIT.BE = 1; // バーストイネーブル DRCRA.BIT.RDM = 0; // RASアップモード DRCRA.BIT.SRFMD = 0; // スタンバイ時のセルフリフレッシュ禁止 DRCRA.BIT.RFSHE = 0; // -RFSH端子の出力禁止 P1DDR.BYTE = 0xFF; // ポート1、アドレス出力 P2DDR.BYTE = 0xFF; // ポート2、アドレス出力 P5DDR.BYTE = 0x01; // ポート5、A16出力 P8DDR.BYTE = 0x0E; // ポート8、CS1〜CS3出力 wait20us(); // ウェイト // バス初期化 WCRH.BYTE = 0xFF; // 上位エリアは3ウェイトステート WCRL.BIT.W3 = 0; // エリア3(増設DRAM)ウェイト無し WCRL.BIT.W2 = 0; // エリア2(DRAM)ウェイト無し WCRL.BIT.W1 = 2; // エリア1(RTL8019AS)2ウェイトステート WCRL.BIT.W0 = 0; // エリア0ウェイト無し ASTCR.BYTE = 0xFF; // 全エリア3ステートアクセス ASTCR.BIT.AST2 = 0; // エリア2、2ステート ASTCR.BIT.AST3 = 1; // エリア3、2ステート // LCD初期化 P4DDR.BYTE = 0xFF; LCD_Init(); LCD_Locate( 0, 0 ); LCD_Putstr("Addr: "); LCD_Locate(1,0); LCD_Putstr("OK"); do { volatile unsigned int d; *dram = 0; LCD_Locate( 0, 6 ); sprintf( buffer, "%p" , dram ); LCD_Putstr(buffer); // check *dram = 0x55555555; _nop(); d = *dram; if( d != 0x55555555 ) goto error; *dram = 0xAAAAAAAA; _nop(); d = *(dram++); if( d != 0xAAAAAAAA ) goto error; } while( dram < DRAM_END ); LCD_Locate(1,0); LCD_Putstr("Complete!"); return 0; error: LCD_Locate(1,0); LCD_Putstr("NG"); return 0; }