新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 存儲(chǔ)、NAND FLASH控制器實(shí)驗(yàn)(S3C2410)

存儲(chǔ)、NAND FLASH控制器實(shí)驗(yàn)(S3C2410)

作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
本實(shí)驗(yàn)介紹如何使用SDRAM,這需要設(shè)置13個(gè)寄存器。呵呵,別擔(dān)心,這些寄存器很多是類似的,并且由于我們只使用了BANK6,大部分的寄存器我們不必理會(huì):
1.BWSCON:對(duì)應(yīng)BANK0-BANK7,每BANK使用4位。這4位分別表示:
a.STx:?jiǎn)?dòng)/禁止SDRAM的數(shù)據(jù)掩碼引腳,對(duì)于SDRAM,此位為0;對(duì)于SRAM,此位為1。
b.WSx:是否使用存儲(chǔ)器的WAIT信號(hào),通常設(shè)為0
c.DWx:使用兩位來設(shè)置存儲(chǔ)器的位寬:00-8位,01-16位,10-32位,11-保留。
d.比較特殊的是BANK0對(duì)應(yīng)的4位,它們由硬件跳線決定,只讀。
對(duì)于本開發(fā)板,使用兩片容量為32Mbyte、位寬為16的SDRAM組成容量為64Mbyte、位寬為32的存儲(chǔ)器,所以其BWSCON相應(yīng)位為:0010。對(duì)于本開發(fā)板,BWSCON可設(shè)為0x22111110:其實(shí)我們只需要將BANK6對(duì)應(yīng)的4位設(shè)為0010即可,其它的是什么值沒什么影響,這個(gè)值是參考手冊(cè)上給出的。
2.BANKCON0-BANKCON5:我們沒用到,使用默認(rèn)值0x00000700即可
3.BANKCON6-BANKCON7:設(shè)為0x00018005
在8個(gè)BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7與BANKCON0-5有點(diǎn)不同:
a.MT([16:15]):用于設(shè)置本BANK外接的是SRAM還是SDRAM:SRAM-0b00,SDRAM-0b11
b.當(dāng)MT=0b11時(shí),還需要設(shè)置兩個(gè)參數(shù):
Trcd([3:2 R A S to CAS delay,設(shè)為推薦值0b01
SCAN([1:0]):SDRAM的列地址位數(shù), 對(duì)于本開發(fā)板使用的SDRAM HY57V561620CT-H,列地址位數(shù)為9,所以SCAN=0b01。如果使用其他型號(hào)的SDRAM,您需要查看它的數(shù)據(jù)手冊(cè)來決定SCAN的取值:00-8位,01-9位,10-10位
4.REFRESH(SDRAM refresh control register):設(shè)為0x008e0000+ R_CNT其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下計(jì)算(SDRAM時(shí)鐘頻率就是HCLK):
R_CNT = 2^11 + 1 – SDRAM時(shí)鐘頻率(MHz) *SDRAM刷新周期(uS)
在未使用PLL時(shí),SDRAM 時(shí)鐘頻率等于晶振頻率12MHz;SDRAM的刷新周期在SDRAM的數(shù)據(jù)手冊(cè)上有標(biāo)明,在本開發(fā)板使用的SDRAM HY57V561620CT-H的數(shù)據(jù)手冊(cè)上,可看見這么一行“8192 refresh cycles /64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。
對(duì)于本實(shí)驗(yàn),R_CNT = 2^11 + 1 – 12 * 7.8125 =1955,
REFRESH=0x008e0000 + 1955 = 0x008e07a3
5.BANKSIZE:0x000000b2
位[7]=1:Enable burst operation
位[5]=1:SDRAM power down mode enable
位[4]=1:SCLK is active only during the access(recommended)
位[2:1]=010:BANK6、BANK7對(duì)應(yīng)的地址空間與BANK0-5不同。BANK0-5的地址空間都是固定的128M,地址范圍是(x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可變的,您可以從S3C2410數(shù)據(jù)手冊(cè)第5章“Table5-1.Bank6/7 Addresses”中了解到BANK6、7的地址范圍與地址空間的關(guān)系。本開發(fā)板僅使用BANK6的64M空間,我們可以令位[2:1]=010(128M/128M)或001(64M/64M):這沒關(guān)系,多出來的空間程序會(huì)檢測(cè)出來,不會(huì)發(fā)生使用不存在的內(nèi)存的情況——后面介紹到的bootloader和linux內(nèi)核都會(huì)作內(nèi)存檢測(cè)。
位[6]、位[3]沒有使用

6.MRSRB6、MRSRB7:0x00000030
能讓我們修改的只有位[6:4](CL),SDRAM HY57V561620CT-H不支持CL=1的情況,所以位[6:4]取值為010(CL=2)或011(CL=3)。
只要我們?cè)O(shè)置好了上述13個(gè)寄存器,往后SDRAM的使用就很簡(jiǎn)單了。本實(shí)驗(yàn)先使用匯編語言設(shè)置好SDRAM,然后把程序本身從Steppingstone(還記得嗎?本節(jié)開始的時(shí)候提到過,復(fù)位之后NAND
Flash開頭的4k代碼會(huì)被自動(dòng)地復(fù)制到這里)復(fù)制到SDRAM處,然后跳到SDRAM中執(zhí)行。
本實(shí)驗(yàn)源代碼在SDRAM目錄中,
head.s開頭的代碼如下:
1 bl disable_watch_dog
2 bl memsetup
3 bl copy_steppingstone_to_sdram
4 ldr pc, =set_sp @跳到SDRAM中繼續(xù)執(zhí)行
5 set_sp:
6 ldr sp, =0x34000000 @設(shè)置堆棧
7 bl main @跳轉(zhuǎn)到C程序main函數(shù)
8 halt_loop:
9 b halt_loop
為了讓程序結(jié)構(gòu)簡(jiǎn)單一點(diǎn),我都使用函數(shù)調(diào)用的方式。第一條指令是禁止WATCH DOG,往WTCON寄存器(地址0x53000000)寫入0即可禁止WATCH DOG。第二條指令設(shè)置本節(jié)開頭所描述的13個(gè)寄存器,以便使用SDRAM。往下程序做的事情就是:將Steppingstone中的代碼復(fù)制到SDRAM中(起始地址為 0x30000000),然后向pc寄存器直接賦值跳到SDRAM中執(zhí)行下一條指令“ldr sp, =0x34000000”。


關(guān)鍵詞: 存儲(chǔ)NANDFLASHS3C241

評(píng)論


技術(shù)專區(qū)

關(guān)閉