過年來的這一個(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)行賦值。如下:
至今還沒完全明白為什么0x23<<13?
7. 最后設(shè)置Normal 并延時(shí)一段時(shí)間。
這樣就差不多大功告成了。
在驗(yàn)證SDRAM是否設(shè)置正確的過程遇到一些麻煩。
1. 引腳沒有全部初始化完全。導(dǎo)致對(duì)SDRAM賦值的過程中,有一部分值不能被賦值上。
2. *(INT16U*)Addr++,這個(gè)過程中,如果Addr的初始值是0xA0000000的話,Addr就變成0xA0000002.
3. 先是對(duì)SDRAM賦值0,然后再對(duì)其賦值。
for(i = 0; i < (SDRam_Size/4); i++)
在對(duì)其進(jìn)行16bits的賦值再次驗(yàn)證一下就可以了。