tiny6410裸机程序之五、DDR

Double Data Rate双倍速率同步动态随机存储器
从nand flash中启动时,硬件会自动地将nandflash中前8K的内容复制到片内内存,如果程序大小超过8K,就需要用位置无关码将程序复制到DDR中,DDR需要初始化。

访问DDR,需要发出BANK地址,行地址,列地址等,由DRAMC(动态内存控制器)进行控制,初始化步骤为:
1.地址线的设置
2.位宽
3.设置时序

DRAMC  初始化序列,可以参考6410数据手册
tiny6410裸机程序之五、DDR

DDR初始化序列

tiny6410裸机程序之五、DDR

下面直接上代码
首先来看链接脚本
文件名led.lds
SECTIONS 
{
    . =0x50000000;/可以看到程序的链接地址指向了DRAM
    .text: 
   
        start.o 
        * (.text)
   
     
    . = ALIGN(4);
    .rodata :
    {
    * (.rodata)
    }
     
    . = ALIGN(4);
.data :
{
* (.data)
}

    . = ALIGN(4);
     
    bss_start = . ; 
     
.bss :
{
* (.bss)    
* (.common)
}
bss_end = . ;  
}

文件名:sdram.c
int sdram_init( void )
{
/ tell dramc to configure
set_val( MEMCCMD, 0x4 );

/ set refresh period
set_val( P1REFRESH, nstoclk(7800) );

/ set timing para
set_val( P1CASLAT, ( 3 << 1 ) ); 
set_val( P1T_DQSS, 0x1 ); / 0.75 - 1.25
set_val( P1T_MRD, 0x2 );
set_val( P1T_RAS, nstoclk(45) );
set_val( P1T_RC, nstoclk(68) );

u32 trcd = nstoclk( 23 );
set_val( P1T_RCD, trcd | (( trcd - 3 )<< 3 ) );
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 );  

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 );

set_one( P1_chip_0_cfg, 16 );

// memory init
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 );
// set dramc to "go" status
set_val( P1MEMCCMD, 0x000 );

// wait ready
while( !(( read_val( P1MEMSTAT ) & 0x3 ) ==0x1));
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值