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

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

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

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

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

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

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

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





