声明:本文转自http://blog.csdn.net/mcudoc/article/details/8758222
DDR初始化
一、DDR的容量
二、DDR信号
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------
三、S3C6410的DRAM控制器初始化
五、DDR初始化程序
程序如下
头文件:
- #ifndef
__COMMON_H - #define
__COMMON_H -
- #define
vi *( volatile unsigned int * ) -
- #define
set_zero( addr, bit ) ( (vi addr) &= ( ~ ( 1 << (bit) ) ) ) - #define
set_one( addr, bit ) ( (vi addr) |= ( 1 << ( bit ) ) ) -
- #define
set_bit( addr, bit, val ) ( (vi addr) = (( vi addr)&=(~(1<<(bit))) ) | ( (val)<<(bit) ) ) -
- #define
set_2bit( addr, bit, val ) ( (vi addr) = (( vi addr)&(~(3<<(bit))) ) | ( (val)<<(bit) ) ) -
- #define
set_nbit( addr, bit, len, val ) \ -
( (vi addr) = ((( vi addr)&(~(( ((1<<(len))-1) )<<(bit)))) | ( (val)<<(bit) ) )) -
- #define
get_bit( addr, bit ) ( (( vi addr ) & ( 1 << (bit) )) > 0 ) -
- #define
get_val( addr, val ) ( (val) = vi addr ) - #define
read_val( addr ) ( vi ( addr ) ) - #define
set_val( addr, val ) ( (vi addr) = (val) ) - #define
or_val( addr, val ) ( (vi addr) |= (val) ) -
- ///
-
- typedef
unsigned char u8; - typedef
unsigned short u16; - typedef
unsigned int u32; -
- //
function declare -
- int
delay( int ); -
- #endif
DDR 初始化程序
- #include
"common.h" -
- #define
MEMCCMD 0x7e001004 - #define
P1REFRESH 0x7e001010 - #define
P1CASLAT 0x7e001014 - #define
MEM_SYS_CFG 0x7e00f120 - #define
P1MEMCFG 0x7e00100c - #define
P1T_DQSS 0x7e001018 - #define
P1T_MRD 0x7e00101c - #define
P1T_RAS 0x7e001020 - #define
P1T_RC 0x7e001024 - #define
P1T_RCD 0x7e001028 - #define
P1T_RFC 0x7e00102c - #define
P1T_RP 0x7e001030 - #define
P1T_RRD 0x7e001034 - #define
P1T_WR 0x7e001038 - #define
P1T_WTR 0x7e00103c - #define
P1T_XP 0x7e001040 - #define
P1T_XSR 0x7e001044 - #define
P1T_ESR 0x7e001048 - #define
P1MEMCFG2 0X7e00104c - #define
P1_chip_0_cfg 0x7e001200 -
- #define
P1MEMSTAT 0x7e001000 - #define
P1MEMCCMD 0x7e001004 - #define
P1DIRECTCMD 0x7e001008 -
-
- #define
HCLK 133000000 -
- #define
nstoclk(ns) (ns/( 1000000000/HCLK)+1) -
- int
sdram_init( void ) - {
-
// 设置DRAM控制器状态为配置模式 -
set_val( MEMCCMD, 0x4 ); -
-
// 设置DDR刷新周期为7.8US -
set_val( P1REFRESH, nstoclk(7800) ); -
-
// 设置DDR时序参数 -
set_val( P1CASLAT, ( 3 << 1 ) ); -
set_val( P1T_DQSS, 0x1 ); // 0.75 - 1.25时钟周期 -
set_val( P1T_MRD, 0x2 ); //min=2个时钟周期 -
set_val( P1T_RAS, nstoclk(45) );//45us -
set_val( P1T_RC, nstoclk(68) );//68us -
-
u32 trcd = nstoclk( 23 ); -
set_val( P1T_RCD, trcd | (( trcd - 3 ) << 3 ) );//22.5us -
u32 trfc = nstoclk( 80 ); -
set_val( P1T_RFC, trfc | ( ( trfc-3 ) << 5 ) ); -
u32 trp = nstoclk( 23 ); -
set_val( P1T_RP, trp | ( ( trp - 3 ) << 3 ) ); -
set_val( P1T_RRD, nstoclk(15) ); -
set_val( P1T_WR, nstoclk(15) ); -
set_val( P1T_WTR, 0x7 ); -
set_val( P1T_XP, 0x2 ); -
set_val( P1T_XSR, nstoclk(120) ); -
set_val( P1T_ESR, nstoclk(120) ); -
-
// set mem cfg -
set_nbit( P1MEMCFG, 0, 3, 0x2 ); -
-
-
//把第0位开始的后三位清零,然后把这三位设置为ox2 -
-
set_nbit( P1MEMCFG, 3, 3, 0x2 ); -
-
set_zero( P1MEMCFG, 6 ); -
set_nbit( P1MEMCFG, 15, 3, 0x2 ); -
-
set_nbit( P1MEMCFG2, 0, 4, 0x5 ); -
set_2bit( P1MEMCFG2, 6, 0x1 ); -
set_nbit( P1MEMCFG2, 8, 3, 0x3 ); -
set_2bit( P1MEMCFG2, 11, 0x1 ); //读延迟1 周期 -
-
set_one( P1_chip_0_cfg, 16 ); -
-
// DDR 初始化 -
set_val( P1DIRECTCMD, 0xc0000 ); // NOP -
set_val( P1DIRECTCMD, 0x000 ); // precharge -
set_val( P1DIRECTCMD, 0x40000 );// auto refresh -
set_val( P1DIRECTCMD, 0x40000 );// auto refresh -
set_val( P1DIRECTCMD, 0xa0000 ); // EMRS -
set_val( P1DIRECTCMD, 0x80032 ); // MRS -
-
set_val( MEM_SYS_CFG, 0x0 ); -
-
// 使得DRAM 控制器输入‘准备’状态 -
set_val( P1MEMCCMD, 0x000 ); -
-
// 直到存储器状态变为‘2’b01’,即‘准备 -
while( !(( read_val( P1MEMSTAT ) & 0x3 ) == 0x1)); - }
以下为本人找的: