您的位置 首页 模拟

K9F5608程序

最近使用K9F5608做个项目,用到大容量的存贮器,写了对K9F的操作程序,但是因为其是NANDFLASH,出厂时会有一定的坏块,在主程序中,只用…

最近运用K9F5608做个项目,用到大容量的存贮器,写了对K9F的操作程序,可是由于其是NAND FLASH,出厂时会有必定的坏块,在主程序中,只用到了在擦除块中检测状况,假如状况不对,则不必此块,这种方法,一向感觉不是很好,现在对FLASH的YAFFS文件体系,还没有看理解,因而假如有时机期望和我们沟通,关于数据收集体系的大容量存贮的完结。

下面是我写的一些程序。

留意一个问题:假如用51单片机的话,在做硬件时,不要把K9F的CE片选脚用51的片外寻址来一致寻址,这样在写数据的时分是不对的,由于芯片要求在等候内部操作时要求CE为低,而这是51一致寻址办不到的,所以CE要独自的一个引脚用来操控。这是要留意的,其他按一致寻址操作就能够。

/*
*********************************************************************************************************
* NOTE:The programme of send data to the FLASH.
*
* (c) Copyright ************Electronic Co.,Ltd
* All Rights Reserved
*
*
*
* File : K9FData.c
* By :david4383 @163.com

* Data : 2007.08.07
* Version : V0.1
*********************************************************************************************************
*/
/*本文件2007.08.24日调试完结*/
#include “cygnal.h”
#include “macro.h”
#include “common.h”
#include
#include “variable.h”
#include “function.h”
sbit KRB =P0^4;
extern void delay(unint i);

volatile unchar xdata K9FADD _at_ 0x3000;

/*
——————————————————————————————-
输 入:编程的数据开端地址,数据读出的直接地址.
输 出:回来编程是否正确.
功 能:能够编一页的空间.最大地址在528.
——————————————————————————————-
*/
unchar K9FProgramData(unchar columndata, /* */
unchar pageh, /* */
unchar pagel, /* */
volatile unchar xdata *xramadd) /* */
{
unint i;

K9FCELOW;

K9FWriteComm(K9FWRITECOMMAND); //0x80

K9FWriteAdd(columndata,pageh,pagel);

for (i=columndata ; i<512 ; i++)
{
K9FADD=*xramadd;
xramadd++;
}

K9FWriteComm(K9FENDPROGRAMFLASH); //发送0x10;

K9FDetectBusy();

K9FCEHIGH;

if(K9FStatusRead())
{

return TRUE;
}
else
{
return FALSE;
}

}
/*
——————————————————————————————-
输入:编程的字节个数,页开端地址,块高,块低,编程的数据存贮器.
输出:编程是否成功.
功用:程序要编程n个字节,也不是页体.
——————————————————————————————-
*/
unchar K9FProgramNData(unchar n,/*编程字节个数 */
unchar columndata, /*页开端地址 */
unchar pageh, /*块地址高 */
unchar pagel, /*块地址低 */
volatile unchar xdata *xramadd) /*编程数据存贮器*/
{
unint i;
i=0;
K9FCELOW;

K9FWriteComm(K9FWRITECOMMAND); //0x80

K9FWriteAdd(columndata,pageh,pagel);

while (i{
K9FADD=*xramadd;
xramadd++;
i++;
}

K9FWriteComm(K9FENDPROGRAMFLASH); //发送0x10;

K9FDetectBusy();

K9FCEHIGH;

if(K9FStatusRead())
{

return TRUE;
}
else
{
return FALSE;
}

}
/*
——————————————————————————————-
输 入:块A的地址,块B的地址.
输 出:块仿制是否正确的标志.
功 能:当一个块检测到错误时,从一个块保存到另一个块.
——————————————————————————————-
*/
unchar K9FCopyBackProgramData(unchar columndataA,
unchar pagehA,
unchar pagelA, /*块仿制源地址 */
unchar columndataB,
unchar pagehB,
unchar pagelB) /*块仿制意图地址 */
{
K9FCELOW;

K9FWriteComm(0x00);

K9FWriteAdd(columndataA,pagehA,pagelA);

K9FDetectBusy();

K9FWriteComm(0x8a);

K9FWriteAdd(columndataB,pagehB,pagelB);

K9FDetectBusy();

K9FCEHIGH;

if(K9FStatusRead())
{
return TRUE;
}
else
{
return FALSE;
}

}
/*
——————————————————————————————-
输入:页高地址,页低地址,寄存数据的接连空间
输出:坊数据是否成功
功用:用来读取正好一页的内容.
——————————————————————————————-
*/

void K9FReadPageData(unchar pageh,
unchar pagel,
volatile unchar xdata *xramadd)
{
unint i;
K9FCELOW;

K9FWriteComm(K9FREADCOMMAND); //指令锁存.

K9FWriteAdd(0x00,pageh,pagel); //地址锁存.

K9FDetectBusy();

for (i=0x00 ; i<512 ; i++)
{
*xramadd=K9FADD;
xramadd++;
}

K9FCEHIGH;

}

/*
——————————————————————————————-
输 入:挑选块区;要读出的页数;数据读的开端地址.及读出寄存的地址.
输 出:数据寄存在指针所指的地址中.回来数据是否读出正确.
功 能:能够完结从A,B,C恣意块开端读,能够读一页甚至多页,
——————————————————————————————-
*/
unchar K9FReadSequenceData(unchar comm, /*挑选是A、B、仍是C;暂时考虑不运用C*/
unchar pages, /*读出的页数 */
unchar columndata, /*数据的开端方位 */
unchar pageh, /*数据开端的高地址 */
unchar pagel, /*数据开端的低地址 */
volatile unchar xdata *xramadd) /*数据寄存的开端地址 */
{
unint max;
unint i;

if (pages==0x00)
{
return FALSE;
}

if (comm==0x00)
{
max=528; //256+256+16;
}
else if (comm==0x01)
{
max=272; //256+16;
}
else if (comm==0x50)
{
max=16;
}
else
{
return FALSE;
}

K9FCELOW;

K9FWriteComm(comm); //0x01或许0x00;

K9FWriteComm(K9FWRITECOMMAND); //0x80;

K9FWriteAdd(columndata,pageh,pagel);

for (i=columndata; i{
*xramadd=K9FADD;
xramadd++;
}

K9FDetectBusy();

pages–;
while (pages!=0x00) //然后读出是一整页的数据.次序寄存在直接地址中.
{
for (i=0; i{
*xramadd=K9FADD;
xramadd++;
}
pages–; //直到要求读的页数为0,则中止.

K9FDetectBusy();
}

K9FCEHIGH; //拉高片选.完毕读数据.
}
/*
——————————————————————————————-
输 入:读一个字节的地址
输 出:字节是否正确读出.
功 能:能够只读一个字节.也能够读N个字节,运用片选线完毕继续读下面的数据.回来为数据读出
是否正确.
——————————————————————————————-
*/
unchar K9FReadNData(
unchar comm, /*A,B,仍是C? */
unchar n, /*读出数据的个数 */
unchar columndata, /*单个数据的开端地址 */
unchar pageh, /* */
unchar pagel, /* */
volatile unchar xdata *xramadd) /*读出的数据寄存的方位 */
{
unchar i;
i=0;
K9FCELOW; //拉低片选.
if(comm!=0x00)
{
K9FWriteComm(comm);
}
K9FWriteComm(K9FREADCOMMAND);

K9FWriteAdd(columndata,pageh,pagel);

K9FDetectBusy();

while (i {
*xramadd=K9FADD;
xramadd++;
i++;
}

K9FCEHIGH; //拉高片选,完结读数据.
return (TRUE);

}
/*
——————————————————————————————-

——————————————————————————————-
*/
unchar K9FReadAData(unchar comm,
unchar columndata, /*单个数据的开端地址 */
unchar pageh, /* */
unchar pagel) /* */
{
unchar i;

K9FCELOW; //拉低片选.
if (comm!=0x00)
{
K9FWriteComm(comm);
}
K9FWriteComm(K9FREADCOMMAND);

K9FWriteAdd(columndata,pageh,pagel);

K9FDetectBusy();

i=K9FADD;

K9FCEHIGH; //拉高片选,完结读数据.
return (i);

}
/*
——————————————————————————————-
输 入:void
输 出:厂家号码及类型号码.
功 能:一个UNINT型量,读出是否是正常的芯片码.
——————————————————————————————-
*/
unint K9FReadID(void)
{
unint a;

K9FCELOW;

K9FWriteComm(K9FREADIDCOMMAND);

ALEHIGH;
K9FADD=0x00;
ALELOW;

a=0x00ff&K9FADD;
a=a*256;
a=a|K9FADD;

K9FCEHIGH;

return (a);
}
/*
——————————————————————————————-
输 入:要擦除的页凹凸地址.
输 出:回来是否擦除成功标志.
功 能:共有2048个块,每个块16K(8BIT),
——————————————————————————————-
*/
unchar K9FEraseBlockData(unchar pageh,unchar pagel)
{

K9FCELOW;

K9FWriteComm(K9FERISESETUPCOMMAND); //0x60 擦除指令.

ALEHIGH;
K9FADD=pagel; //地址,先送低,再送高.
K9FADD=pageh;
ALELOW;

K9FWriteComm(K9FERISECOMMAND); //0xd0;

K9FDetectBusy();

K9FCEHIGH;

if(K9FStatusRead())
{
return TRUE;
}
else
{
return FALSE;
}
}
/*
——————————————————————————————-
输 入:void
返 回:读状况是否正常,为1正常.
完结功用:读写操作完结后,芯片是否正常完结操作.
——————————————————————————————-
*/
unchar K9FStatusRead(void)
{
unchar rdata;

K9FCELOW;

K9FWriteComm(K9FSTATUSCOMMAND); //0x70

rdata=K9FADD; //读数据.

K9FCEHIGH;

if((rdata&0x01)==0x00) //编程是不是正确.
{
return TRUE; //
}
else
{
return FALSE;
}
}
/*
——————————————————————————————-
输 入:数据写入的开端地址,页的凹凸字节.
输 出:void
功 能:给芯片发送等候操作的地址.
——————————————————————————————-
*/
void K9FWriteAdd(unchar columndata,unchar pageh,unchar pagel)
{
ALEHIGH; /*数据开端地址*/ /*页高*/ /*页低*/
K9FADD=columndata;
K9FADD=pagel;
K9FADD=pageh;
ALELOW;
}
/*
——————————————————————————————-
输 入:写入芯片的指令.
输 出:void
功 能:给芯片发送指令指令.
——————————————————————————————-
*/
void K9FWriteComm(unchar command)
{
CLEHIGH;
K9FADD=command;
CLELOW;
}
/*
——————————————————————————————-
输 入:void
输 出:void
功 能:在不正常的情况下能够使芯片复位
——————————————————————————————-
*/
void K9FReset(void)
{
K9FCELOW;

K9FWriteComm(0xff); //0xff为复位指令

K9FDetectBusy();

K9FCEHIGH;
}
void K9FDetectBusy(void)
{
KRB=1;
while (!KRB);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/274389.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部