Nor Flash 學習筆記

2021-06-27 07:50:01 字數 4395 閱讀 7525

norflash

學習筆記

實驗驗平台:tq2440

cpu:s3c2440a(arm9)

開發環境:ads/mdk

norflash型號 :am29lv160db

(1)

nor flash

工作模式

nor flash上電後處於資料讀取狀態(

reading array data

)。此狀態可以進行正常的讀。這和讀取sdram/sram/rom一樣。(要是不一樣的話,晶元上電後如何從norflash中讀取啟動**。~)

一般再對flash進行操作前都要讀取晶元資訊比如裝置id號。這樣做的主要目的是為了判斷自己寫的程式是否支援該裝置。    nor flash支援2種方式獲取id號。一種是程式設計器所用的方法需要高電壓(11.5v-12.5v)。另一種方法就是所謂的in-system方法,就是在系統中通過norflash的命令暫存器來完成。本文中只對in-system方法進行說明。此時需要切換到自動選擇(

autoselectcommand

),這要通過傳送命令來完成。命令型別見下圖。注意:

進入自動選擇(

autoselect command

)模式後需要傳送復位命令才能回到資料讀取狀態(

readingarray data)。

在完成資訊獲取後一般就要擦除資料。 norflash支援扇區擦(sector erase)除和整片擦除(chip erase)。這2種模式都有對應的命令序列。在完成擦除命令後會自動返回到資料讀取(

readingarray data

)狀態。在返回前可查詢程式設計的狀態。

完成擦除後就需要對晶元進行寫入操作也就是程式設計。這就需要進入程式設計

(program)狀態。在完成程式設計命令後會自動返回到資料讀取(

reading array data

)狀態。在返回前可查詢程式設計的狀態。注意:程式設計前一定要先擦除。因為程式設計只能將

』1』改寫為

』0』,通過擦寫可以將資料全部擦寫為『1』。

以上是主要的操作其他操作還有寫保護等,請參考晶元資料手冊。

圖1-1 命令與模式

(2) norflash

硬體連線

圖2-1 nor flash 引腳

圖2-2 tq2440中實際連線

上圖中要注意的幾個地方:

1.       引腳47 為byte# :當其為高電平時資料輸出為16bit模式(此時位址線為a19:a0).低電平為8bit模式. (此時位址線為a19:a1)上圖中pin47加vcc選用的是16bit模式有效位址線為a19:a0.

2.       對於16bit模式要16bit對齊因此s3c2440a的laddr1要與a0連線.此時要注意的是norflash片內位址0x555對應s3c2440a的位址為baseaddr+0x555*2;其中baseaddr與norflash對映的位址有關。一般norflash放在bank0.所以baseaddr=0,但是開啟mmu後baseaddr=位址0對映到的新位址。0x555*2的原因是laddr1與a0連線。也就是0x555表示片內第0x555個word(16bit).

3.       引腳15為ryby#輸出引腳。用於輸出ready與busy訊號。實際用時可以不接。可用命令查詢norflash狀態代替.

(3) norflash

模式程式設計

1.

讀id

上圖中表明讀id

共有4個指令週期,錢

3個為寫週期

,最後乙個為讀週期

; #define flash_base      0x00000000  //flash

接到bank0上

#define    cmd_addr0     *((volatile u16 *)(0x555*2+flash_base))

#define    cmd_addr1     *((volatile u16 *)(0x2aa*2+flash_base))

#define    cmd_addr2     *((volatile u16 *)(0xaaa*2+flash_base))

/***

讀取am29lv800d

的id ***/

u32 get_am29lv800d_id(void)

2.

扇區擦除

(sectorerase)

扇區擦除命令序列的每個週期均為寫週期。

void am29lv800d_sectorerase(u32 sa)

3.

程式設計(program)

程式設計命令序列的每個週期均為寫週期。

int am29lv800d_wordprog (u32 pa,u16 pd)

4.

寫操作狀態

(writeoperation status)

norflash 提供幾個資料位來確定乙個寫操作的狀態,它們分別是: dq2, dq3, dq5, dq6,dq7, and ry/by#. 如上圖所示。其中dq7, ry/by#引腳, 和 dq6 中的每乙個都提供了一種方法來判斷乙個程式設計或者擦除操作是否已經完成或正在進行中。實際程式設計中只需要使用其中的一種。

dq7:data# polling bit,dq7在程式設計時的狀態變化.

程式設計過程中從正在程式設計的位址中讀出的資料的dq7為要寫入資料的補碼。比如寫入的資料為0x0000,及輸入的dq7為『0』,則在程式設計中讀出的資料為『1』;當程式設計完成時讀出的資料又變回輸入的資料即』0』.

在擦除過程中dq7輸出為』0』;擦除完成後輸出為』1』;注意讀取的位址必須是擦除範圍內的位址。

ry/by#:高電平表示『就緒』,低電平表示『忙』。

dq6:輪轉位1(toggle bit 1)。

在程式設計和擦除期間,讀任意位址都會導致dq6的輪轉(0,1間相互變換).。當操作完成後,dq6停止轉換。

dq2輪轉位2(toggle bit 2)。當某個扇區被選中擦除時,讀有效位址(位址都在擦除的扇區範圍內)會導致dq2的輪轉。

注意

:dq2只能判斷乙個特定的扇區是否被選中擦除。但不能區分這個快是否正在擦除中或者正處於擦除暫停狀態。相比之下,dq6可以區分norflash是否處於擦除中或者擦除狀態,但不能區分哪個快被選中擦除。因此需要這2個位來確定扇區和模式狀態資訊。

dq5:超時位(exceeded timing limits),當程式設計或擦除操作超過了乙個特定內部脈衝計數是dq5=1;這表明操作失敗。當程式設計時把』0』改為』1』就會導致dq5=1,因為只有擦除擦做才能把』0』改為』1』。當錯誤發生後需要執行復位命令(見圖

1-1)才能返回到讀資料狀態。

dq3:(扇區擦除計時位)sector erase timer,只在扇區擦除指令時起作用。當擦除指令真正開始工作是dq3=1,此時輸入的命令(除擦除暫停命令外)都被忽略。dq3=0,是可以新增附加的扇區用於多扇區擦除。

以上講了這些狀態為,實際只需要使用幾個就行,比較簡單的就是選擇dq5,dq6/dq2.如下例。

/****** am29lv800d

的檢測******/

int waitfor_endofprg(void)

old=flashstatus; }

return 1; }

Nor Flash 程式設計

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

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...