1、物理連線 (am29lv160db的norflash)
2、讀操作
讀操作不需要命令序列,缺省會進入讀取狀態
u16 read_en29lv160ab(u32 addr)
3、獲取id
#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)
為什麼對16bit的flash,在處理位址的時候要乘以2?
答:注意到16bit的flash的位址線,輸入位址的a1連線到flash的a0引腳。例如16位的flash晶元,對於cpu,0x00和0x01表示2個不同的位元組,但是從硬體連線上看,最低一位實際上是被丟掉了,所以在flash引腳端得到的都是0,也就是都指向flash的第乙個word。
0x555到cpu端實際上是0x555>>1(右移動了一位),為了抵消這個,原0x555必須左移一位,也就是乘以2。
硬體為什麼這麼連線呢?
為什麼用到volatile限定符?
答:volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。也就是對實時的硬體操作還是很有必要的。
4、擦除操作
程式設計前一定要先擦除.由於程式設計只能將'1'改寫為'0',通過擦寫可以將資料全部擦寫為'1'.
void am29lv800d_sectorerase(u32 sa)
5、程式設計操作(寫操作)
int am29lv800d_wordprog (u32 pa,u16 pd)
6、查詢狀態(判斷寫操作是否完成)
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.如下例.
}7、核心虛擬位址
如果在linux核心驅動中使用,而不是arm中使用,需要對實體地址進行虛擬轉換
iomap_label_addr=(byte*)ioremap(flash_base,sect_size);
8、nor flash應用
nor flash可以直接寫入二進位制**,在嵌入式的uboot中有很好的應用
9、遺留問題
為了保證讀寫過程不被打斷,在核心驅動中要不要關閉中斷?
local_irq_disable()
local_irq_enable()
NOR flash 壞塊處理方法
一直認為 nor flash沒有壞塊,而nand flash出廠時可能就有壞塊 推想nor flash一旦存在壞塊就報廢了,挺可惜的,今天查詢資料才了解到nor flash 是存在壞塊的,只不過是在內對壞塊進行了處理。在nor flash中,儲存單元是互相併聯的,每個儲存單元的字線 源線分別相連。而...
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 ...