5.2 軟件部分
本設計的驅動程序包括基本的操作函數和Flash操作API函數;镜牟僮骱瘮蛋ㄝ斎朊钪、輸入地址值、輸入數據值、讀取數據值和讀取狀態(tài)等函數。由于K9F1208是無地址的,故先定義一個外部存儲器的空地址來對它進行空寫和空讀。定義的語句為:
xdata unsigned char rK9Fl208DATA _at_0x5000000;
根據硬件連接圖,基本API函數的程序為:
(1) 輸入命令值函數

程序說明:賦予P4_5為0,使得CE信號成低電平,從而片選K9F1208有效;賦予P4_4為1,使得CLE信號成高電平,從而使K9F1208的命令允許信號有效;賦予P4_3為0,使得ALE信號成低電平,從而使K9F1208的地址允許信號無效;最后對rK9F1208DATA進行空寫命令字,使得WE信號成低電平,K9F1208的命令寄存器從數據總線接收到命令字,并執(zhí)行相應的操作。
(2) 輸入地址值函數

程序說明:賦予P4_5為0,使得CE信號成低電平,從而片選K9F1208有效;賦予P4_4為0,使得CLE信號成低電平,從而使K9F1208的命令允許信號無效;賦予P4_3為1,使得ALE信號成高電平,從而K9F1208的地址允許信號有效;最后對rK9F1208DATA進行空寫地址字,使得WE的信號成低電平,K9F1208從數據總線接收到地址字,并鎖存到地址鎖存器中。
(3) 輸入數據值函數

程序說明:賦予P4_5為0,使得CE信號成低電平,從而片選K9F1208有效;賦予P4_4為0,使得CLE信號成低電平,從而使K9F1208的命令允許信號無效;賦予P4_3為0,使得ALE信號成低電平,從而使K9F1208的地址允許信號無效;最后對rK9F1208DATA進行空寫數據,使得WE的信號成低電平,K9F1208從數據總線接收到數據,并根據命令寄存器和地址鎖存器來處理接收到的數據。
(4) 讀取數據值函數

程序說明:賦予P4_5為0,使得CE信號成低電平,從而片選K9F1208有效;賦予P4_4為0,使得CLE信號成低電平,從而K9F1208的命令允許信號無效;賦予P4_3為0,使得ALE信號成低電平,從而使K9F1208的地址允許信號無效;最后對rK9F1208DATA進行空讀數據,使得RE的信號成低電平,K9F1208會根據命令寄存器和地址鎖存器來向數據總線發(fā)送相應的數據。
(5) 讀取狀態(tài)函數

程序說明:只是讀取P4_6的狀態(tài),以判斷K9F1208是否“忙”。如果P4_6為高電平,則表示K9F1208不忙,返回高電平;如果P4_6為低電平,則表示K9F1208“忙”,返回高電平。
為了合理地操作K9F1208,還添加了不選中K9F1208的函數,以便在頁讀取和頁編程操作后,使K9F1208不工作。程序只是讓P4_5、P4_4、P4_3為低電平,從而使得K9F1208的片選信號、命令允許信號、地址允許信號無效。宏定義語句如下:
#define flash_inactive( ){P4_5=0;P4_4=0;P4_3=0;)
Flash操作API函數包括復位K9F1208、驗證K9F1208的ID號、擦除K9F1208某一扇區(qū)、湊取K9F1208某一扇區(qū)數據和寫入K9F1208某一扇區(qū)數據等函數。因為篇幅關系,只介紹頁讀取和頁編程函數。

圖6是讀取K9F1208某一扇區(qū)或某一頁的數據流程圖。首先,開始向K9F1208發(fā)送頁讀取命令字0x00,使得K9F1208的命令寄存器接收到命令字;然后取得要讀取扇區(qū)的地址,連續(xù)向K9F1208發(fā)送4個地址數據,發(fā)送完后讀取K9F1208的R/B引腳的狀態(tài),直到K9F1208不忙(表示地址數據已接收完畢);K9F1208開始讀取該地址所指的扇區(qū),并向數據總線發(fā)送一個扇區(qū)的數據,此時讀取K9F1208的數據總線,直到整頁結束。

圖7是寫入K9F1208某一扇區(qū)或一頁的數據流程圖。首先向K9F1208發(fā)送頁編程的命令字0x80,使得K9F1208的命令寄存器接收到命令字;然后取得要寫入扇區(qū)的地址,連續(xù)向K9F1208發(fā)送4個地址數據,發(fā)送完后讀取K9F1208的R/B引腳的狀態(tài),直到K9F1208不忙(表示地址數據已接收完畢);K9F1208準備從數據總線接收一個扇區(qū)的數據,此時向K9F1208的數據總線發(fā)送一個扇區(qū)的數據,讓K9F1208接收數據,并存到相應的頁或扇區(qū)中;待發(fā)送的數據結束后,向K9F1208發(fā)送0x10 命令,使得K9F1208結束頁編程的操作;最后向K9F1208發(fā)送查詢狀態(tài)的命令字0x70,K9F1208接收到命令字后,就會向數據總線發(fā)送一個字節(jié)的數據,這時讀取K9F1208的數據總線,若收到字節(jié)0x00,則表示操作成功,若收到字節(jié)0x01,則表示操作失敗。
結 語
本文介紹了Samsung公司K9F1208芯片特點,并在此基礎上設計了基于uPSD3234A的驅動設計。該方法對其他相關SoC中實現NAND Flash的控制方法設計有直接的參考意義,可廣泛應用于需要大存儲容量的低端設備中。
(來源:單片機與嵌入式系統(tǒng)應用)





