关于ok6410初始化内存方法

声明:本文转自http://blog.csdn.net/mcudoc/article/details/8758222

   

DDR初始化

 一、DDR的容量

       我们在DDR芯片资料上的开头都会标明DDR的容量:如我们的手上的OK6410A的DDR(K4X1G163PC),它的芯片资料上写的是32M x16 Mobile-DDR SDRAM。但是厂家跟说ok6410a有128M的容量。看到这里不禁就个疑问了。芯片上明明写是32M为什么,FL说是128M呢。在这里就能给你答案,板子上有两片DDR。那它的容量是32Mx16位x2=32Mx32位。它这里32M指的32位数据,而我们通常所讲的容量是以字节为单位,而不是字为单位。32M的32位就等于32Mx4的8位。这样就根FL给出的数据一样了。所以我们以后在看内存容量时一定要注意到这一点。

二、DDR信号

 --------------------------------------------------------------------------------  

  信号名             作用

-----------------------------------------------------------------------------------   

    CK,nCK                      差分时钟

     nCS                           片选信号                  低电平有效

     CKE                           时钟使能                  高电平有效

     A0~A12                     地址线                      行列地址线复用,行地址:A0~A12 列地址:A0~A9

     BA0~BA1                  BANK选择                00 01 10 11。第个BAND为4M

     nRAS                         行地址锁存                低电平有效

     nCAS                         列地址锁存                低电平有效

     nWE                           读写使能                    低电平有效

     L(U)DM                       数据屏蔽

     L(U)DQS                     数据选通

     DQ0~DQ15                 数据线

     VDD/VSS                     电源与地

      VDDQ/VSSQ             数据输出电源与地

-----------------------------------------------------------------------------------------------------------------------------------------------     

三、S3C6410的DRAM控制器初始化

         DRAM控制器初始化流程:

       (1)以‘3’b100’执行memc_cmd,使得DRAM 控制器输入‘配置’状态。
      (2)写存储器时间参数,芯片配置和ID 配置寄存器。
      (3)等待200μs 来使SDRAM 电源和时钟稳定。当CPU 开始工作时,电源和时钟已经被稳定下来。
     (4)执行存储器初始化顺序。
     (5)以‘3’b000’执行memc_cmd,使得DRAM 控制器输入‘准备’状态。
     (6)在memc_stat 中检查存储器状态域,直到存储器状态变为‘2’b01’,即‘准备’。

       DDR 初始化流程:

      (1)在direct_cmd,以‘2’b10’执行mem_cmd,使得DRAM 控制器产生‘NOP’存储器命令。

       (2)在direct_cmd,以‘2’b00’执行mem_cmd,使得DRAM 控制器产生‘Prechargeall’存储器命令。
       (3)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Autorefresh’存储器命令。
      (4)在direct_cmd,以‘2’b10’执行mem_cmd,使得DRAM 控制器产生‘MRS’存储器命令。
               EMRS 块地址必须被设置。
      (5)在direct_cmd,以‘2’b10’执行mem_cmd,使得DRAM 控制器产生‘MRS’存储器命令。
               MRS 块地址必须被设置。
      (6)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Autorefresh’存储器命令。
      (7)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Autorefresh’存储器命令。
      (8)在direct_cmd,以‘2’b11’执行mem_cmd,使得DRAM 控制器产生‘Prechargeall’存储器命令。

        如下图所示:

 

五、DDR初始化程序

       在初始化DDR控制器,要结合DDR的芯片手册。通常需要从DDR芯片手册中获取如下参数:

       1、地址线的分布(列地址行地址分别各为多少条)。

       2、DDR的刷新周期(通常为7.8US)

       3、位宽二片DDR,即为32位

       4、DDR的访问时序参数

程序如下

头文件:

[cpp]   view plain copy
  1. #ifndef __COMMON_H  
  2. #define __COMMON_H  
  3.   
  4. #define vi *( volatile unsigned int   
  5.   
  6. #define set_zero( addr, bit (vi addr) &= << (bit) )  
  7. #define set_one( addr, bit (vi addr) |= << bit )  
  8.   
  9. #define set_bit( addr, bit, val (vi addr) (( vi addr)&=(~(1<<(bit))) (val)<<(bit) )  
  10.   
  11. #define set_2bit( addr, bit, val (vi addr) (( vi addr)&(~(3<<(bit))) (val)<<(bit) )  
  12.   
  13. #define set_nbit( addr, bit, len,  val \  
  14.     (vi addr) ((( vi addr)&(~(( ((1<<(len))-1) )<<(bit))))  (val)<<(bit) ))  
  15.   
  16. #define get_bit( addr, bit (( vi addr << (bit) ))  )  
  17.   
  18. #define get_val( addr, val (val) vi addr )  
  19. #define read_val( addr vi addr )  
  20. #define set_val( addr, val (vi addr) (val) )  
  21. #define or_val( addr, val (vi addr) |= (val)   
  22.   
  23. ///  
  24.   
  25. typedef unsigned char u8;  
  26. typedef unsigned short u16;  
  27. typedef unsigned int u32;  
  28.   
  29. // function declare  
  30.   
  31. int delay( int );  
  32.   
  33. #endif   

 

DDR 初始化程序

 

[cpp]   view plain copy
  1. #include "common.h"  
  2.   
  3. #define MEMCCMD 0x7e001004  
  4. #define P1REFRESH   0x7e001010  
  5. #define P1CASLAT    0x7e001014  
  6. #define MEM_SYS_CFG 0x7e00f120  
  7. #define P1MEMCFG    0x7e00100c  
  8. #define P1T_DQSS    0x7e001018  
  9. #define P1T_MRD     0x7e00101c  
  10. #define P1T_RAS     0x7e001020  
  11. #define P1T_RC      0x7e001024  
  12. #define P1T_RCD     0x7e001028  
  13. #define P1T_RFC     0x7e00102c  
  14. #define P1T_RP      0x7e001030  
  15. #define P1T_RRD     0x7e001034  
  16. #define P1T_WR      0x7e001038  
  17. #define P1T_WTR     0x7e00103c  
  18. #define P1T_XP      0x7e001040  
  19. #define P1T_XSR     0x7e001044  
  20. #define P1T_ESR     0x7e001048  
  21. #define P1MEMCFG2   0X7e00104c  
  22. #define P1_chip_0_cfg   0x7e001200  
  23.   
  24. #define P1MEMSTAT   0x7e001000  
  25. #define P1MEMCCMD   0x7e001004  
  26. #define P1DIRECTCMD 0x7e001008  
  27.   
  28.       
  29. #define HCLK    133000000  
  30.   
  31. #define nstoclk(ns) (ns/( 1000000000/HCLK)+1)  
  32.   
  33. int sdram_init( void  
  34.  
  35.     // 设置DRAM控制器状态为配置模式       
  36.     set_val( MEMCCMD, 0x4 );  
  37.   
  38.     // 设置DDR刷新周期为7.8US    
  39.     set_val( P1REFRESH, nstoclk(7800) );  
  40.   
  41.     //  设置DDR时序参数         
  42.     set_val( P1CASLAT, << );    
  43.     set_val( P1T_DQSS, 0x1 );   // 0.75 1.25时钟周期  
  44.     set_val( P1T_MRD, 0x2 ); //min=2个时钟周期  
  45.     set_val( P1T_RAS, nstoclk(45) );//45us  
  46.     set_val( P1T_RC, nstoclk(68) );//68us         
  47.   
  48.     u32 trcd nstoclk( 23 );  
  49.     set_val( P1T_RCD, trcd (( trcd << );//22.5us  
  50.     u32 trfc nstoclk( 80 );  
  51.     set_val( P1T_RFC, trfc trfc-3 << );     
  52.     u32 trp nstoclk( 23 );  
  53.     set_val( P1T_RP, trp trp << );   
  54.     set_val( P1T_RRD, nstoclk(15) );  
  55.     set_val( P1T_WR, nstoclk(15) );  
  56.     set_val( P1T_WTR, 0x7 );  
  57.     set_val( P1T_XP, 0x2 );  
  58.     set_val( P1T_XSR, nstoclk(120) );  
  59.     set_val( P1T_ESR, nstoclk(120) );  
  60.       
  61.     // set mem cfg   
  62.     set_nbit( P1MEMCFG, 0, 3, 0x2 );    
  63.   
  64.       
  65.     //把第0位开始的后三位清零,然后把这三位设置为ox2  
  66.       
  67.     set_nbit( P1MEMCFG, 3, 3, 0x2 );    
  68.       
  69.     set_zero( P1MEMCFG, );            
  70.     set_nbit( P1MEMCFG, 15, 3, 0x2 );   
  71.       
  72.     set_nbit( P1MEMCFG2, 0, 4, 0x5 );   
  73.     set_2bit( P1MEMCFG2, 6, 0x1 );        
  74.     set_nbit( P1MEMCFG2, 8, 3, 0x3 );     
  75.     set_2bit( P1MEMCFG2, 11, 0x1 );    //读延迟1 周期  
  76.   
  77.     set_one( P1_chip_0_cfg, 16 );         
  78.   
  79.     // DDR 初始化  
  80.     set_val( P1DIRECTCMD, 0xc0000 ); // NOP  
  81.     set_val( P1DIRECTCMD, 0x000 );  // precharge  
  82.     set_val( P1DIRECTCMD, 0x40000 );// auto refresh  
  83.     set_val( P1DIRECTCMD, 0x40000 );// auto refresh  
  84.     set_val( P1DIRECTCMD, 0xa0000 ); // EMRS  
  85.     set_val( P1DIRECTCMD, 0x80032 ); // MRS  
  86.   
  87.     set_val( MEM_SYS_CFG, 0x0 );  
  88.                       
  89.     // 使得DRAM 控制器输入‘准备’状态  
  90.     set_val( P1MEMCCMD, 0x000 );  
  91.   
  92.     // 直到存储器状态变为‘2’b01’,即‘准备  
  93.     while!(( read_val( P1MEMSTAT 0x3 == 0x1));  
  94.  

以下为本人找的:

  在s3c6410x文档中的第五章DRAMC中的5.4.1为初始化流程,5.4.3为ddr初始化流程

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值