国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于dsPIC30F6010A的并口NANDFlash驅動設計與實現(xiàn)

2020-05-18 02:44:46陸鵬
科技視界 2020年9期
關鍵詞:字節(jié)時序命令

陸鵬

摘 要

本文通過分析8位并口NAND Flash的工作時序,設計其在dsPIC30F 6010A單片機下的軟件驅動,能夠實現(xiàn)對NAND Flash的讀寫擦除等各種操作。

關鍵詞

NAND Flash;dsPIC30F6010A;并口;驅動

中圖分類號: 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所示的連接方式。微處理器軟件驅動的設計是根據(jù)NAND Flash的工作時序,通過配置相關寄存器進行相應操作來實現(xiàn)的。本文中NAND Flash使用Micron公司的MT29F2G08系列進行說明,微處理器則使用了Microchip公司的16位高性能單片機dsPIC30F6010A。

1 NAND Flash信號時序

從軟件驅動角度來講,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的驅動設計。

為了實現(xiàn)這四種操作,我們需要明確兩個內容:一,四種操作中接口信號的電平;二,接口信號及各信號之間的時間要求。這兩項內容均在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 軟件驅動實現(xiàn)

在進行NAND Flash驅動編程之前,我們需要對微處理器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 結論

本文介紹的驅動程序已經應用在項目中,實際結果顯示程序功能正確、穩(wěn)定可靠。雖然驅動是基于dsPIC30F6010A單片機,但其方法可以用于任意微處理器,此外驅動可適用于任何符合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.

猜你喜歡
字節(jié)時序命令
時序坐標
只聽主人的命令
基于Sentinel-2時序NDVI的麥冬識別研究
No.8 字節(jié)跳動將推出獨立出口電商APP
No.10 “字節(jié)跳動手機”要來了?
移防命令下達后
簡談MC7字節(jié)碼
一種毫米波放大器時序直流電源的設計
電子制作(2016年15期)2017-01-15 13:39:08
這是人民的命令
DPBUS時序及其設定方法
河南科技(2014年15期)2014-02-27 14:12:36
天津市| 清新县| 保山市| 宜兰市| 来宾市| 洞头县| 石渠县| 门源| 濮阳县| 云龙县| 塔城市| 西青区| 闻喜县| 崇明县| 马鞍山市| 罗源县| 辽阳县| 陈巴尔虎旗| 桑植县| 瑞昌市| 蒙城县| 双辽市| 日喀则市| 长岛县| 萨嘎县| 宁明县| 吴江市| 梓潼县| 历史| 灵川县| 新源县| 珲春市| 乐山市| 军事| 长春市| 南康市| 彭泽县| 新干县| 勃利县| 时尚| 精河县|