专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

SDRam的初始化

作者:未知   来源:布冬冬 的空间   点击数:  更新时间:2014年08月16日   【字体:

过年来的这一个月,都是在整着启动文件啊,SDRam初始化啊,Nor Flash初始化啊,还有程序在SDRAM中运行等一干事情。

 

今天就记录一下,我初始化SDRam过程中所学到的东西以及一些体会。本人还属于菜鸟,有什么讲得不好的地方,还希望指正指正哈。也是为了以后不会温习之用。

 

虽然手里有一些样例程序,但是真正理解起来还是很费劲。

开发板:LPC1788,SDRAM:HY57V561620,据说已经停产了~~~~ SDRAM大概都步骤都相同,只是有些芯片具体的参数需要查阅资料才能填写。

 

初始化SDRAM的基本步骤:

1. 初始化引脚,PCONP,EMCDLYCTL,EMCControl寄存器,以及一些与芯片相关的参数,还有EMCDynamicConfig0.

2. SDRAM上电后,等待100us或是200us,期间可以发送NOP命令。

3. 对所有banks预充电,PALL。

4. 执行8次预充电:给EMCDynamicRefresh赋值,然后延时一段时间,令其有8次self-refresh的时间。(自己的理解)

5. 延时完毕后,对EMCDynamicRefresh寄存器赋值。对刷新寄存器的赋值如下:



6. 设置模式寄存器Mode Register。以虚读的方式对其进行赋值。如下:

 
  *(INT32U*) EMCDynamicControl = 0x00000083;
 
  dummy = *((volatile INT32U*)( DynamicMemoryBaseAddr|(0x23 << 13)));

至今还没完全明白为什么0x23<<13?

7. 最后设置Normal 并延时一段时间。

这样就差不多大功告成了。

在验证SDRAM是否设置正确的过程遇到一些麻烦。

1. 引脚没有全部初始化完全。导致对SDRAM赋值的过程中,有一部分值不能被赋值上。

2. *(INT16U*)Addr++,这个过程中,如果Addr的初始值是0xA0000000的话,Addr就变成0xA0000002.

  同理,*(INT32U*)Addr++,这个过程中,如果Addr的初始值是0xA0000000的话,Addr就变成0xA0000004.

3. 先是对SDRAM赋值0,然后再对其赋值。

for(i = 0; i < (SDRam_Size/4); i++)
  {
     *SDRamAdd8++ = 0x11;
     *SDRamAdd8++ = 0x22;
     *SDRamAdd8++ = 0x33;
     *SDRamAdd8++ = 0x44;
  }

 for(i = 0; i < (SDRam_Size/4); i++)
  {
    SDRamAdd32--; 
    if( *(SDRamAdd32) != 0x44332211)
      {
         str = "Initialization of 8bits SDRam is wrong!";
         putchars(str);
      }
  }

在对其进行16bits的赋值再次验证一下就可以了。

关闭窗口

相关文章