Nor Flash操作程式

2021-06-16 12:12:02 字數 3080 閱讀 4702

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、程式設計操作(寫操作)

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()

android adb命令操作程式

由於開發需要頻繁的安裝 重新安裝,而重新安裝有的時候會報異常,繁瑣的事也多,此時在執行中執行命令多快捷,同時為我們節約了不少時間。關閉adb服務 adb kill server 啟動adb服務 adb start server 查詢當前模擬器 裝置 adb devices 假設為 ebook.apk...

python操作程式 python檔案操作

一 檔案處理流程 1.開啟檔案,得到檔案控制代碼並賦值給乙個變數 2.通過控制代碼對檔案進行操作 3.關閉檔案 r模式,預設模式,檔案不存在則報錯 w模式,檔案不存在則建立,檔案存在則覆蓋 a模式,檔案不存在則建立,檔案存在則不會覆蓋,寫內容會以追加的方式寫 寫日誌檔案的時候常用 追加模式是一種特殊...

鍊錶操作程式2

include include include define maxsize 2 define maxname 30 typedef struct nodelinklist char get char void int get digit void char show menu void void ...