<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > S3C2440的SDRAM驅動(dòng) 

S3C2440的SDRAM驅動(dòng) 

作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò ) 收藏

SDRAM(Synchronous Dynamic Random Access Memory,同步動(dòng)態(tài)隨機存儲器)也就是通常所說(shuō)的內存。內存的工作原理、控制時(shí)序、及相關(guān)控制器的配置方法一直是嵌入式系統學(xué)習、開(kāi)發(fā)過(guò)程中的一個(gè)難點(diǎn)。我們從其硬件的角度來(lái)分析其原理,然后再引出SDRAM的驅動(dòng)編寫(xiě)過(guò)程。

本文引用地址:http://dyxdggzs.com/article/201611/317482.htm

內存是代碼的執行空間,以PC機為例,程序是以文件的形式保存在硬盤(pán)里面的,程序在運行之前先由操作系統裝載入內存中,由于內存是RAM(隨機訪(fǎng)問(wèn)存儲器),可以通過(guò)地址去定位一個(gè)字節的數據,CPU在執行程序時(shí)將PC的值設置為程序在內存中的開(kāi)始地址,CPU會(huì )依次的從內存里取址,譯碼,執行,在內存沒(méi)有被初始化之前,內存好比是未建好的房子,是不能讀取和存儲數據的,因此我們要想讓MTOS運行在內存里必須進(jìn)行內存的初始化。

通用存儲設備:

在介紹內存工作原理之前有必要了解下存儲設備的存儲方式:ROM,RAM

lROM(Read-Only Memory):只讀存儲器,是一種只能讀出事先所存數據的固態(tài)半導體存儲器。其特性是一旦儲存資料就無(wú)法再將之改變或刪除。通常用在不需經(jīng)常變更資料的電子或電腦系統中,資料并且不會(huì )因為電源關(guān)閉而消失。如:PC里面的BIOS。

lRAM(Random Access Memory):隨機訪(fǎng)問(wèn)存儲器,存儲單元的內容可按需隨意取出或存入,且存取的速度與存儲單元的位置無(wú)關(guān)的存儲器??梢岳斫鉃?,當你給定一個(gè)隨機有效的訪(fǎng)問(wèn)地址,RAM會(huì )返回其存儲內容(隨機尋址),它訪(fǎng)問(wèn)速度與地址的無(wú)關(guān)。這種存儲器在斷電時(shí)將丟失其存儲內容,故主要用于存儲短時(shí)間內隨機訪(fǎng)問(wèn)使用的程序。計算機系統里內存地址是一個(gè)四字節對齊的地址(32位機),CPU的取指,執行,存儲都是通過(guò)地址進(jìn)行的,因此它可以用來(lái)做內存。

RAM按照硬件設計的不同,隨機存儲器又分為DRAM(Dynamic RAM)動(dòng)態(tài)隨機存儲器和SRAM(Static RAM)靜態(tài)隨機存儲器。

lDRAM:它的基本原件是小電容,電容可以在兩個(gè)極板上短時(shí)間內保留電荷,可以通過(guò)兩極之間有無(wú)電壓差代表計算機里的0和1,由于電容的物理特性,要定期的為其充電,否則數據會(huì )丟失。對電容的充電過(guò)程叫做刷新,但是制作工藝較簡(jiǎn)單,體積小,便于集成化,經(jīng)常做為計算機里內存制作原件。比如:PC的內存,SDRAM, DDR, DDR2, DDR3等,缺點(diǎn):由于要定期刷新存儲介質(zhì),存取速度較慢。

lSRAM:它是一種具有靜止存取功能的內存,不需要刷新電路即能保存它內部存儲的數據。因此其存取速度快,但是體積較大,功耗大,成本高,常用作存儲容量不高,但存取速度快的場(chǎng)合,比如CPU的L1 cache,L2cache(一級,二級緩存),寄存器。

為了滿(mǎn)足開(kāi)發(fā)的需要MINI2440在出廠(chǎng)時(shí)搭載了三種存儲介質(zhì):

(1)NOR FLASH(2M):ROM存儲器,通常用來(lái)保存BootLoader,引導系統啟動(dòng)

(2)NAND FLASH(256M,型號不一樣,Nandflash大小不一樣):保存操作系統映像文件和文件系統

(3)SDRAM(64M):內存,執行程序

lNORFLASH:它的特點(diǎn)是支持XIP芯片內執行(eXecute In Place),這樣應用程序可以直接在Flash閃存內運行,不必再把代碼讀到系統RAM中,也就是說(shuō)可以隨機尋址。NOR FLASH的成本較高。

lNAND FLASH:它能提供極高的單元密度,可以達到高存儲密度,并且寫(xiě)入和擦除的速度也很快。其成本較低,不支持XIP??勺?strong>嵌入式里的數據存儲介質(zhì)。如:手機存儲卡,SD卡等。

1.1.1S3C2440存儲器地址段(Bank)

S3C2440對外引出了27根地址線(xiàn)ADDR0~ADDR26,它最多能夠尋址128MB,而S3C2440的尋址空間可以達到1GB,這是由于S3C2440將1GB的地址空間分成了8個(gè)BANKS(Bank0~Bank7),其中每一個(gè)BANK對應一根片選信號線(xiàn)nGCS0~nGCS7,當訪(fǎng)問(wèn)BANKx的時(shí)候,nGCSx管腳電平拉低,用來(lái)選中外接設備,S3C2440通過(guò)8根選信號線(xiàn)和27根地址線(xiàn),就可以訪(fǎng)問(wèn)1GB。如圖2-48所示。

圖2-48 S3C2440存儲器BANK

如圖所示,左側圖對應不使用Nandflash啟動(dòng)時(shí)(通過(guò)跳線(xiàn)設置),存儲器Bank分布圖,通常在這種啟動(dòng)方式里選擇Norflash啟動(dòng),將Norflash焊接在Bank0,系統上電后,CPU從Bank0的開(kāi)始地址0x00000000開(kāi)始取指運行。

上圖右側是選擇從Nandflash引導啟動(dòng)(通過(guò)跳線(xiàn)設置),系統上電后,CPU會(huì )自動(dòng)將Nandflash里前4K的數據復制到S3C2440內部一個(gè)4K大小SRAM類(lèi)型存儲器里(叫做Steppingstone),然后從Steppingstone取指啟動(dòng)。

其中Bank0~Bank5可以焊接ROM或SRAM類(lèi)型存儲器,Bank6~Bank7可以焊接ROM,SRAM,SDRAM類(lèi)型存儲器,也就是說(shuō),S3C2440的SDRAM內存應該焊接在Bank6~Bank7上,最大支持內存256M,Bank0~Bank5通常焊接一些用于引導系統啟動(dòng)小容量ROM,具體焊接什么樣存儲器,多大容量,根據每個(gè)開(kāi)發(fā)板生產(chǎn)商不同而不同,比如MINI2440開(kāi)發(fā)板將2M的Norflash焊接在了Bank0上,用于存放系統引導程序Bootloader,將兩片32M,16Bit位寬SDRAM內存焊接在Bank6和Bank7上,并聯(lián)形成64M,32位內存。

由于S3C2440是32位芯片,理論上講可以達到4GB的尋址范圍,除去上述8個(gè)BANK用于連接外部設備,還有一部分的地址空間是用于設備特殊功能寄存器,其余地址沒(méi)有被使用。

表2-14 S3C2440設備寄存器地址空間

外接設備

起始地址

結束地址

存儲控制器

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

脈寬調制計時(shí)器

0x51000000

0x51000040

USB設備

0x52000140

0x5200026F

WATCHDOG計時(shí)器

0x53000000

0x53000008

IIC控制器

0x54000000

0x5400000C

IIS控制器

0x55000000

0x55000012

I/O端口

0x56000000

0x560000B0

實(shí)時(shí)時(shí)鐘RTC

0x57000040

0x5700008B

A/D轉換器

0x58000000

0x58000010

SPI

0x59000000

0x59000034

SD接口

0x5A000000

0x5A000040

AC97音頻編碼接口

0x5B000000

0x5B00001C

1.1.2SDRAM內存工作原理

SDRAM的內部是一個(gè)存儲陣列。陣列就如同表格一樣,將數據“填”進(jìn)去。在數據讀寫(xiě)時(shí)和表格的檢索原理一樣,先指定一個(gè)行(Row),再指定一個(gè)列(Column),我們就可以準確地找到所需要的單元格,這就是內存芯片尋址的基本原理,如圖2-49所示。

圖2-49內存行,列地址尋址示意圖

這個(gè)單元格(存儲陣列)就叫邏輯Bank(Logical Bank,下文簡(jiǎn)稱(chēng)L-Bank)。由于技術(shù)、成本等原因,不可能只做一個(gè)全容量的L-Bank,而且最重要的是,由于SDRAM的工作原理限制,單一的L-Ban k將會(huì )造成非常嚴重的尋址沖突,大幅降低內存效率。所以人們在SDRAM內部分割成多個(gè)L-Bank,目前基本都是4個(gè)(這也是SDRAM規范中的最高L-Bank數量),由此可見(jiàn),在進(jìn)行尋址時(shí)就要先確定是哪個(gè)L-Bank,然后在這個(gè)選定的L-Bank中選擇相應的行與列進(jìn)行尋址。因此對內存的訪(fǎng)問(wèn),一次只能是一個(gè)L-Bank工作。如圖2-50:

圖2-50內存存儲單元

當對內存進(jìn)行操作時(shí)(見(jiàn)下圖),先要確定操作L-Bank,因此要對L-Bank進(jìn)行選擇。在內存芯片的外部管腳上多出了兩個(gè)管腳BA0, BA1,用來(lái)片選4個(gè)L-Bank。如前所述,32位的地址長(cháng)度由于其存儲結構特點(diǎn),分成了行地址和列地址。通過(guò)下面的內存結構圖可知,內存外接管腳地址線(xiàn)只有13根地址線(xiàn)A0~A12,它最多只能尋址8M內存空間,到底使用什么機制來(lái)實(shí)現對64M內存空間進(jìn)行尋址的呢?SDRAM的行地址線(xiàn)和列地址線(xiàn)是分時(shí)復用的,即地址要分兩次送出,先送出行地址(nSRAS行有效操作),再送出列地址(nSCAS列有效操作)。這樣,可以大幅度減少地址線(xiàn)的數目,提高器件的性能和制作工藝復雜度。但尋址過(guò)程也會(huì )因此而變得復雜。實(shí)際上,現在的SDRAM一般都以L(fǎng)-Bank為基本尋址對象的。由L-Bank地址線(xiàn)BAn控制L-Bank間的選擇,行地址線(xiàn)和列地址線(xiàn)貫穿連接所有的L-Bank,每個(gè)L-Bank的數據的寬度和整個(gè)存儲器的寬度相同,這樣,可以加快數據的存儲速度。同時(shí),BAn還可以使未被選中的L-Bank工作于低功耗的模式下,從而降低器件的功耗。

圖2-51 HY57561620內部結構圖

開(kāi)發(fā)板內存控制器管腳接線(xiàn)(以MINI2440開(kāi)發(fā)板為例):

(1)確定BA0、BA1的接線(xiàn)

表2-15 BA0、BA1接線(xiàn)

Bank Size:外接內存容量大?。℉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:內存配置((4M*16*4banks)*2Chips )

由硬件手冊Bank Address管腳連接配置表可知,使用A[25:24]兩根地址線(xiàn)作為Bank片選信號,正好兩根接線(xiàn)可以片選每個(gè)存儲單元的4個(gè)BANKS。

(2)確定其它接線(xiàn)

SDRAM內存是焊接在BANK6~BANK7上的,其焊接管腳,如圖2-52:

圖2-52 S3C2440 16位寬內存芯片

上圖是S3C2440提供的兩片16位芯片并聯(lián)連接示意圖,An是CPU地址總線(xiàn),其中A2~A14為內存芯片尋址總線(xiàn),之所以地址尋址總線(xiàn)從A2開(kāi)始是因為內存地址都是按字節對齊的,,A24,A25為L(cháng)-Bank片選信號,Dn為CPU數據總線(xiàn),其它為對應控制信號線(xiàn)。

表2-16內存芯片各管腳說(shuō)明

外接管腳名

內接管腳名

全稱(chēng)

描述

A2~A14

A0~A12

Address

地址線(xiàn)

D0 ~D31

DQ0~DQ31

Data Input/Output

數據線(xiàn)

A24,A25

BA0,BA1

Bank Address

L-BANK片選信號

DQM0~DQM3

LDQM, UDQM

Data Input/Output Mask

高,低字節數據掩碼信號

SCKE

SCKE

Clock Enable

輸入時(shí)鐘有效信號

SCLK

SCLK

Clock

輸入時(shí)鐘

nSCS0

nSCS

General Chip Select

片選信號(它與nGCS6是同一管腳的兩個(gè)功能)

nSRAS

nSRAS

Row Address Strobe

行地址選通信號

nSCAS

nSCAS

Column Address Strobe

列地址選通信號

nWE

newnWE

Write Enable

寫(xiě)入有效信號

我們通過(guò)S3C2440 16位寬內存芯片接線(xiàn)圖可以看出,兩片內存芯片只有兩個(gè)地方不一樣,LDQM, UDQM和數據總線(xiàn)DQn接線(xiàn)方式不一樣。

由于存儲芯片位寬為16位,一次可以進(jìn)行兩個(gè)字節的讀取。但是,通常操作系統里最小尋址單位是1字節,因此內存控制器必須要保證可以訪(fǎng)問(wèn)內存里每一個(gè)字節。UDQM,LDQM分別代表16位數據的高,低字節讀取信號,

當讀取數據時(shí),LDQM /UDQM分別用來(lái)控制16位數據中高低字節能否被讀取,當LDQM /UDQM為低電平時(shí),對應的高/低字節就可以被讀取,如果LDQM /UDQM為高電平時(shí),對應的高/低字節就不能被讀取。

當向內存里寫(xiě)入數據時(shí),LDQM /UDQM控制數據能否被寫(xiě)入,當LDQM /UDQM為低電平時(shí),對應的高/低字節就可以被寫(xiě)入,如果LDQM /UDQM為高電平時(shí),對應的高/低字節就不能被寫(xiě)入。通過(guò)對LDQM /UDQM信號的控制可以控制對兩個(gè)存儲芯片存儲數據,由于兩個(gè)存儲單元的地址線(xiàn)是通用的,他們都能接收到CPU發(fā)出的地址信號,但是,發(fā)給兩個(gè)存儲單元的LDQM /UDQM信號是不同的,以此來(lái)區分一個(gè)字的高低字節。

S3C2440A為32位CPU,也就是說(shuō)其數據總線(xiàn)和地址總線(xiàn)寬度都是32位(可以理解為32根線(xiàn)一端連接CPU內部,另外一端連接向內存控制器),那么內存數據的輸入/輸出端也要保證是32位總線(xiàn),MINI2440上采用兩片16位寬總線(xiàn)內存芯片并聯(lián)構成32位總線(xiàn)。其中一個(gè)芯片連接到CPU數據總線(xiàn)的低16位,另外一個(gè)芯片連接到數據總線(xiàn)上的高16位,并聯(lián)成32位總線(xiàn),因此兩個(gè)芯片的輸入/輸出總線(xiàn)連接到CPU總線(xiàn)上的不同管腳上。

1.1.3SDRAM的讀操作

SDRAM進(jìn)行讀操作時(shí),先向地址線(xiàn)上送上要讀取數據的地址,通過(guò)前面的知識了解到,地址被分成3部分,行地址,列地址,L-Bank片選信號。片選(L-Bank的定址)操作和行有效操作可以同時(shí)進(jìn)行。

在CS、L-Bank定址的同時(shí),RAS(nSRAS行地址選通信號)也處于有效狀態(tài)。此時(shí)An地址線(xiàn)則發(fā)送具體的行地址。A0~A12,共有13根地址線(xiàn)(可表示8192行),A0~A12的不同數值就確定了具體的行地址。由于行有效的同時(shí)也是相應L-Bank有效,所以行有效也可稱(chēng)為L(cháng)-Bank有效。

行地址確定之后,就要對列地址進(jìn)行尋址了。但是,地址線(xiàn)仍然是行地址所用的A0~A12。沒(méi)錯,在SDRAM中,行地址與列地址線(xiàn)是復用的。列地址復用了A0~A8,共9根(可表示512列)。那么,讀/寫(xiě)的命令是怎么發(fā)出的呢?其實(shí)沒(méi)有一個(gè)信號是發(fā)送讀或寫(xiě)的明確命令的,而是通過(guò)芯片的可寫(xiě)狀態(tài)的控制來(lái)達到讀/寫(xiě)的目的。顯然WE信號(nWE)就是一個(gè)關(guān)鍵。WE無(wú)效時(shí),當然就是讀取命令。有效時(shí),就是寫(xiě)命令。

SDRAM基本操作命令,通過(guò)各種控制/地址信號的組合來(lái)完成(H代表高電平,L代表低電平,X表示高,低電平均沒(méi)有影響)。此表中,除了自刷新命令外,所有命令都是默認CKE(SCKEl輸入時(shí)鐘頻率有效)有效。列尋址信號與讀寫(xiě)命令是同時(shí)發(fā)出的。雖然地址線(xiàn)與行尋址共用,但CAS(nSCAS列地址選通信號)信號則可以區分開(kāi)行與列尋址的不同,配合A0~A8,A9~A11來(lái)確定具體的列地址。

讀取命令與列地址一塊發(fā)出(當WE為低電平是即為寫(xiě)命令)然而,在發(fā)送列讀寫(xiě)命令時(shí)必須要與行有效命令有一個(gè)間隔,這個(gè)間隔被定義為tRCD,即RAS to CAS Delay(RAS至CAS延遲),這個(gè)很好理解,在地址線(xiàn)上送完行地址之后,要等到行地址穩定定位后再送出列地址,tRCD是SDRAM的一個(gè)重要時(shí)序參數,相關(guān)數值參看對應芯片硬件手冊。通常tRCD以時(shí)鐘周期(tCK,Clock Time)數為單位,比如筆者M(jìn)INI2440所用內存芯片里面寫(xiě)到tRCD為20nst,如果將來(lái)內存工作在100MHz,那么RCD至少要為2個(gè)時(shí)鐘周期,RCD=2。

圖2-53SDRAM讀操作時(shí)序圖

在選定列地址后,就已經(jīng)確定了具體的存儲單元,剩下就是等待數據通過(guò)數據I/O通道(DQ)輸出到內存數據總線(xiàn)上了。但是在列地址選通信號CAS發(fā)出之后,仍要經(jīng)過(guò)一定的時(shí)間才能有數據輸出,從CAS與讀取命令發(fā)出到第一筆數據輸出的這段時(shí)間,被定義為CL(CAS Latency,CAS潛伏期)。由于CL只在讀取時(shí)出現,所以CL又被稱(chēng)為讀取潛伏期(RL,Read Latency)。CL的單位與tRCD一樣,也是時(shí)鐘周期數,具體耗時(shí)由時(shí)鐘頻率決定(筆者官方手冊CL=3)。不過(guò),CAS并不是在經(jīng)過(guò)CL周期之后才送達存儲單元。實(shí)際上CAS與RAS一樣是瞬間到達的。由于芯片體積的原因,存儲單元中的電容容量很小,所以信號要經(jīng)過(guò)放大來(lái)保證其有效的識別性,這個(gè)放大/驅動(dòng)工作由S-AMP負責。但它要有一個(gè)準備時(shí)間才能保證信號的發(fā)送強度,這段時(shí)間我們稱(chēng)之為tAC(Access Time from CLK,時(shí)鐘觸發(fā)后的訪(fǎng)問(wèn)時(shí)間)。

1.1.4SDRAM預充電操作

從存儲體的結構圖上可以看出,原本邏輯狀態(tài)為1的電容在讀取操作后,會(huì )因放電而變?yōu)檫壿?。由于SDRAM的尋址具有獨占性,所以在進(jìn)行完讀寫(xiě)操作后,如果要對同一L-Bank的另一行進(jìn)行尋址,就要將原先操作行關(guān)閉,重新發(fā)送行/列地址。在對原先操作行進(jìn)行關(guān)閉時(shí),DRAM為了在關(guān)閉當前行時(shí)保持數據,要對存儲體中原有的信息進(jìn)行重寫(xiě),這個(gè)充電重寫(xiě)和關(guān)閉操作行過(guò)程叫做預充電,發(fā)送預充電信號時(shí),意味著(zhù)先執行存儲體充電,然后關(guān)閉當前L-Bank操作行。預充電中重寫(xiě)的操作與刷新操作(后面詳細介紹)一樣,只不過(guò)預充電不是定期的,而只是在讀操作以后執行的。

1.1.5SDRAM突發(fā)操作

突發(fā)(Burst)是指在同一行中相鄰的存儲單元連續進(jìn)行數據傳輸的方式,連續傳輸所涉及到存儲單元(列)數量就是突發(fā)長(cháng)度(Burst Length,簡(jiǎn)稱(chēng)BL)。

在目前,由于內存控制器一次讀/寫(xiě)P-Bank位寬的數據,也就是8個(gè)字節,但是在現實(shí)中小于8個(gè)字節的數據很少見(jiàn),所以一般都要經(jīng)過(guò)多個(gè)周期進(jìn)行數據的傳輸,上文寫(xiě)到的讀/寫(xiě)操作,都是一次對一個(gè)存儲單元進(jìn)行尋址,如果要連續讀/寫(xiě),還要對當前存儲單元的下一單元進(jìn)行尋址,也就是要不斷的發(fā)送列地址與讀/寫(xiě)命令(行地址不變,所以不用再對地尋址)。雖然由于讀/寫(xiě)延遲相同可以讓數據傳輸在I/O端是連續的,但是它占用了大量的內存控制資源,在數據進(jìn)行連續傳輸時(shí)無(wú)法輸入新的命令效率很低。為此,引入了突發(fā)傳輸機制,只要指定起始列地址與突發(fā)長(cháng)度,內存就會(huì )依次自動(dòng)對后面相應長(cháng)度數據的數據存儲單元進(jìn)行讀/寫(xiě)操作而不再需要控制器連續地提供列地址,這樣,除了第一筆數據的傳輸需要若干個(gè)周期(主要是之間的延遲,一般的是tRCD + CL)外,其后每個(gè)數據只需一個(gè)周期即可。

總結下:

SDRAM的基本讀操作需要控制線(xiàn)和地址線(xiàn)相配合地發(fā)出一系列命令來(lái)完成。先發(fā)出芯片有效命令(ACTIVE),并鎖定相應的L-BANK地址(BA0、BA1給出)和行地址(A0~A12給出)。芯片激活命令后必須等待大于tRCD(SDRAM的RAS到CAS的延遲指標)時(shí)間后,發(fā)出讀命令。CL(CAS延遲值)個(gè)時(shí)鐘周期后,讀出數據依次出現在數據總線(xiàn)上。在讀操作的最后,要向SDRAM發(fā)出預充電(PRECHARGE)命令,以關(guān)閉已經(jīng)激活的L-BANK。等待tRP時(shí)間(PRECHAREG命令后,相隔tRP時(shí)間,才可再次訪(fǎng)問(wèn)該行)后,可以開(kāi)始下一次的讀、寫(xiě)操作。SDRAM的讀操作支持突發(fā)模式(Burst Mode),突發(fā)長(cháng)度為1、2、4、8可選。

1.1.6SDRAM寫(xiě)操作

SDRAM的基本寫(xiě)操作也需要控制線(xiàn)和地址線(xiàn)相配合地發(fā)出一系列命令來(lái)完成。先發(fā)出芯片有效命令,并鎖定相應的L-BANK地址(BA0、BA1給出)和行地址(A0~A12給出)。芯片有效命令發(fā)出后必須等待大于tRCD的時(shí)間后,發(fā)出寫(xiě)命令數據,待寫(xiě)入數據依次送到DQ(數據線(xiàn))上。在最后一個(gè)數據寫(xiě)入后,延遲tWR時(shí)間。發(fā)出預充電命令,關(guān)閉已經(jīng)激活的頁(yè)。等待tRP時(shí)間后,可以展開(kāi)下一次操作。寫(xiě)操作可以有突發(fā)寫(xiě)和非突發(fā)寫(xiě)兩種。突發(fā)長(cháng)度同讀操作。

圖2-54 SDRAM寫(xiě)操作時(shí)序圖

1.1.7SDRAM的刷新

SDRAM之所以成為DRAM就是因為它要不斷進(jìn)行刷新(Refresh)才能保留住數據,因此它是SDRAM最重要的操作。

刷新操作與預充電中重寫(xiě)的操作一樣,都是用S-AMP先讀再寫(xiě)。但為什么有預充電操作還要進(jìn)行刷新呢?因為預充電是對一個(gè)或所有L-Bank中的工作行操作,并且是不定期的,而刷新則是有固定的周期,依次對所有行進(jìn)行操作,以保留那些很長(cháng)時(shí)間沒(méi)經(jīng)歷重寫(xiě)的存儲體中的數據。但與所有L-Bank預充電不同的是,這里的行是指所有L-Bank中地址相同的行,而預充電中各L-Bank中的工作行地址并不是一定是相同的。那么要隔多長(cháng)時(shí)間重復一次刷新呢?目前公認的標準是,存儲體中電容的數據有效保存期上限是64ms(毫秒,1/1000秒),也就是說(shuō)每一行刷新的循環(huán)周期是64ms。這樣刷新時(shí)間間隔就是:64m/行數s。我們在看內存規格時(shí),經(jīng)常會(huì )看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的標識,這里的4096與8192就代表這個(gè)芯片中每個(gè)L-Bank的行數。刷新命令一次對一行有效,刷新間隔也是隨總行數而變化,4096行時(shí)為15.625μs(微秒,1/1000毫秒),8192行時(shí)就為7.8125μs。刷新操作分為兩種:Auto Refresh,簡(jiǎn)稱(chēng)AR與Self Refresh,簡(jiǎn)稱(chēng)SR。不論是何種刷新方式,都不需要外部提供行地址信息,因為這是一個(gè)內部的自動(dòng)操作。對于A(yíng)R,SDRAM內部有一個(gè)行地址生成器(也稱(chēng)刷新計數器)用來(lái)自動(dòng)的依次生成行地址。由于刷新是針對一行中的所有存儲體進(jìn)行,所以無(wú)需列尋址,或者說(shuō)CAS在RAS之前有效。所以,AR又稱(chēng)CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新過(guò)程中,所有L-Bank都停止工作,而每次刷新所占用的時(shí)間為9個(gè)時(shí)鐘周期(PC133標準),之后就可進(jìn)入正常的工作狀態(tài),也就是說(shuō)在這9個(gè)時(shí)鐘期間內,所有工作指令只能等待而無(wú)法執行。64ms之后則再次對同一行進(jìn)行刷新,如此周而復始進(jìn)行循環(huán)刷新。顯然,刷新操作肯定會(huì )對SDRAM的性能造成影響,但這是沒(méi)辦法的事情,也是DRAM相對于SRAM(靜態(tài)內存,無(wú)需刷新仍能保留數據)取得成本優(yōu)勢的同時(shí)所付出的代價(jià)。SR則主要用于休眠模式低功耗狀態(tài)下的數據保存,這方面最著(zhù)名的應用就是STR(Suspend to RAM,休眠掛起于內存)。在發(fā)出AR命令時(shí),將CKE置于無(wú)效狀態(tài),就進(jìn)入了SR模式,此時(shí)不再依靠系統時(shí)鐘工作,而是根據內部的時(shí)鐘進(jìn)行刷新操作。在SR期間除了CKE之外的所有外部信號都是無(wú)效的(無(wú)需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并進(jìn)入正常操作狀態(tài)。

SDRAM相關(guān)寄存器:

(1)BWSCON寄存器(BUS WIDTH & WAIT CONTROL REGISTER)

表2-17 SDRAM控制寄存器(BWSCON)

根據開(kāi)發(fā)板的存儲器配置和芯片型號,設置每個(gè)BANK焊接芯片的位寬和等待狀態(tài)

BWSCON,每4位對應一個(gè)BANK,這4位分別表示:

lSTx:?jiǎn)?dòng)/禁止SDRAM的數據掩碼引腳(UB/LB),SDRAM沒(méi)有高低位掩碼引腳,此位為0,SRAM連接有UB/LB管腳,設置為1

注:UB/LB數據掩碼引腳用來(lái)控制芯片讀取/寫(xiě)入的高字節和低字節(對比硬件手冊SDRAM和SRAM的接線(xiàn)圖)

lWSx:是否使用存儲器的WAIT信號,通常設為0

lDWx:設置焊接存儲器芯片的位寬,筆者開(kāi)發(fā)板使用兩片容量為32M,位寬為16的SDRAM組成64M,32位存儲器,因此DW7,DW6位設置為0b10,其它BANK不用設置采用默認值即可。

lBANK0對應的是系統引導BANK,這4位比較特殊,它的設置是由硬件跳線(xiàn)決定的,因此不用設置

lBWSCON設置結果:0x22000000

(2)BANKCON0~BANKCON5 (BANK CONTROL REGISTER)

表2-18 BANKCON0~BANKCON5控制寄存器(BANKCON0~BANKCON5)

這6個(gè)寄存器用來(lái)設置對應BANK0~BANK5的訪(fǎng)問(wèn)時(shí)序,采用默認值0x700即可

(3)BANKCON6~BANKCON7 (BANK CONTROL REGISTER)

表2-19 BANKCON6~BANKCON7控制寄存器(BANKCON6~BANKCON7)

由于內存都焊接在這兩個(gè)BANK上,因此內存驅動(dòng)主要是對這兩個(gè)寄存器進(jìn)行設置

lMT:設置BANK6~BANK7的存儲器類(lèi)型,

00=ROM or SRAM 01=保留

10=保留11=SDRAM

內存為SDRAM,設置為0b11,對應的應該設置Trcd和SCAN位,其它位和SDRAM無(wú)關(guān)

lTrcd:RAS to CAS Delay行地址選通到列地址選通延遲,這個(gè)參數請看后面的內存工作原理擴展部分解釋?zhuān)P者內存芯片為HY57V561620,由其芯片手冊可知其Trcd為最少20ns,如果內存工作在100MHz,則該值至少要為2個(gè)時(shí)鐘周期,通常設置為3個(gè)時(shí)鐘周期,因此設置為0b01

lSCAN:SDRAM Column Address Number SDRAM的列地址數,筆者內存芯片為HY57V561620,列地址數為9,設置為0b01

lBANK6,BANK7設置結果為:0x18005

(4)REFRESH (REFRESH CONTROL REGISTER)

表2-20刷新頻率設置寄存器(REFRESH)

SDRAM的刷新有效,刷新頻率設置寄存器(刷新)

lREFEN:開(kāi)啟/關(guān)閉刷新功能,設置為1,開(kāi)啟刷新

lTREFMD:SDRAM刷新模式,0=CBR/AutoRefresh,1=Self Refresh,設置為0,自動(dòng)刷新

lTrp:行地址選通預充電時(shí)間,一般設置為0b00即可

lTsrc:?jiǎn)涡兴⑿聲r(shí)間,設置為0b11即可。

lRefresh Counter:內存存儲單元刷新數,它通過(guò)下面公式計算出:

Refresh Counter = 2^11 + 1 – SDRAM時(shí)鐘頻率(MHz)* SDRAM刷新周期(uS)

SDRAM的刷新周期,也就是內存存儲單元間隔需要多久進(jìn)行一次刷新,前面內存工作原理分析可知電容數據保存上限為64ms,筆者使用內存芯片每個(gè)L-Bank共有8192行,因此每次刷新最大間隔為:64ms/8192 = 7.8125uS,如果內存工作在外部晶振頻率12MHz下,Refresh Counter = 1955,如果內存工作在100MHz下,那么Refresh Counter = 1269(取大整數)

lREFRESH寄存器設置為:

0x8e0000 + 1269 = 0x008e04f5(HCLK = 100MHz)

0x8e0000 + 1955 = 0x008e07a3(HCLK = 12MHz)

(5)BANKSIZE寄存器(BANKSIZE REGISTER)

表2-21 BANKSIZE寄存器(BANKSIZE)

設置內存的突發(fā)傳輸模式,省電模式和內存容量。

lBURST_EN:是否開(kāi)啟突發(fā)模式,0 = ARM內核禁止突發(fā)傳輸1 =開(kāi)啟突發(fā)傳輸,設置為1,開(kāi)啟突發(fā)傳輸

lSCKE_EN:是否使用SCKE信號作為省電模式控制信號,0 =不使用SCKE信號作為省電模式控制信號1 =使用SCKE信號作為省電模式控制信號,通常設置為1

lSCLK_EN: 設置向存儲器輸入工作頻率,0 =一直輸入SCLK頻率,即使沒(méi)有內存操作也會(huì )輸入,1 =僅當進(jìn)行內存數據操作時(shí)才輸入SCLK頻率,通常設置為1

lBK76MAP:設置Bank6/7的內存容量,筆者使用開(kāi)發(fā)板內存為兩片32M內存芯片并聯(lián)成64M,它們全部都外接到Bank6上,因此選擇0b001

lBANKSIZE寄存器設置為:0xb1

(6)SDRAM模式設置寄存器MRSRx (SDRAM MODE REGISTER SET REGISTER)

表2-22 SDRAM模式設置寄存器(MRSRx)

該寄存器用于設置CAS潛伏周期,可以手動(dòng)設置的位只有CL[6:4]位,通過(guò)前面內存工作原理可知,筆者使用開(kāi)發(fā)板CL=3,即0b011

lMRSR6,MRSR7設置為:0x00000030

1.1.8內存驅動(dòng)實(shí)驗

設置該工程加載時(shí)運行時(shí)地址為0x30000000,如圖2-55所示:

圖2-55設置加載時(shí)運行時(shí)地址

init.s:本程序文件主要實(shí)現了,關(guān)閉看門(mén)狗,初始化內存,拷貝ROM數據到內存中,然后跳往內存中執行xmain函數,從xmain函數返回之后,將全部led點(diǎn)亮,進(jìn)入死循環(huán)。

;

;內存初始化實(shí)驗

;

AREA Init, CODE, READONLY

ENTRY

start

; close watchdog

ldr r0, = 0x53000000;將看門(mén)狗控制寄存器地址放入r0

mov r1, #0

str r1, [r0];設置看門(mén)狗控制寄存器的值為0

bl initmem;跳轉到initmem代碼段,初始化內存

bl copyall;跳轉到數據拷貝代碼段,將ROM中數據拷貝到內存中

IMPORT xmain;引入main.c中的xmain函數

ldr sp, =0x34000000;調用C程序之前先初始化棧指針

ldr lr, =endxmain;設置xmain函數的返回地址

ldr pc, =xmain;跳轉到C程序中的xmain函數的入口處執行

endxmain

ldr r0, =0x56000010; LED的GPIO接口配置寄存器

ldr r1, =0x00015400; GPIO配置數據

str r1, [r0];設置GPIO

ldr r0, =0x56000014; LED控制寄存器地址

ldr r1, =0x0;全部LED亮

str r1,[r0]

loop

b loop;死循環(huán)

copyall

IMPORT |Image$$RO$$Base|;引入編譯器Image$$RO$$Base符號變量

IMPORT |Image$$RW$$Limit|;引入編譯器Image$$RW$$Limit符號變量

ldr r0, = |Image$$RO$Base|;取得Image$$RO$Base域基址的值

ldr r1, = |Image$$RW$$Limit|;取得Image$$RW$Base域結束地址的值

ldr r2, =0x0;數據拷貝源地址

copyallloop

teq r0,r1;測試是否拷貝完成

beq quitcopyallloop;拷貝完成,跳往quitcopyallloop退出

ldr r3, [r2], #4;四字節加載

str r3, [r0], #4;四字節存儲

b copyallloop;返回繼續執行

quitcopyallloop

mov pc, lr;調用返回

initmem;內存初始化

ldr r0, =0x48000000;加載內存相關(guān)寄存器首地址r0

ldr r1, =0x48000034;加載內存相關(guān)寄存器尾地址到r1

adr r2, memdata;將寄存器配置數據地址段首地址加載到r2

initmemloop

ldr r3, [r2], #4;循環(huán)設置存寄存器

str r3, [r0], #4

teq r0, r1

bne initmemloop;循環(huán)到最后一個(gè)寄存器時(shí)退出函數

mov pc,lr

memdata

DCD0x22000000;BWSCON

DCD0x00000700;BANKCON0

DCD0x00000700;BANKCON1

DCD0x00000700;BANKCON2

DCD0x00000700;BANKCON3

DCD0x00000700;BANKCON4

DCD0x00000700;BANKCON5

DCD0x00018005;BANKCON6

DCD0x00018005;BANKCON7

DCD0x008e07a3;REFRESH

DCD0x000000b1;BANKSIZE

DCD0x00000030;MRSRB6

DCD0x00000030;MRSRB7

END

main.c:本程序文件主要實(shí)現led燈的初始化,然后四個(gè)led燈循環(huán)滾動(dòng)亮5遍,xmain函數返回。

/* C語(yǔ)言函數*/

/*端口F寄存器預定義*/

#defineGPBCON(*(volatile unsigned long *)0x56000010)

#defineGPBDAT(*(volatile unsigned long *)0x56000014)

#defineLEDS(1<<5|1<<6|1<<7|1<<8)

#defineDELAYVAL(0x1ffff)

extern int delay(int time);/*聲明外部聲明匯編函數*/

int i = 5;

int xmain()

{

GPBCON= 0x00015400;//GPF4--GPF7設置為output

while(i > 0) {

//第一個(gè)LED燈亮

GPBDAT=(GPBDAT&(~LEDS)) | (1<<6|1<<7|1<<8);

delay(DELAYVAL);//調用匯編語(yǔ)言編寫(xiě)的延時(shí)程序

//第二個(gè)LED燈亮

GPBDAT=(GPBDAT&(~LEDS)) | (1<<5|1<<7|1<<8);

delay(DELAYVAL);//調用匯編語(yǔ)言編寫(xiě)的延時(shí)程序

//第三個(gè)LED燈亮

GPBDAT=(GPBDAT&(~LEDS)) | (1<<5|1<<6|1<<8);

delay(DELAYVAL);//調用匯編語(yǔ)言編寫(xiě)的延時(shí)程序

//第四個(gè)LED燈亮

GPBDAT=(GPBDAT&(~LEDS)) | (1<<5|1<<6|1<<7);

delay(DELAYVAL);//調用匯編語(yǔ)言編寫(xiě)的延時(shí)程序

i--;

}

return 0;

}

delay.s:本程序文件主要通常匯編來(lái)實(shí)現延時(shí)功能。

;匯編指令延時(shí)程序

EXPORT delay

AREADELAY,CODE,READONLY;該偽指令定義了一個(gè)代碼段,段名為Init,屬性只讀

;下面是延遲子程序

delay

sub r0,r0,#1;r0=r0-1

cmp r0,#0x0;將r0的值與0相比較

bne delay;比較的結果不為0(r0不為0),繼續調用delay,否則執行下一條語(yǔ)句

mov pc,lr;返回

END;程序結束符

內存的初始化也可以用下面的C程序實(shí)現:

C語(yǔ)言版本:

#defineMEM_CTL_BASE0x48000000

#defineMEM_CTL_END0x48000034

/* SDRAM 13個(gè)寄存器的值*/

unsigned longconstmem_cfg_val[]={//聲明數組存放內存控制器設置數據

0x22000000,//BWSCON

0x00000700,//BANKCON0

0x00000700,//BANKCON1

0x00000700,//BANKCON2

0x00000700,//BANKCON3

0x00000700,//BANKCON4

0x00000700,//BANKCON5

0x00018005,//BANKCON6

0x00018005,//BANKCON7

0x008e07a3,//REFRESH(HCLK = 12MHz,該值為0x008e07a3

//HCLK = 100MHz 0x008e04f5)

0x000000b1,//BANKSIZE

0x00000030,//MRSRB6

0x00000030,//MRSRB7

};

void mem_init(void)

{

inti = 0;

unsigned long *p = (unsigned long *)MEM_CTL_BASE;

for(; i < (MEM_CTL_END - MEM_CTL_BASE)/4; i++)

p[i] = mem_cfg_val[i];

}




關(guān)鍵詞: S3C2440SDRAM驅

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>