陸鵬
摘 要
本文通過分析8位并口NAND Flash的工作時序,設計其在dsPIC30F 6010A單片機下的軟件驅(qū)動,能夠?qū)崿F(xiàn)對NAND Flash的讀寫擦除等各種操作。
關鍵詞
NAND Flash;dsPIC30F6010A;并口;驅(qū)動
中圖分類號: TP316.2 ? ? ? ? ? ? 文獻標識碼: A
DOI:10.19694/j.cnki.issn2095-2457.2020.09.044
0 前言
NAND Flash是嵌入式設計中常見的存儲器。8位并口NAND Flash是指數(shù)據(jù)線寬度為8位,通信接口為并行接口的NAND Flash,在其與微處理器的配合應用中,NAND Fla sh與微處理器一般采用如圖1所示的連接方式。微處理器軟件驅(qū)動的設計是根據(jù)NAND Flash的工作時序,通過配置相關寄存器進行相應操作來實現(xiàn)的。本文中NAND Flash使用Micron公司的MT29F2G08系列進行說明,微處理器則使用了Microchip公司的16位高性能單片機dsPIC30F6010A。
1 NAND Flash信號時序
從軟件驅(qū)動角度來講,NAND Flash最基本的操作有四種,即命令輸入、地址輸入、數(shù)據(jù)輸入、數(shù)據(jù)輸出。所有的NAND Flash接口命令都是由這四種操作組合而成,以MT29F2G08的READ PAGE命令為例,它是由兩個命令輸入操作(0x00,0x30)、五個地址輸入操作以及若干數(shù)據(jù)輸出操作組成,READ PAGE命令時序如圖2所示。
因此如果在微處理上實現(xiàn)這四種基本操作,就能實現(xiàn)所有的接口命令,即實現(xiàn)了NAND Flash的驅(qū)動設計。
為了實現(xiàn)這四種操作,我們需要明確兩個內(nèi)容:一,四種操作中接口信號的電平;二,接口信號及各信號之間的時間要求。這兩項內(nèi)容均在NAND Flash的器件手冊上有明確要求。以MT29F2G08為例,在它的的異步接口模式列表中(表1),我們可以得到四種操作的接口信號電平要求。以命令輸入(Comm and Input)為例,從表1中可以得到接口信號電平要求為:當CE#為低,CLE為高,ALE為低,WE#的上升沿,WP#為高時,完成命令輸入操作。
接口信號及各信號之間的時間要求通過時序定義來得到。命令輸入的時序定義如圖3所示,接口信號的時間要求在表2中列出。因命令輸入發(fā)生在WE#上升沿,因此與WE#上升沿相關的幾個時間是設計的關鍵所在:tWP寫使能脈沖寬度時間-最小為10ns;tDS數(shù)據(jù)建立時間-最小7ns,即命令輸入后WE#需至少保持使能7ns才可以置高;tDH數(shù)據(jù)保持時間-最少5ns,即WE#置高后命令需要至少保持5ns;tCLS命令鎖存使能建立時間-最少10ns;tCLH命令鎖存使能保持時間-最小為5ns,即WE#置高后CLE需至少保持為高5ns。
得到接口信號的電平和時間要求后,就可以在微處理器上編程實現(xiàn)對NAND Flash的各種操作。
2 軟件驅(qū)動實現(xiàn)
在進行NAND Flash驅(qū)動編程之前,我們需要對微處理器dsPIC30F6010A的I/O按照圖1所示的連接方式進行配置,分別將CE#、RE#, WE#、R/B#、ALE、CLE、WP#、I/O[7:0]配置到所需的I/O口,其中CE#、RE#、WE#、ALE、CLE、WP#為輸出端口,R/B#為輸入端口,I/O[7:0]在命令輸入、地址輸入、數(shù)據(jù)輸入三種操作時為輸出端口,在數(shù)據(jù)輸出操作時為輸入端口。時間方面,本例中dsPIC30F6010A系統(tǒng)時鐘設置為24MHz,因此指令周期FCY為24MHz/4為6MHz,即一條指令所用時間為167ns。
以命令輸入操作為例,將其定義為函數(shù)FlashWriteCmd(),為函數(shù)定義一個參數(shù)cmd,根據(jù)上一小節(jié)所講,按照命令輸入的時序要求,將函數(shù)編寫如下:
void FlashWriteCmd(unsigned char cmd)
{
TRISDATA &= ~(0x00FF) ; // RE0~RE7輸出
ALE=0;
CLE=1;
_nop_(); ?_nop_(); //tCLS
WE=0;
_nop_(); ?_nop_(); _nop_(); _nop_();
_nop_(); ?_nop_(); _nop_(); _nop_();
_nop_(); ?_nop_(); _nop_(); _nop_();//tWP
DATAOUT= ((DATAOUT ?& 0xFF00) | cmd);
_nop_(); ?_nop_(); //tDS
WE=1;
_nop_(); ?_nop_(); ?_nop_();// tDH, tCLH
CLE=0;
}
按同樣思路完成其他三種基本操作的函數(shù)編程,分別定義為:地址輸入函數(shù)FlashWriteAddr(),數(shù)據(jù)輸入函數(shù)Flash Wr itePort(),數(shù)據(jù)輸出函數(shù)FlashReadPort(),以這四個函數(shù)為基礎即可實現(xiàn)所有接口命令函數(shù),下面以接口命令READ PAGE為例說明。
將READ PAGE命令定義為函數(shù)FlashReadByte(),為函數(shù)定義五個參數(shù),Read_num讀取字節(jié)數(shù)量,ByteAddr字節(jié)地址,PageAddr頁地址,BlockAddr塊地址,以及buf字節(jié)存儲位置。如圖1所示,READ PAGE命令需要首先發(fā)送命令0x00,然后發(fā)送五個周期的地址,再發(fā)送命令0x30,之后等待R/B#(RDY)信號為高后才能進行數(shù)據(jù)讀取,依此函數(shù)編程如下:
void FlashReadByte(unsigned int
Read_number,unsigned int ByteAddr,unsigned
char PageAddr,unsigned int BlockAddr,unsigned
char *buf)
{
unsigned int j,
CE=0;
FlashWriteCmd(0x00); //讀命令周期1
FlashWriteAddr(ByteAddr&0xff); //寫字節(jié)低位地址
FlashWriteAddr((ByteAddr>>8)&0x3f); //寫字節(jié)高位地址
FlashWriteAddr(PageAddr); //寫頁地址
FlashWriteAddr((BlockAddr>>1)&0xff); //寫塊低位地址
FlashWriteAddr((BlockAddr>>9)&0x0F); //寫塊高位地址
FlashWriteCmd(0x30); //讀命令周期2
delay_us(20);
NAND_WAITREADY();//等待RDY信號置高
for(j=0;j { ClrWdt(); *buf=FlashReadPort(); //讀取數(shù)據(jù) buf++; } CE=1; } 依照類似方法可實現(xiàn)NAND Flash規(guī)定的所有接口命令。需要注意的是在實現(xiàn)函數(shù)時,要將時間留出余量,以免出現(xiàn)異常錯誤。 3 結(jié)論 本文介紹的驅(qū)動程序已經(jīng)應用在項目中,實際結(jié)果顯示程序功能正確、穩(wěn)定可靠。雖然驅(qū)動是基于dsPIC30F6010A單片機,但其方法可以用于任意微處理器,此外驅(qū)動可適用于任何符合ONFI1.0標準的NAND Flash器件,有良好的通用性。 參考文獻 [1]Rino Micheloni,Luca Crippa,Alessia Marelli.Inside NAND Flash Memories. [2]MT29F2G08 NAND Flash Memory Datasheet.Micron Technology,Inc. [3]dsPIC30F6010A/6015 Datasheet.Microchip Technology,Inc.