專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

SDRam的初始化

作者:未知   來源:布冬冬 的空間   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月16日   【字體:

過年來的這一個(gè)月,都是在整著啟動(dòng)文件啊,SDRam初始化啊,Nor Flash初始化啊,還有程序在SDRAM中運(yùn)行等一干事情。

 

今天就記錄一下,我初始化SDRam過程中所學(xué)到的東西以及一些體會(huì)。本人還屬于菜鳥,有什么講得不好的地方,還希望指正指正哈。也是為了以后不會(huì)溫習(xí)之用。

 

雖然手里有一些樣例程序,但是真正理解起來還是很費(fèi)勁。

開發(fā)板:LPC1788,SDRAM:HY57V561620,據(jù)說已經(jīng)停產(chǎn)了~~~~ SDRAM大概都步驟都相同,只是有些芯片具體的參數(shù)需要查閱資料才能填寫。

 

初始化SDRAM的基本步驟:

1. 初始化引腳,PCONP,EMCDLYCTL,EMCControl寄存器,以及一些與芯片相關(guān)的參數(shù),還有EMCDynamicConfig0.

2. SDRAM上電后,等待100us或是200us,期間可以發(fā)送NOP命令。

3. 對(duì)所有banks預(yù)充電,PALL。

4. 執(zhí)行8次預(yù)充電:給EMCDynamicRefresh賦值,然后延時(shí)一段時(shí)間,令其有8次self-refresh的時(shí)間。(自己的理解)

5. 延時(shí)完畢后,對(duì)EMCDynamicRefresh寄存器賦值。對(duì)刷新寄存器的賦值如下:



6. 設(shè)置模式寄存器Mode Register。以虛讀的方式對(duì)其進(jìn)行賦值。如下:

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

至今還沒完全明白為什么0x23<<13?

7. 最后設(shè)置Normal 并延時(shí)一段時(shí)間。

這樣就差不多大功告成了。

在驗(yàn)證SDRAM是否設(shè)置正確的過程遇到一些麻煩。

1. 引腳沒有全部初始化完全。導(dǎo)致對(duì)SDRAM賦值的過程中,有一部分值不能被賦值上。

2. *(INT16U*)Addr++,這個(gè)過程中,如果Addr的初始值是0xA0000000的話,Addr就變成0xA0000002.

  同理,*(INT32U*)Addr++,這個(gè)過程中,如果Addr的初始值是0xA0000000的話,Addr就變成0xA0000004.

3. 先是對(duì)SDRAM賦值0,然后再對(duì)其賦值。

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

在對(duì)其進(jìn)行16bits的賦值再次驗(yàn)證一下就可以了。

關(guān)閉窗口

相關(guān)文章