一,、SDRAM(HY57V561620F)連線分析1,、 S3C2440 有27根地址線ADDR[26:0],8根片選信號(hào)ngcs0-ngcs7,對(duì)應(yīng)bank0-bank7,當(dāng)訪問bankx 的地址空間,,ngcsx引腳為低電平,,選中外設(shè)。 2^27=128MByte, 8*128Mbyte = 1Gbyte,所以S3C2440 總的尋址空間是1Gbyte,。但市面上很少有32位寬度的單片SDRAM,,一般選擇2片16位SDRAM 擴(kuò)展得到32位SDRAM. 2、這里選擇的SDARM是HY57V561620F,,4Mbit * 4bank *16I/O,,共32Mbyte。 首先了解下SDRAM 的尋址原理,。 SDRAM 內(nèi)部是一個(gè)存儲(chǔ)陣列,,可以把它想象成一個(gè)表 格。和表格的檢索原理一樣,,先指定行,,再指定列,就可以準(zhǔn)確找到所需要的存儲(chǔ)單元,。這個(gè)表格稱為邏輯BANK,。目前的SDRAM基本都是4個(gè)BANK。尋址的流程就是先指定BANK地址,,再 指定行地址,,最后指定列地址。這就是SDRAM的尋址原理,。存儲(chǔ)陣列示意圖如下: 查看HY57V561620F 的資料,,可知這個(gè)SDRAM有13根行地址線 RA0-RA12, 9根列地址線CA0-CA8,2根BANK選擇線 BA0-BA1。 SDRAM 的地址引腳是復(fù)用的,,在讀寫SDRAM存儲(chǔ)單元時(shí),,操作過程是將讀寫的地址分兩次輸入到芯片中,每一次都由同一組地址線輸入,。兩次送到芯片上去的地址分別稱為行地址和列地址,。它們被鎖存到芯片內(nèi)部的行地址鎖存器和列地址鎖存器。 /RAS是行地址鎖存信號(hào),,該信號(hào)將行地址鎖存在芯片內(nèi)部的行地址鎖存器中,; /CAS 是列地址鎖存信號(hào),該信號(hào)將列地址鎖存在芯片內(nèi)部的列地址鎖存器中,。
地址連線如下圖:
問題1:SDRAM:的A0接S3C2440的ADDR2,A0 為什么不接ADDR0,? 要理解這種接法,首先要清楚在CPU的尋址空間中,,字節(jié)(8位)是表示存儲(chǔ)容量的唯一單位,。用2片HY57V561620F擴(kuò)展成32位SDRAM,,可以認(rèn)為每個(gè)存儲(chǔ)單元是4個(gè)字節(jié)。因此當(dāng)它的地址線A1:A0=01 時(shí),,處理器上對(duì)應(yīng)的地址線應(yīng)為ADDR3:ADDR2=01(因?yàn)?span lang="EN-US">CPU的尋址空間是以Byte 為單位的),。所以SDRAM的A0引腳接到了S3C2440的ADDR2 地址線上。同理,,如果用1 片HY57V561620F,,數(shù)據(jù)線是16位,因?yàn)橐粋€(gè)存儲(chǔ)單元是2個(gè)字節(jié),,這時(shí)SDRAM的A0要接到S3C2440的ADDR1上,。 就是說SDRAM的A0接S3C2440的哪一根地址線是根據(jù)整個(gè)SDRAM的數(shù)據(jù)位寬來決定的。 問題2:上圖接線中,,BA0,BA1接ADDR24,ADDR25,,為什么用這兩根地址線呢? BA0~BA1代表了SDRAM 的最高地址位,。因?yàn)?span lang="EN-US">CPU的尋址空間是以字節(jié)(Byte)為單位的,,本系統(tǒng)SDRAM容量為64MByte,那就需要A25~A0(64M=2^26)地址線來尋址,,所以BA1~BA0地址線應(yīng)該接到S3C2440的ADDR25~ADDR24 引腳上,。 13根行地址線 + 9根列地址線 = 22根地址線。另外HY57V561620F一個(gè)存儲(chǔ)單元是2個(gè)字節(jié)(16I/O),,相當(dāng)于有了23根地址線,。BA0,BA1是最高地址位,所以應(yīng)該接在ADDR24,ADDR25 上,。 就是說SDRAM的BA0,BA1接S3C2440的哪幾根地址線是根據(jù)整個(gè)SDRAM的容量來決定的,。二、NOR FLASH(AM29LV160DB)的接線分析NOR FLASH 的地址線和數(shù)據(jù)線是分開的,。AM29LV160DB 是一個(gè)2Mbyte 的NOR FLASH,,分區(qū)結(jié)構(gòu)是: 1個(gè)16Kbyte扇區(qū),2個(gè)8Kbyte扇區(qū),,1個(gè)32Kbyte扇區(qū),,31個(gè)64Kbyte扇區(qū)(字節(jié)模式); 1個(gè)8Kbyte扇區(qū),,2 個(gè)4Kbyte扇區(qū),,1個(gè)16Kbyte扇區(qū),31個(gè)32Kbyte扇區(qū)(半字模式),; 共35個(gè)扇區(qū),。引腳如下: 設(shè)計(jì)原理圖如下: 說明: AM29LV160DB 第47 腳是BYTE#腳,BYTE#接高電平時(shí),,器件數(shù)據(jù)位是16 位,,接低電平時(shí),,數(shù)據(jù)位是8 位。 上圖BYTE#接VCC,,D0-D15 做為數(shù)據(jù)輸入輸出口,。A0-A19 是地址線,,在半字模式下,,D0-D15 做為數(shù)據(jù)輸入輸出口。因?yàn)閿?shù)據(jù)位是16 位,,A0-A19 可以選擇2^20 = 1M *2BYTE = 2Mbyte,。正好是AM29LV160DB 的容量。 S3C2440 的ADDR1要接AM29LV160DB 的A0,。上圖中AM29LV160DB 的A20,,A21是空腳,分別接的是LADDR21,LADDR22,。這應(yīng)該是為了以后方便擴(kuò)展NOR FLASH 的容量,。LADDR21,LADDR22 對(duì)AM29LV160DB是沒用的。 當(dāng)BYTE#接低電平時(shí),,D0-D7 做為8 位數(shù)據(jù)輸入輸出口,,D15做為地址線A-1。相當(dāng)于有了A-1,A0-A19 共21 根地址線,。這個(gè)時(shí)候S3C2440 的ADDR0 應(yīng)該接在D15(A-1)………,,ADDR20 接A19。21根地址線的尋址空間是2^21 = 2Mbyte,。正好是AM29LV160DB的容量,。 三、與NAND FLASH(K9F1208)的接線分析1 ,、K9F1208 結(jié)構(gòu)如下圖 K9F1208 位寬是8位(I/O0~I/O7),。 一頁(yè):1Page = 512byte + 16byte 最后16byte是用于存儲(chǔ)校驗(yàn)碼和其他信息用的,不能存放實(shí)際的數(shù)據(jù),。 一塊有32 page:1block = 32* (512byte + 16byte) =(16k+512)byte K9F1208 有4096 個(gè)塊: 1 device = 4096 *32* (512byte + 16byte) = (64M+2M)byte,,總共有64Mbyte可操作的芯片容量 NAND FLASH 以頁(yè)為單位讀寫數(shù)據(jù),以塊為單位擦除數(shù)據(jù),。 其引腳如下: S3C24440 和K9F1208 的接線圖如下: 當(dāng)選定一個(gè)NAND FLASH 的型號(hào)后,,要根據(jù)選定的NAND FLASH 來確定S3C2440 的NCON,GPG13,GPG14,GPG15 的狀態(tài)。 下圖是S3C2440 中4個(gè)腳位狀態(tài)的定義 K9F1208 的一頁(yè)是512byte,,所以NCON 接低電平,,GPG13 接高電平。 K9F1208 需要4個(gè)尋址命令,,所以GPG14 接高電平 K9F1208 的位寬是8,,所以GPG15 接低電平,。 NAND FLASH 尋址: 對(duì)K9F1208 來說,地址和命令只能在I/O[7:0]上傳遞,,數(shù)據(jù)寬度是8 位,。地址傳遞分為4 步,如下圖: 說明: 第1 步發(fā)送列地址,,既選中一頁(yè)512BYTE中的一個(gè)字節(jié),。512byte需要9bit來選擇,這里只用了A0 -A7,,原因是把一頁(yè)分成了2部分,,每部分256 字節(jié)。通過發(fā)送的讀命令字來確定是讀的前256 字節(jié)還是后256 字節(jié),。 當(dāng)要讀取的起始地址(Column Address)在0~255 內(nèi)時(shí)我們用00h 命令,, 當(dāng)讀取的起始地址是在256~511 時(shí),則使用01h 命令,。 一個(gè)塊有32 頁(yè),,用A9-A13 共5位來選擇一個(gè)塊中的某個(gè)頁(yè)。 總共有4096 個(gè)塊,,用A14-A25 共12位來選擇一個(gè)塊,。 K9F1208 總共有64Mbyte,需要A0-A25 共26個(gè)地址位,。
例如:要讀NAND FLASH 的第5000字節(jié)開始的內(nèi)容,。 把5000分解成列地址和行地址。 Column_address = 5000%512 = 392 因?yàn)?/span>column_address>255,所以用01h 命令讀 Page_address = (5000>>9) = 9 發(fā)送命令和參數(shù)的順序是: NFCMMD = 0x01;從后256 字節(jié)開始讀 NFADDR = column_address & 0xff;取column_address 的低8 位送到數(shù)據(jù)線 NFADDR = page_address & 0xff;發(fā)送A9-A16 NFADDR = (page_address >>8) & 0xff; 發(fā)送A17-A24 NFADDR = (page_address >> 16) & 0xff;發(fā)送A25 上面的NFCMMD,NFADDR.是S3C2440 的NAND FLASH 控制寄存器,。讀取的數(shù)據(jù)會(huì)放在NFDATA 中,。 四、S3C2440 開發(fā)板中SDRAM \NOR \ NAND地址分配(1)SDRAM地址分配 這是S3C2440 的存儲(chǔ)器地址分配圖,,SDARM只能接在BANK6 或BANK7,。 從分析SDRAM接線圖可以看到,SDRAM接的是ngcs6,,也就是接在BANK6,,因?yàn)檫x擇的SDRAM 是2片32Mbyte,總?cè)萘渴?/span>64Mbyte,,所以SDRAM 的地址范圍是0x3000 0000 --- 0x33ff ffff,。 (2)NORFLASH地址分配 S3C2440啟動(dòng)方式如下: 上文講述的NORFLASH 是16bit 數(shù)據(jù)位寬,選擇從NOR FLASH 啟動(dòng),,所以 OM0 接VDD,,OM1 接VSS。 從分析NOR FLASH 接線的接線圖可看到,,NOR FLASH接的ngcs0,也就是接在BANK0,。因?yàn)檫x擇NORFLASH是2Mbyte,,所以NOR FLASH 的地址范圍是0x0000 0000 --- 0x001f ffff。 上電時(shí),,程序會(huì)從Norflash中啟動(dòng),,ARM直接取Norflash 中的指令運(yùn)行。 (3)NANDFLASH地址分配 最后來看NANDFLASH,,NANDFLASH 以頁(yè)為單位讀寫,,要先命令,再給地 址,,才能讀到NAND 的數(shù)據(jù),。NANDFLASH是接在NANDFLASH 控制器上而不是系統(tǒng)總線上,,所以沒有在8 個(gè)BANK 中分配地址,。如果S3C2440 被配置成從Nand Flash 啟動(dòng), S3C2440 的Nand Flash 控制器有一個(gè)特殊的功能,在S3C2440 上電后,Nand Flash 控制器會(huì)自動(dòng)的把Nand Flash 上的前4K 數(shù)據(jù)搬移到4K 內(nèi)部SRAM 中,系統(tǒng)會(huì)從起始地址是0x0000 0000 的內(nèi)部SRAM 啟動(dòng)。 程序員需要完成的工作,是把最核心的啟動(dòng)程序放在Nand Flash 的前4K 中,,也就是說,你需要編寫一個(gè)長(zhǎng)度小于4K 的引導(dǎo)程序,作用是將主程序拷貝到SDRAM 中運(yùn)行,。由于NandFlash 控制器從NandFlash中搬移到內(nèi)部RAM的代碼是有限的,所以在啟動(dòng)代碼的前4K 里,我們必須完成S3C2440 的核心配置以及把啟動(dòng)代碼(U-BOOT)剩余部分搬到RAM中運(yùn)行。 至于將2440 當(dāng)做單片機(jī)玩裸跑程序的時(shí)候,,就不要做這樣的事情,,當(dāng)代碼小于4K 的時(shí)候,只要下到nand flash 中就會(huì)被搬運(yùn)到內(nèi)部RAM 中執(zhí)行了,。 不管是從NOR FLASH啟動(dòng)還是從NANDFLASH 啟動(dòng),,ARM都是從0x0000 0000 地址開始執(zhí)行的。 |
|