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