ARM筆記: SDRAM內(nèi)存驅(qū)動(dòng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
SDRAM(Synchronous Dynamic Random Access Memory,同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器)也就是通常所說(shuō)的內(nèi)存。內(nèi)存的工作原理、控制時(shí)序、及相關(guān)控制器的配置方法一直是嵌入式系統(tǒng)學(xué)習(xí)、開(kāi)發(fā)過(guò)程中的一個(gè)難點(diǎn)。我們從其硬件的角度來(lái)分析其原理,然后再引出SDRAM的驅(qū)動(dòng)編寫(xiě)過(guò)程。
內(nèi)存是代碼的執(zhí)行空間,以PC機(jī)為例,程序是以文件的形式保存在硬盤(pán)里面的,程序在運(yùn)行之前先由操作系統(tǒng)裝載入內(nèi)存中,由于內(nèi)存是RAM(隨機(jī)訪(fǎng)問(wèn)存儲(chǔ)器),可以通過(guò)地址去定位一個(gè)字節(jié)的數(shù)據(jù),CPU在執(zhí)行程序時(shí)將PC的值設(shè)置為程序在內(nèi)存中的開(kāi)始地址,CPU會(huì)依次的從內(nèi)存里取址,譯碼,執(zhí)行,在內(nèi)存沒(méi)有被初始化之前,內(nèi)存好比是未建好的房子,是不能讀取和存儲(chǔ)數(shù)據(jù)的,因此我們要想讓MTOS運(yùn)行在內(nèi)存里必須進(jìn)行內(nèi)存的初始化。
通用存儲(chǔ)設(shè)備:
在介紹內(nèi)存工作原理之前有必要了解下存儲(chǔ)設(shè)備的存儲(chǔ)方式:ROM,RAM
lROM(Read-Only Memory):只讀存儲(chǔ)器,是一種只能讀出事先所存數(shù)據(jù)的固態(tài)半導(dǎo)體存儲(chǔ)器。其特性是一旦儲(chǔ)存資料就無(wú)法再將之改變或刪除。通常用在不需經(jīng)常變更資料的電子或電腦系統(tǒng)中,資料并且不會(huì)因?yàn)殡娫搓P(guān)閉而消失。如:PC里面的BIOS。
lRAM(Random Access Memory):隨機(jī)訪(fǎng)問(wèn)存儲(chǔ)器,存儲(chǔ)單元的內(nèi)容可按需隨意取出或存入,且存取的速度與存儲(chǔ)單元的位置無(wú)關(guān)的存儲(chǔ)器??梢岳斫鉃?,當(dāng)你給定一個(gè)隨機(jī)有效的訪(fǎng)問(wèn)地址,RAM會(huì)返回其存儲(chǔ)內(nèi)容(隨機(jī)尋址),它訪(fǎng)問(wèn)速度與地址的無(wú)關(guān)。這種存儲(chǔ)器在斷電時(shí)將丟失其存儲(chǔ)內(nèi)容,故主要用于存儲(chǔ)短時(shí)間內(nèi)隨機(jī)訪(fǎng)問(wèn)使用的程序。計(jì)算機(jī)系統(tǒng)里內(nèi)存地址是一個(gè)四字節(jié)對(duì)齊的地址(32位機(jī)),CPU的取指,執(zhí)行,存儲(chǔ)都是通過(guò)地址進(jìn)行的,因此它可以用來(lái)做內(nèi)存。
RAM按照硬件設(shè)計(jì)的不同,隨機(jī)存儲(chǔ)器又分為DRAM(Dynamic RAM)動(dòng)態(tài)隨機(jī)存儲(chǔ)器和SRAM(Static RAM)靜態(tài)隨機(jī)存儲(chǔ)器。
lDRAM:它的基本原件是小電容,電容可以在兩個(gè)極板上短時(shí)間內(nèi)保留電荷,可以通過(guò)兩極之間有無(wú)電壓差代表計(jì)算機(jī)里的0和1,由于電容的物理特性,要定期的為其充電,否則數(shù)據(jù)會(huì)丟失。對(duì)電容的充電過(guò)程叫做刷新,但是制作工藝較簡(jiǎn)單,體積小,便于集成化,經(jīng)常做為計(jì)算機(jī)里內(nèi)存制作原件。比如:PC的內(nèi)存,SDRAM, DDR, DDR2, DDR3等,缺點(diǎn):由于要定期刷新存儲(chǔ)介質(zhì),存取速度較慢。
lSRAM:它是一種具有靜止存取功能的內(nèi)存,不需要刷新電路即能保存它內(nèi)部存儲(chǔ)的數(shù)據(jù)。因此其存取速度快,但是體積較大,功耗大,成本高,常用作存儲(chǔ)容量不高,但存取速度快的場(chǎng)合,比如CPU的L1 cache,L2cache(一級(jí),二級(jí)緩存),寄存器。
為了滿(mǎn)足開(kāi)發(fā)的需要MINI2440在出廠(chǎng)時(shí)搭載了三種存儲(chǔ)介質(zhì):
(1)NOR FLASH(2M):ROM存儲(chǔ)器,通常用來(lái)保存BootLoader,引導(dǎo)系統(tǒng)啟動(dòng)
(2)NAND FLASH(256M,型號(hào)不一樣,Nandflash大小不一樣):保存操作系統(tǒng)映像文件和文件系統(tǒng)
(3)SDRAM(64M):內(nèi)存,執(zhí)行程序
lNORFLASH:它的特點(diǎn)是支持XIP芯片內(nèi)執(zhí)行(eXecute In Place),這樣應(yīng)用程序可以直接在Flash閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中,也就是說(shuō)可以隨機(jī)尋址。NOR FLASH的成本較高。
lNAND FLASH:它能提供極高的單元密度,可以達(dá)到高存儲(chǔ)密度,并且寫(xiě)入和擦除的速度也很快。其成本較低,不支持XIP??勺銮度胧嚼锏臄?shù)據(jù)存儲(chǔ)介質(zhì)。如:手機(jī)存儲(chǔ)卡,SD卡等。
1.1.1S3C2440存儲(chǔ)器地址段(Bank)S3C2440對(duì)外引出了27根地址線(xiàn)ADDR0~ADDR26,它最多能夠?qū)ぶ?28MB,而S3C2440的尋址空間可以達(dá)到1GB,這是由于S3C2440將1GB的地址空間分成了8個(gè)BANKS(Bank0~Bank7),其中每一個(gè)BANK對(duì)應(yīng)一根片選信號(hào)線(xiàn)nGCS0~nGCS7,當(dāng)訪(fǎng)問(wèn)BANKx的時(shí)候,nGCSx管腳電平拉低,用來(lái)選中外接設(shè)備,S3C2440通過(guò)8根選信號(hào)線(xiàn)和27根地址線(xiàn),就可以訪(fǎng)問(wèn)1GB。如圖2-48所示。
圖2-48 S3C2440存儲(chǔ)器BANK
如圖所示,左側(cè)圖對(duì)應(yīng)不使用Nandflash啟動(dòng)時(shí)(通過(guò)跳線(xiàn)設(shè)置),存儲(chǔ)器Bank分布圖,通常在這種啟動(dòng)方式里選擇Norflash啟動(dòng),將Norflash焊接在Bank0,系統(tǒng)上電后,CPU從Bank0的開(kāi)始地址0x00000000開(kāi)始取指運(yùn)行。
上圖右側(cè)是選擇從Nandflash引導(dǎo)啟動(dòng)(通過(guò)跳線(xiàn)設(shè)置),系統(tǒng)上電后,CPU會(huì)自動(dòng)將Nandflash里前4K的數(shù)據(jù)復(fù)制到S3C2440內(nèi)部一個(gè)4K大小SRAM類(lèi)型存儲(chǔ)器里(叫做Steppingstone),然后從Steppingstone取指啟動(dòng)。
其中Bank0~Bank5可以焊接ROM或SRAM類(lèi)型存儲(chǔ)器,Bank6~Bank7可以焊接ROM,SRAM,SDRAM類(lèi)型存儲(chǔ)器,也就是說(shuō),S3C2440的SDRAM內(nèi)存應(yīng)該焊接在Bank6~Bank7上,最大支持內(nèi)存256M,Bank0~Bank5通常焊接一些用于引導(dǎo)系統(tǒng)啟動(dòng)小容量ROM,具體焊接什么樣存儲(chǔ)器,多大容量,根據(jù)每個(gè)開(kāi)發(fā)板生產(chǎn)商不同而不同,比如MINI2440開(kāi)發(fā)板將2M的Norflash焊接在了Bank0上,用于存放系統(tǒng)引導(dǎo)程序Bootloader,將兩片32M,16Bit位寬SDRAM內(nèi)存焊接在Bank6和Bank7上,并聯(lián)形成64M,32位內(nèi)存。
由于S3C2440是32位芯片,理論上講可以達(dá)到4GB的尋址范圍,除去上述8個(gè)BANK用于連接外部設(shè)備,還有一部分的地址空間是用于設(shè)備特殊功能寄存器,其余地址沒(méi)有被使用。
表2-14 S3C2440設(shè)備寄存器地址空間
外接設(shè)備
起始地址
結(jié)束地址
存儲(chǔ)控制器
0x48000000
0x48000030
USB Host控制器
0x49000000
0x49000058
中斷控制器
0x4A000000
0x4A00001C
DMA
0x4B000000
0x4B0000E0
時(shí)鐘和電源管理
0x4C000000
0x4C000014
LCD控制器
0x4D000000
0x4D000060
NAND FLASH控制器
0x4E000000
0x4E000014
攝像頭接口
0x4F000000
0x4F0000A0
UART
0x50000000
0x50008028
脈寬調(diào)制計(jì)時(shí)器
0x51000000
0x51000040
USB設(shè)備
0x52000140
0x5200026F
WATCHDOG計(jì)時(shí)器
0x53000000
0x53000008
IIC控制器
0x54000000
0x5400000C
IIS控制器
0x55000000
0x55000012
I/O端口
0x56000000
0x560000B0
實(shí)時(shí)時(shí)鐘RTC
0x57000040
0x5700008B
A/D轉(zhuǎn)換器
0x58000000
0x58000010
SPI
0x59000000
0x59000034
SD接口
0x5A000000
0x5A000040
AC97音頻編碼接口
0x5B000000
0x5B00001C
1.1.2SDRAM內(nèi)存工作原理SDRAM的內(nèi)部是一個(gè)存儲(chǔ)陣列。陣列就如同表格一樣,將數(shù)據(jù)“填”進(jìn)去。在數(shù)據(jù)讀寫(xiě)時(shí)和表格的檢索原理一樣,先指定一個(gè)行(Row),再指定一個(gè)列(Column),我們就可以準(zhǔn)確地找到所需要的單元格,這就是內(nèi)存芯片尋址的基本原理,如圖2-49所示。
圖2-49內(nèi)存行,列地址尋址示意圖
這個(gè)單元格(存儲(chǔ)陣列)就叫邏輯Bank(Logical Bank,下文簡(jiǎn)稱(chēng)L-Bank)。由于技術(shù)、成本等原因,不可能只做一個(gè)全容量的L-Bank,而且最重要的是,由于SDRAM的工作原理限制,單一的L-Ban k將會(huì)造成非常嚴(yán)重的尋址沖突,大幅降低內(nèi)存效率。所以人們?cè)赟DRAM內(nèi)部分割成多個(gè)L-Bank,目前基本都是4個(gè)(這也是SDRAM規(guī)范中的最高L-Bank數(shù)量),由此可見(jiàn),在進(jìn)行尋址時(shí)就要先確定是哪個(gè)L-Bank,然后在這個(gè)選定的L-Bank中選擇相應(yīng)的行與列進(jìn)行尋址。因此對(duì)內(nèi)存的訪(fǎng)問(wèn),一次只能是一個(gè)L-Bank工作。如圖2-50:
圖2-50內(nèi)存存儲(chǔ)單元
當(dāng)對(duì)內(nèi)存進(jìn)行操作時(shí)(見(jiàn)下圖),先要確定操作L-Bank,因此要對(duì)L-Bank進(jìn)行選擇。在內(nèi)存芯片的外部管腳上多出了兩個(gè)管腳BA0, BA1,用來(lái)片選4個(gè)L-Bank。如前所述,32位的地址長(zhǎng)度由于其存儲(chǔ)結(jié)構(gòu)特點(diǎn),分成了行地址和列地址。通過(guò)下面的內(nèi)存結(jié)構(gòu)圖可知,內(nèi)存外接管腳地址線(xiàn)只有13根地址線(xiàn)A0~A12,它最多只能尋址8M內(nèi)存空間,到底使用什么機(jī)制來(lái)實(shí)現(xiàn)對(duì)64M內(nèi)存空間進(jìn)行尋址的呢?SDRAM的行地址線(xiàn)和列地址線(xiàn)是分時(shí)復(fù)用的,即地址要分兩次送出,先送出行地址(nSRAS行有效操作),再送出列地址(nSCAS列有效操作)。這樣,可以大幅度減少地址線(xiàn)的數(shù)目,提高器件的性能和制作工藝復(fù)雜度。但尋址過(guò)程也會(huì)因此而變得復(fù)雜。實(shí)際上,現(xiàn)在的SDRAM一般都以L(fǎng)-Bank為基本尋址對(duì)象的。由L-Bank地址線(xiàn)BAn控制L-Bank間的選擇,行地址線(xiàn)和列地址線(xiàn)貫穿連接所有的L-Bank,每個(gè)L-Bank的數(shù)據(jù)的寬度和整個(gè)存儲(chǔ)器的寬度相同,這樣,可以加快數(shù)據(jù)的存儲(chǔ)速度。同時(shí),BAn還可以使未被選中的L-Bank工作于低功耗的模式下,從而降低器件的功耗。
圖2-51 HY57561620內(nèi)部結(jié)構(gòu)圖
開(kāi)發(fā)板內(nèi)存控制器管腳接線(xiàn)(以MINI2440開(kāi)發(fā)板為例):
(1)確定BA0、BA1的接線(xiàn)
表2-15 BA0、BA1接線(xiàn)
Bank Size:外接內(nèi)存容量大?。℉Y57561620是4Mbit*16bit*4Bank*2Chips/8=64MB)
Bus Width:總線(xiàn)寬度 (兩片16位HY57561620,并聯(lián)成32位)
Base Component:?jiǎn)蝹€(gè)芯片容量(bit)(256Mb)
Memory Configration:內(nèi)存配置((4M*16*4banks)*2Chips )
由硬件手冊(cè)Bank Address管腳連接配置表可知,使用A[25:24]兩根地址線(xiàn)作為Bank片選信號(hào),正好兩根接線(xiàn)可以片選每個(gè)存儲(chǔ)單元的4個(gè)BANKS。
(2)確定其它接線(xiàn)
SDRAM內(nèi)存是焊接在BANK6~BANK7上的,其焊接管腳,如圖2-52:
圖2-52 S3C2440 16位寬內(nèi)存芯片
上圖是S3C2440提供的兩片16位芯片并聯(lián)連接示意圖,An是CPU地址總線(xiàn),其中A2~A14為內(nèi)存芯片尋址總線(xiàn),之所以地址尋址總線(xiàn)從A2開(kāi)始是因?yàn)閮?nèi)存地址都是按字節(jié)對(duì)齊的,,A24,A25為L(zhǎng)-Bank片選信號(hào),Dn為CPU數(shù)據(jù)總線(xiàn),其它為對(duì)應(yīng)控制信號(hào)線(xiàn)。
表2-16內(nèi)存芯片各管腳說(shuō)明
外接管腳名
內(nèi)接管腳名
全稱(chēng)
描述
A2~A14
A0~A12
Address
地址線(xiàn)
D0 ~D31
DQ0~