Nor flash 以及nandflash原理總結

2021-06-05 17:44:27 字數 4751 閱讀 4861

一、nor flash

1.     nor flash的簡單介紹

nor flash是很常見的一種儲存晶元,資料掉電不會丟失。nor flash支援execute on chip,即程式可以直接在flash片內執行。這點和nand flash不一樣。因此,在嵌入是系統中,nor flash很適合作為啟動程式的儲存介質。nor flash的讀取和ram很類似,但不可以直接進行寫操作。對nor flash的寫操作需要遵循特定的命令序列,最終由晶元內部的控制單元完成寫操作。

從支援的最小訪問單元來看,nor flash一般分為8位的和16位的(當然,也有很多nor flash晶元同時支援8位模式和是16位模式,具體的工作模式通過特定的管腳進行選擇)。對8位的nor flash晶元,或是工作在8-bit模式的晶元來說,乙個位址對應乙個byte(8-bit)的資料。例如一塊8-bit的nor flash,假設容量為4個byte。那晶元應該有8個資料訊號d7-d0和2個位址訊號,a1-a0。位址0x0對應第0個byte,位址0x1對應於第1byte,位址0x2對應於第2個byte,而位址0x3則對應於第3個byte。.

對16位的nor flash晶元,或是工作在16-bit模式的晶元來說,乙個位址對應於乙個half-word(16-bit)的資料。例如,一塊16-bit的nor flash,假設其容量為4個byte。那晶元應該有16個資料訊號線d15-d0和1個位址訊號a0。位址0x0對應於晶元內部的第0個half-word,位址0x1對應於晶元內部的第1個half-word。

flash一般都分為很多個sector,每個sector包括一定數量的儲存單元。對有些大容量的flash,還分為不同的bank,每個bank包括一定數目的sector。flash的擦除操作一般都是以sector,bank或是整片flash為單位的。

2.處理器和nor flash的硬體連線

從前面的介紹,我們知道從處理器的角度來看,每個位址對應的是乙個byte的資料單元。而,nor flash的每個位址有可能對應的是乙個byte的資料單元,也有可能對應的是乙個half-word的資料單元。所以在硬體設計中,連線arm處理器和nor flash時,必須根據實際情況對位址訊號做特別的處理。

如果arm處理器外部擴充套件的是8-bit的nor flash,資料線和位址線的連線應該如圖1所示。從圖中我們可以看到,處理器的資料訊號d0-d7和flash的資料訊號d0-d7是一一對應連線的,處理器的位址訊號a0-an和nor flash的位址訊號a0-an也是一一對應連線的。

如果arm處理器外部擴充套件的是16-bit的nor flash,位址線必須要錯位連線。圖2給了乙個arm處理器和16-bit nor flash的連線示意圖。如圖2所示,arm處理器的資料訊號d0-d15和flash的資料訊號d0-d15是一一對應的。而arm處理器的位址訊號和nor flash的位址訊號是錯位連線的,arm的a0懸空,arm的a1連線flash的a0,arm的a2連線flash的a1,依次類推。

需要錯位連線的原因是:arm處理器的每個位址對應的是乙個byte的資料單元,而16-bit的flash的每個位址對應的是乙個half-word(16-bit)的資料單元。為了保持匹配,所以必須錯位連線。這樣,從arm處理器傳送出來的位址訊號的最低位a0對16-bit flash來說就被遮蔽掉了。

上面的描述可能比較抽象,下面讓我們來看2個arm處理器訪問16-bit flash的例子:

例子1:arm處理器需要從位址0x0讀取乙個byte

1 - arm處理器在位址線an-a0上送出訊號0x0;

2 – 16-bit flash在自己的位址訊號an-a0上看到的位址是0x0,

然後將位址0x0對應的16-bit資料單元輸出到d15-d0上;

3 – arm處理器知道訪問的是16-bit的flash,從d7-d0上讀取所需要的乙個byte的資料;

例子2:arm處理器需要從位址0x1讀取乙個byte

1 - arm處理器在位址線an-a0上送出訊號0x1;

2 – 16-bit flash在自己的位址訊號an-a0上看到的位址依然是0x0

,然後將位址0x0對應的16-bit資料單元輸出到d15-d0上;

3 –arm處理器知道訪問的是16-bit的flash,從d15-d8上讀取所需要的乙個byte的資料;

在上乙個小節裡,我們簡單了解了arm處理器和flash的硬體連線。在這個小節裡面,我們從軟體的角度來理解arm處理器和flash的連線。對於8-bit的flash的連線,很好理解,因為arm處理器和8-bit flash的每個位址對應的都是乙個byte的資料單元。所以位址連線毫無疑問是一一對應的。如果arm處理器連線的是16-bit的處理器,因為arm處理器的每個位址對應的是乙個byte的資料單元,而16-bit flash的每個位址對應的是乙個half-word的16-bit的資料單元。所以,也毫無疑問,arm處理器訪問16-bit處理器的時候,位址肯定是要錯開一位的。在寫flash驅動的時候,我們不需要知道位址錯位是由硬體實現的,還是是通過設定arm處理器內部的暫存器來實現的,只需要記住2點:

1 – arm處理器訪問8-bit flash的時候,位址是一一對應的;

2 – arm處理器訪問16-bit flash的時候,位址肯定是錯位的。這一點對理解後面的例子會很有幫助。

3.從軟體角度來看arm處理器和nor flash的連線

在本節後面的描述中,我們使用了下面的2個定義:

u32sysbase; //該變數用來表示flash的起始位址

#define sysaddr16(sysbase, offset) ((volatile u16*)(sysbase)+(offset)) //用來方便對指定的falsh位址進行操作

sysaddr16(sysbase, offset)首先定義了乙個16-bit half-word的指標,指標的位址為sysbase,然後根據offset做個偏移操作。因為half-word指標的位址是2個byte對齊的,所以每個偏移操作會使得位址加2。 最終,sysaddr16(sysbase, offset)相當於定義了乙個half-word的指標,其最終位址為(sysbase + 2*offset)。在使用sysaddr16的時候,將sysbase設定成flash的起始位址,offset則可以理解為相對於flash起始位址的half-word偏移量或是偏移位址。假設flash的起始位址為0x10000000,sysaddr16(0x10000000, 0)指向16-bit flash的第0個half-word, sysaddr16(0x10000000, 1)指向16-bit flash的第1個half-word。依次類推。如果要將0xabcd分別寫到flash的第0個和第1個half-word中去,可以用下面的**:

*sysaddr16(0x10000000, 0x0) = 0xabcd;

*sysaddr16(0x10000000, 0x1) = 0xabcd;

二、nand flash

1.nand flash位址分類

2、nand flash 位址的表示

512byte 需要9bit 來表示,對於528byte 系列的nand,這512byte 被分成1st half page register 和2nd half page register,各自的訪問由位址指標命令來選擇,a[7:0]就是所

謂的column address(列位址),在進行擦除操作時不需要它,why?因為以塊為單位擦除。32 個page 需要5bit 來表示,占用a[13:9],即該page 在塊內的相對位址。a8 這一位位址被用來設定512byte 的1st half page 還是2nd half page,0 表示1st,1 表示2nd。block的位址是由a14 以上的bit 來表示。例如64mb(512mb)的nand flash(實際中由於存在spare area,故都大於這個值),共4096block,因此,需要12 個bit 來表示,即a[25:14],如果是128mb(1gbit) 的528byte/page的nand flash,則block address 用a[26:14]表示。而page address 就是blcok address|pageaddress in block nand flash 的位址表示為: block address|page address inblock|halfpage pointer|column address 位址傳送順序是column address,pageaddress,block address。由於位址只能在i/o[7:0]上傳遞,因此,必須採用移位的方式進行。 例如,對於512mbit x8的nand flash,位址範圍是0~0x3ff_ffff,只要是這個範圍內的數值表示的位址都是有效的。

以nand_addr 為例:

第1 步是傳遞column address,就是nand_addr[7:0],不需移位即可傳遞到i/o[7:0]上,

而halfpage pointer 即a8 是由操作指令決定的,即指令決定在哪個halfpage 上進行讀

寫,而真正的a8 的值是不需程式設計師關心的。

第2 步就是將nand_addr 右移9 位,將nand_addr[16:9]傳到i/o[7:0]上;

第3 步將nand_addr[24:17]放到i/o 上;

第4 步需要將nand_addr[25]放到i/o 上;

因此,整個位址傳遞過程需要4 步才能完成,即4-step addressing。 如果nand flash 的

容量是32mb(256mbit)以下,那麼,block adress 最高位只到bit24,因此定址只需要3

步。

嵌入式開發之NorFlash 和NandFlash

author tiger john time 2013 07 11 重新修改 mail jibo.tiger gmail.com blog 摘要 作為乙個嵌入式工程師,要對norflash 和nandflash要有最起碼的認知。本文通過從啟動方式 讀寫方式 容量成本 可靠性 壽命以及是使用型上進行了...

嵌入式開發之NorFlash 和NandFlash

flash的不同分類 nand flash,nor flash,cfi flash,spi flash 之間的關係 摘要 作為乙個嵌入式工程師,要對norflash 和nandflash要有最起碼的認知。本文通過從啟動方式 讀寫方式 容量成本 可靠性 壽命以及是使用型上進行了全面的分析和對比。任何事...

Nor Flash 程式設計

author dansen xzd2734 163.com nor flash 與nand flash 的不同之處在於 nor flash 的位址和資料線是不共用的,所以 nor flash 比較象rom,是可以按位址自由讀的,這樣就非常適合儲存 在開機時從 nor flash 中取 來執行。在我的...