本文主要介紹NORFlash的結(jié)構(gòu)、對外接口及操作。
NORFlash中的N是NOT,含義是Floating Gate中有電荷時,讀出‘0’,無電荷時讀出‘1’,是一種‘非’的邏輯;OR的含義是同一個Bit Line下的各個基本存儲單元是并聯(lián)的,是一種‘或’的邏輯,這就是NOR的由來。
NORFlash的特點(diǎn)是芯片內(nèi)執(zhí)行(eXecute In Place),這樣應(yīng)用程序可以直接在Flash內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中。
1、NRORFlash的結(jié)構(gòu)
NORFlash結(jié)構(gòu)中每兩個單元共用一個位線接觸孔和一條源線,采用CHE的寫入和源極F-N擦除,具有高編程速度和高讀取速度的優(yōu)點(diǎn)。但其編程功耗過大,在陣列布局上,接觸孔占用了相當(dāng)?shù)目臻g,集成度不高。具有以下特點(diǎn):
程序和數(shù)據(jù)可存放在同一芯片上,擁有獨(dú)立的數(shù)據(jù)總線和地址總線,能快速隨機(jī)讀取,允許系統(tǒng)直接從Flash中讀取代碼執(zhí)行,而無需先將代碼下載至RAM中再執(zhí)行;
可以單字節(jié)或單字編程,但不能單字節(jié)擦除。必須以塊為單位或?qū)φ瑘?zhí)行擦除操作,在對存儲器進(jìn)行重新編程之前需要對塊或整片進(jìn)行預(yù)編程和擦除操作。適合存儲代碼,比如用來做BIOS。由于NORFlash的擦除和編程速度較慢,而塊尺寸又較大,因此擦除和編程操作所花費(fèi)的時間很長。在純數(shù)據(jù)存儲和文件存儲的應(yīng)用中,NOR技術(shù)顯得力不從心。
從支持的最小訪問單元來看,NORFlash一般分為8位的和16位的。對8位的NORFlash芯片,或是工作在8-BIT模式的芯片來說,一個地址對應(yīng)一個BYTE(8-BIT)的數(shù)據(jù)。例如一塊8-BIT的NORFlash,假設(shè)容量為4個BYTE。那芯片應(yīng)該有8個數(shù)據(jù)信號D7-D0和2個地址信號,A1-A0。地址0x0對應(yīng)第0個BYTE,地址0x1對應(yīng)于第1BYTE,地址0x2對應(yīng)于第2個BYTE,而地址0x3則對應(yīng)于第3個BYTE。
對16位的NORFlash芯片,或是工作在16-BIT模式的芯片來說,一個地址對應(yīng)于一個HALF-WORD(16-BIT)的數(shù)據(jù)。例如,一塊16-BIT的NORFlash,假設(shè)其容量為4個BYTE。那芯片應(yīng)該有16個數(shù)據(jù)信號線D15-D0和1個地址信號A0。地址0x0對應(yīng)于芯片內(nèi)部的第0個HALF-WORD,地址0x1對應(yīng)于芯片內(nèi)部的第1個HALF-WORD。8-BIT模式比16-BIT模式的地址線多一根,但數(shù)據(jù)線少8根,一般地址線復(fù)用數(shù)據(jù)線DQ15。
NORFlash一般都分為很多個SECTOR,每個SECTOR包括一定數(shù)量的存儲單元。對有些大容量的Flash,還分為不同的BANK,每個BANK包括一定數(shù)目的SECTOR。NORFlash的擦除操作一般都是以SECTOR,BANK或是整片F(xiàn)lash為單位的。
2.1、NOR Flash引腳
引腳 | 定義 |
VDD | 工作電壓 |
VSS | 地 |
DQn | 數(shù)據(jù)線 |
An | 地址線 |
DQ15/A-1 | DQ15/A-1 LSB Address(8位模式和16位模式時的地址線相差一根,通過復(fù)用實(shí)現(xiàn)) |
WE# | 寫使能 |
OE# | 輸出使能 |
CS# | 片選 |
RESET# | 復(fù)位信號 |
BYTE# | 數(shù)據(jù)寬度選擇 |
RY/BY# | Ready/Busy |
ACC/WP# | Acceleration/Write Protect |
2.2、NORFlash操作狀態(tài)
CEn | OEn | WEn | RESETn | ACC/WP# | ADDRESS | DQ[7:0] | BYTEn | ||
L | H | ||||||||
DQ[15:8] | |||||||||
Read | L | L | H | H | x | IN | OUT | DQ[14:8]=High-Z DQ15=A-1(復(fù)用) | OUT |
Write | L | H | L | H | IN | IO | IO | ||
Acc Program | L | H | L | H | Vhh(12±0.5V)編程電壓很高 | IN | IO | IO | |
Output Disable | L | H | H | H | x | x | High-Z | High-Z | High-Z |
Standby | VCC±0.3V | x | x | VCC±0.3V | H | x | High-Z | High-Z | High-Z |
Reset | x | x | x | L | x | x | High-Z | High-Z | High-Z |
NORFlash上電后處于數(shù)據(jù)讀取狀態(tài)(Reading Array Data)。此狀態(tài)可以進(jìn)行正常的讀。這和讀取SDRAM/SRAM/ROM一樣。(要是不一樣的話,芯片上電后如何從NORFlash中讀取啟動代碼。)
NORFlash具有像內(nèi)存一樣的接口,它可以像內(nèi)存一樣讀,卻不可以像內(nèi)存一樣寫,NORFlash的寫、擦除都需要發(fā)出特定的命令。談到NORFlash通常就會涉及到CFI([Common Flash Interface)接口,一般NORFlash都支持發(fā)命令來讀取廠家ID和設(shè)備ID等基本信息,但并不是所有的NORFlash都支持發(fā)命令來獲取和芯片本身容量大小、扇區(qū)數(shù)、擦除塊大小等信息。為了讓將來的NORFlash兼容性更好,引進(jìn)了CFI接口,將芯片有關(guān)的信息都寫入芯片內(nèi)部,通過CFI命令就可以獲取這些信息。
一般在對Flash進(jìn)行操作前都要讀取芯片信息比如設(shè)備ID號。這樣做的主要目的是為了判斷自己寫的程序是否支持該設(shè)備。NORFlash支持2種方式獲取ID號。一種是編程器所用的方法需要高電壓(11.5V-12.5V)。另一種方法就是所謂的in-system方法,就是在系統(tǒng)中通過NORFlash的命令寄存器來完成。in-system方法需要切換到自動選擇(Autoselect Command)模式,這要通過發(fā)送命令來完成。進(jìn)入自動選擇(Autoselect Command)模式后需要發(fā)送復(fù)位命令才能回到數(shù)據(jù)讀取狀態(tài)(Reading Array Data)。
在完成信息獲取后一般就要擦除數(shù)據(jù)。NORFlash支持扇區(qū)擦(Sector Erase)除和整片擦除(Chip Erase)。這2種模式都有對應(yīng)的命令序列。在完成擦除命令后會自動返回到數(shù)據(jù)讀取(Reading Array Data)狀態(tài)。在返回前可查詢編程的狀態(tài)。
完成擦除后就需要對芯片進(jìn)行寫入操作也就是編程。這就需要進(jìn)入編程(Program)狀態(tài)。在完成編程命令后會自動返回到數(shù)據(jù)讀取(Reading Array Data)狀態(tài)。在返回前可查詢編程的狀態(tài)。注意:編程前一定要先擦除。因?yàn)榫幊讨荒軐ⅰ?’改寫為‘0’,通過擦寫可以將數(shù)據(jù)全部擦寫為‘1’。
2.2.1、區(qū)擦除(Sector Erase)
NORFlash支持扇區(qū)擦除(Sector Erase)和整片擦除(Chip Erase)。這兩種模式都有對應(yīng)的命令序列。在完成擦除命令后會自動返回到數(shù)據(jù)讀取(Reading Array Data)狀態(tài)。在返回前可查詢編程的狀態(tài)。
Embedded Erase algorithm是指“嵌入的擦除算法程序”,當(dāng)發(fā)出擦除命令的時候NORFlash內(nèi)部就會執(zhí)行一系列指令來進(jìn)行擦除工作,在這過程它通過檢測Data=FF?來判斷擦除狀態(tài),但是這是NORFlash內(nèi)部的判斷方法,與之對應(yīng),外部的內(nèi)存控制器可以通過Data#Polling來檢測。
2.2.2、編程(Program)
完成擦除后就需要對芯片進(jìn)行寫入操作也就是編程。這就需要進(jìn)入編程(Program)狀態(tài)。在完成編程命令后會自動返回到數(shù)據(jù)讀取(Reading Array Data)狀態(tài)。在返回前可查詢編程的狀態(tài)。注意:編程前一定要先擦除。因?yàn)榫幊讨荒軐ⅰ?’改寫為‘0’,通過擦寫可以將數(shù)據(jù)全部擦寫為‘1’。
2.2.3、寫操作狀態(tài)(WRITE OPERATION STATUS)
NORFlash提供幾個數(shù)據(jù)位來確定一個寫操作的狀態(tài),它們分別是:DQ2,DQ3,DQ5,DQ6,DQ7,and RY/BY#。其中DQ7,RY/BY#和DQ6中的每一個都提供了一種方法來判斷一個編程或者擦除操作是否已經(jīng)完成或正在進(jìn)行中。實(shí)際編程中只需要使用其中的一種。
DQ7:Data# Pollingbit,在編程過程從正在編程的地址中讀出的數(shù)據(jù)的DQ7為要寫入數(shù)據(jù)位的補(bǔ)碼。比如寫入的數(shù)據(jù)為0x0000,即輸入的DQ7為0,則在編程中讀出的數(shù)據(jù)為1;當(dāng)編程完成時讀出的數(shù)據(jù)又變回輸入的數(shù)據(jù)0。在擦除過程中DQ7輸出為0;擦除完成后輸出為1;注意讀取的地址必須是擦除范圍內(nèi)的地址。RY/BY#:高電平表示‘就緒’,低電平表示‘忙’。
DQ6:輪轉(zhuǎn)位1(Toggle Bit 1),在編程和擦除期間,讀任意地址都會導(dǎo)致DQ6的輪轉(zhuǎn)(0,1間相互變換)。當(dāng)操作完成后,DQ6停止轉(zhuǎn)換。
DQ2:輪轉(zhuǎn)位2(Toggle Bit 2),當(dāng)某個扇區(qū)被選中擦除時,讀有效地址(地址都在擦除的扇區(qū)范圍內(nèi))會導(dǎo)致DQ2的輪轉(zhuǎn)。DQ2只能判斷一個特定的扇區(qū)是否被選中擦除,但不能區(qū)分這個扇區(qū)是否正在擦除中或者正處于擦除暫停狀態(tài)。相比之下,DQ6可以區(qū)分NORFlash是否處于擦除中或者擦除暫停狀態(tài),但不能區(qū)分哪個扇區(qū)被選中擦除,因此需要這2個位來確定扇區(qū)和模式狀態(tài)信息。
DQ5:超時位(ExceededTiming Limits),當(dāng)編程或擦除操作超過了一個特定內(nèi)部脈沖計(jì)數(shù)時DQ5=1,表明操作失敗。當(dāng)編程時把0改為1就會導(dǎo)致DQ5=1,因?yàn)橹挥胁脸僮鞑拍馨?改為1。當(dāng)錯誤發(fā)生后需要執(zhí)行復(fù)位命令才能返回到讀數(shù)據(jù)狀態(tài)。
DQ3:扇區(qū)擦除計(jì)時位(SectorErase Timer),只在扇區(qū)擦除指令時起作用。當(dāng)擦除指令真正開始工作時DQ3=1,此時輸入的命令(除擦除暫停命令外)都被忽略,DQ3=0時,可以添加附加的扇區(qū)用于多扇區(qū)擦除。
串行NOR Flash的主要接口是SPI接口,其內(nèi)部存儲矩陣的訪問和存儲結(jié)構(gòu)同并行NORFlash的一致,只不過多了個串行接口,用于實(shí)現(xiàn)對串行數(shù)據(jù)的解碼。
3.1、SPI的SDR/DDR采樣方式
SPI的SCK支持單沿觸發(fā)和雙沿觸發(fā),單沿觸發(fā)時只在上升沿或下降沿觸發(fā),雙沿觸發(fā)時在上升沿和下降沿均觸發(fā)。
3.2、SPI的x1/2/4連接方式
SPI支持1位、2位、4位數(shù)據(jù)傳輸寬度。
Traditional SPI single bit wide commands (Single orSIO) send information from the host to the memory only on the SI signal. Datamay be sent back to the host serially on the Serial Output (SO) signal.
Dual or Quad Output commands send information fromthe host to the memory only on the SI signal. Data will be returned to the hostas a sequence of bit pairs on IO0 and IO1 or four bit (nibble) groups on IO0,IO1, IO2, and IO3.
Dual or Quad Input/Output (I/O) commands sendinformation from the host to the memory as bit pairs on IO0 and IO1 or four bit(nibble) groups on IO0, IO1, IO2, and IO3. Data is returned to the hostsimilarly as bit pairs on IO0 and IO1 or four bit (nibble) groups on IO0, IO1,IO2, and IO3.