mini2440硬件篇之Nor Flash
硬件原理
1.1.NorFlash簡(jiǎn)介
NORFlash是Intel在1988年推出的一款商業(yè)性閃存芯片,它需要很長(zhǎng)的時(shí)間進(jìn)行抹寫,大半生它能夠提供完整的尋址與數(shù)據(jù)總線,并允許隨機(jī)存取存儲(chǔ)器上的任何區(qū)域,而且它可以忍受一萬次到一百萬次擦寫,是早期的閃存媒體的基礎(chǔ)。
1.2.處理器連接
從處理器的角度來看,每個(gè)地址對(duì)應(yīng)的是一個(gè)BYTE的數(shù)據(jù)單元。而NorFlash的每個(gè)地址有可能對(duì)應(yīng)的是一個(gè)BYTE的數(shù)據(jù)單元,也有可能對(duì)應(yīng)的是一個(gè)HALF-WORD的數(shù)據(jù)單元。所以在硬件設(shè)計(jì)中,連接ARM處理器和NorFlash時(shí),必須根據(jù)實(shí)際情況對(duì)地址信號(hào)做特別的處理。如果ARM處理器外部擴(kuò)展的是8-BIT的NORFlash,數(shù)據(jù)線和地址線的連接應(yīng)該如圖1所示。從圖中我們可以看到,處理器的數(shù)據(jù)信號(hào)D0-D7和Flash的數(shù)據(jù)信號(hào)D0-D7是一一對(duì)應(yīng)連接的,處理器的地址信號(hào)A0-An和NORFlash的地址信號(hào)A0-An也是一一對(duì)應(yīng)連接的。
如果ARM處理器外部擴(kuò)展的是16-BIT的NorFlash,數(shù)據(jù)線必須要錯(cuò)位連接。圖2給了一個(gè)ARM處理器和16-BITNORFlash的連接示意圖。如圖2所示,ARM處理器的數(shù)據(jù)信號(hào)D0-D15和Flash的數(shù)據(jù)信號(hào)D0-D15是一一對(duì)應(yīng)的。而ARM處理器的地址信號(hào)和NorFlash的地址信號(hào)是錯(cuò)位連接的,ARM的A0懸空,ARM的A1連接Flash的A0,ARM的A2連接Flash的A1,依次類推。需要錯(cuò)位連接的原因是:ARM處理器的每個(gè)地址對(duì)應(yīng)的是一個(gè)BYTE的數(shù)據(jù)單元,而16-BIT的Flash的每個(gè)地址對(duì)應(yīng)的是一個(gè)HALF-WORD(16-BIT)的數(shù)據(jù)單元。為了保持匹配,所以必須錯(cuò)位連接。這樣,從ARM處理器發(fā)送出來的地址信號(hào)的最低位A0對(duì)16-BITFlash來說就被屏蔽掉了。
補(bǔ)充說明:
1、一般來說,ARM處理器內(nèi)部要設(shè)置相應(yīng)的寄存器,告訴處理器外部擴(kuò)展的Flash的位寬(8-BIT/16-BIT/32-BIT)。這樣,處理器才知道在訪問的時(shí)候如何從Flash正確的讀取數(shù)據(jù)。
2、有些ARM處理器內(nèi)部可以設(shè)置地址的錯(cuò)位。對(duì)于支持軟件選擇地址錯(cuò)位的處理器,在連接16-BITFlash的時(shí)候,硬件上可以不需要把地址線錯(cuò)位。
3、如果處理器支持內(nèi)部設(shè)置地址錯(cuò)位,在實(shí)際訪問的時(shí)候,送出的地址實(shí)際上是在MCU內(nèi)部做了錯(cuò)位處理,其作用是等效于硬件連接上的錯(cuò)位的。
2.芯片手冊(cè)
2.1.特性
容量2MB
扇區(qū)分布
一個(gè)16K,兩個(gè)8K,一個(gè)32K,31個(gè)64K(BoottomBootDevice
2.2.引腳描述
2.3.邏輯圖
2.4.設(shè)備總線操作
字節(jié)還是半字選擇,BYET#引腳高,半字;低,字節(jié)。
開機(jī)或復(fù)位自動(dòng)進(jìn)入讀狀態(tài)。
寫命令序列,繞過解鎖模式UnlockBypass只需要2個(gè)周期,而不是4個(gè)周期
編程和擦除需要輪詢狀態(tài)位。
自動(dòng)選擇模式:讀ID,扇區(qū)組保護(hù),硅扇區(qū)。兩種方法進(jìn)入自動(dòng)選擇模式,編程器電壓方式,寫命令方式。
2.5.CFI
2.6.指令集
見數(shù)據(jù)手冊(cè)
2.7.讀
NorFlash上電后處于數(shù)據(jù)讀取狀態(tài)(ReadingArrayData)。此狀態(tài)可以進(jìn)行正常的讀,這和讀取SDRAM/SRAM/ROM一樣。(要是不一樣的話,芯片上電后如何從NorFlash中讀取啟動(dòng)代碼)。
2.8.讀ID
一般再對(duì)Flash進(jìn)行操作前都要讀取芯片信息比如設(shè)備ID號(hào)。這樣做的主要目的是為了判斷自己寫的程序是否支持該設(shè)備。NorFlash支持2種方式獲取ID號(hào):一種是編程器所用的方法需要高電壓(8.5V-12.5V);另一種方法就是所謂的in-system方法,就是在系統(tǒng)中通過NorFlash的命令寄存器來完成。本文中只對(duì)in-system方法進(jìn)行說明,此時(shí)需要切換到自動(dòng)選擇(AutoselectCommand),這要通過發(fā)送命令來完成。注意:進(jìn)入自動(dòng)選擇(AutoselectCommand)模式后需要發(fā)送復(fù)位命令才能回到數(shù)據(jù)讀取狀態(tài)(ReadingArrayData)。
2.9.擦除
在完成信息獲取后一般就要擦除數(shù)據(jù)。NorFlash支持扇區(qū)擦除(SectorErase)和整片擦除(ChipErase),這2種模式都有對(duì)應(yīng)的命令序列,在完成擦除命令后會(huì)自動(dòng)返回到數(shù)據(jù)讀取(ReadingArrayData)狀態(tài),在返回前可查詢編程的狀態(tài)。
2.10.編程
完成擦除后就需要對(duì)芯片進(jìn)行寫入操作也就是編程,這就需要進(jìn)入編程(Program)狀態(tài)。在完成編程命令后會(huì)自動(dòng)返回到數(shù)據(jù)讀取(ReadingArrayData)狀態(tài),在返回前可查詢編程的狀態(tài),注意:編程前一定要先擦除.因?yàn)榫幊讨荒軐?#39;1'改寫為'0',通過擦寫可以將數(shù)據(jù)全部擦寫為'1'。
2.11.等待操作
NorFlash提供幾個(gè)數(shù)據(jù)位來確定一個(gè)寫操作的狀態(tài),它們分別是:DQ2、DQ3、DQ5、DQ6、DQ7、andRY/BY#。如上圖所示。其中DQ7,RY/BY#引腳,和DQ6中的每一個(gè)都提供了一種方法來判斷一個(gè)編程或者擦除操作是否已經(jīng)完成或正在進(jìn)行中。實(shí)際編程中只需要使用其中的一種。
DQ7:Data#Pollingbit,DQ7在編程時(shí)的狀態(tài)變化。在編程過程中從正在編程的地址中讀出的數(shù)據(jù)的DQ7為要寫入數(shù)據(jù)的補(bǔ)碼。比如寫入的數(shù)據(jù)為0x0000,及輸入的DQ7為'0',則在編程中讀出的數(shù)據(jù)為'1';當(dāng)編程完成時(shí)讀出的數(shù)據(jù)又變回輸入的數(shù)據(jù)即'0'。在擦除過程中DQ7輸出為'0';擦除完成后輸出為'1';注意讀取的地址必須是擦除范圍內(nèi)的地址。
RY/BY#:高電平表示'就緒',低電平表示'忙'。
DQ6:輪轉(zhuǎn)位1(ToggleBit1)。
在編程和擦除期間,讀任意地址都會(huì)導(dǎo)致DQ6的輪轉(zhuǎn)(0,1間相互變換)當(dāng)操作完成后,DQ6停止轉(zhuǎn)換。
DQ2:輪轉(zhuǎn)位2(ToggleBit2)。當(dāng)某個(gè)扇區(qū)被選中擦除時(shí),讀有效地址(地址都在擦除的扇區(qū)范圍內(nèi))會(huì)導(dǎo)致DQ2的輪轉(zhuǎn)。
注意:DQ2只能判斷一個(gè)特定的扇區(qū)是否被選中擦除。但不能區(qū)分這個(gè)快是否正在擦除中或者正處于擦除暫停狀態(tài)。相比之下,DQ6可以區(qū)分NorFlash是否處于擦除中或者擦除狀態(tài),但不能區(qū)分哪個(gè)快被選中擦除。因此需要這2個(gè)位來確定扇區(qū)和模式狀態(tài)信息。
DQ5:超時(shí)位(ExceededTimingLimits),當(dāng)編程或擦除操作超過了一個(gè)特定內(nèi)部脈沖計(jì)數(shù)是DQ5=1,這表明操作失敗。當(dāng)編程時(shí)把'0'改為'1'就會(huì)導(dǎo)致DQ5=1,因?yàn)橹挥胁脸磷霾拍馨?#39;0'改為'1'。當(dāng)錯(cuò)誤發(fā)生后需要執(zhí)行復(fù)位命令(見圖1-1)才能返回到讀數(shù)據(jù)狀態(tài)。
DQ3:(扇區(qū)擦除計(jì)時(shí)位)SectorEraseTimer,只在扇區(qū)擦除指令時(shí)起作用。當(dāng)擦除指令真正開始工作是DQ3=1,此時(shí)輸入的命令(除擦除暫停命令外)都被忽略。DQ3=0,是可以添加附加的扇區(qū)用于多扇區(qū)擦除。
以上講了這些狀態(tài)為,實(shí)際只需要使用幾個(gè)就行,比較簡(jiǎn)單的就是選擇DQ5,DQ6/DQ2。
3.mini2440電路圖
4.S3C2440寄存器
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:nand.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:norflash驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#ifndef__NOR_H__
#define__NOR_H__
/*norflash調(diào)試等級(jí)*/
#defineDBG_NOR_LEVEL1
#defineNOR_TYPE_S29AL016J0x00012249
/*norflash信息*/
#defineNOR_MAIN_SECT_SIZE(64*1024)//==1頁2k
#defineNOR_SIZE(2*1024*1024)//==容量256M
#defineNOR_FLASH_BASE0x00000000//==nor基地址0
/*命令地址*/
#defineNOR_CMD_ADDR1(*(volatileunsignedshort*)(NOR_FLASH_BASE+(0x00000555<<1)))
#defineNOR_CMD_ADDR2(*(volatileunsignedshort*)(NOR_FLASH_BASE+(0x000002AA<<1)))
/*操作命令*/
#defineNOR_CMD_UNLOCK10x000000AA
#defineNOR_CMD_UNLOCK20x00000055
#defineNOR_CMD_RESET0xF0
#defineNOR_CMD_AUTOSELECT0x90
#defineNOR_CMD_PROGRAM0xA0
#defineNOR_CMD_ERASE_SETUP0x80
#defineNOR_CMD_CHIP_ERASE0x30
#defineNOR_CMD_SECTOR_ERASE0x10
/*函數(shù)*/
void NorTe