基于dsPIC30F6010A的并口NANDFlash驱动设计与实现.docx

基于dsPIC30F6010A的并口NANDFlash驱动设计与实现.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

?

?

基于dsPIC30F6010A的并口NANDFlash驱动设计与实现

?

?

陆鹏

摘要

本文通过分析8位并口NANDFlash的工作时序,设计其在dsPIC30F6010A单片机下的软件驱动,能够实现对NANDFlash的读写擦除等各种操作。

关键词

NANDFlash;dsPIC30F6010A;并口;驱动

中图分类号:TP316.2??????文献标识码:A

DOI:10.19694/j.cnki.issn2095-2457.2020.09.044

0前言

NANDFlash是嵌入式设计中常见的存储器。8位并口NANDFlash是指數据线宽度为8位,通信接口为并行接口的NANDFlash,在其与微处理器的配合应用中,NANDFlash与微处理器一般采用如图1所示的连接方式。微处理器软件驱动的设计是根据NANDFlash的工作时序,通过配置相关寄存器进行相应操作来实现的。本文中NANDFlash使用Micron公司的MT29F2G08系列进行说明,微处理器则使用了Microchip公司的16位高性能单片机dsPIC30F6010A。

1NANDFlash信号时序

从软件驱动角度来讲,NANDFlash最基本的操作有四种,即命令输入、地址输入、数据输入、数据输出。所有的NANDFlash接口命令都是由这四种操作组合而成,以MT29F2G08的READPAGE命令为例,它是由两个命令输入操作(0x00,0x30)、五个地址输入操作以及若干数据输出操作组成,READPAGE命令时序如图2所示。

因此如果在微处理上实现这四种基本操作,就能实现所有的接口命令,即实现了NANDFlash的驱动设计。

为了实现这四种操作,我们需要明确两个内容:一,四种操作中接口信号的电平;二,接口信号及各信号之间的时间要求。这两项内容均在NANDFlash的器件手册上有明确要求。以MT29F2G08为例,在它的的异步接口模式列表中(表1),我们可以得到四种操作的接口信号电平要求。以命令输入(CommandInput)为例,从表1中可以得到接口信号电平要求为:当CE#为低,CLE为高,ALE为低,WE#的上升沿,WP#为高时,完成命令输入操作。

接口信号及各信号之间的时间要求通过时序定义来得到。命令输入的时序定义如图3所示,接口信号的时间要求在表2中列出。因命令输入发生在WE#上升沿,因此与WE#上升沿相关的几个时间是设计的关键所在:tWP写使能脉冲宽度时间-最小为10ns;tDS数据建立时间-最小7ns,即命令输入后WE#需至少保持使能7ns才可以置高;tDH数据保持时间-最少5ns,即WE#置高后命令需要至少保持5ns;tCLS命令锁存使能建立时间-最少10ns;tCLH命令锁存使能保持时间-最小为5ns,即WE#置高后CLE需至少保持为高5ns。

得到接口信号的电平和时间要求后,就可以在微处理器上编程实现对NANDFlash的各种操作。

2软件驱动实现

在进行NANDFlash驱动编程之前,我们需要对微处理器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]在命令输入、地址输入、数据输入三种操作时为输出端口,在数据输出操作时为输入端口。时间方面,本例中dsPIC30F6010A系统时钟设置为24MHz,因此指令周期FCY为24MHz/4为6MHz,即一条指令所用时间为167ns。

以命令输入操作为例,将其定义为函数FlashWriteCmd(),为函数定义一个参数cmd,根据上一小节所讲,按照命令输入的时序要求,将函数编写如下:

voidFlashWriteCmd(unsignedcharcmd)

{

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;

}

按同样思路完成其他三种

文档评论(0)

159****4221 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档