微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > K9F5608程序

K9F5608程序

时间:11-11 来源:互联网 点击:
最近使用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;
}

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top