新聞中心

K9F5608程序

作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
最近使用K9F5608做個項目,用到大容量的存貯器,寫了對K9F的操作程序,但是因為其是NAND FLASH,出廠時會有一定的壞塊,在主程序中,只用到了在擦除塊中檢測狀態(tài),如果狀態(tài)不對,則不用此塊,這種辦法,一直感覺不是很好,現(xiàn)在對FLASH的YAFFS文件系統(tǒng),還沒有看明白,因此如果有機會希望和大家交流,對于數(shù)據(jù)采集系統(tǒng)的大容量存貯的實現(xiàn)。

下面是我寫的一些程序。

本文引用地址:http://m.butianyuan.cn/article/201611/316608.htm

注意一個問題:如果用51單片機的話,在做硬件時,不要把K9F的CE片選腳用51的片外尋址來統(tǒng)一尋址,這樣在寫數(shù)據(jù)的時候是不對的,因為芯片要求在等待內(nèi)部操作時要求CE為低,而這是51統(tǒng)一尋址辦不到的,所以CE要單獨的一個引腳用來控制。這是要注意的,別的按統(tǒng)一尋址操作就可以。

/*
*********************************************************************************************************
* 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日調(diào)試完成*/
#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;

/*
-------------------------------------------------------------------------------------------
輸 入:編程的數(shù)據(jù)開始地址,數(shù)據(jù)讀出的間接地址.
輸 出:返回編程是否正確.
功 能:可以編一頁的空間.最大地址在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); //發(fā)送0x10;

K9FDetectBusy();

K9FCEHIGH;

if(K9FStatusRead())
{

return TRUE;
}
else
{
return FALSE;
}

}
/*
-------------------------------------------------------------------------------------------
輸入:編程的字節(jié)個數(shù),頁開始地址,塊高,塊低,編程的數(shù)據(jù)存貯器.
輸出:編程是否成功.
功能:程序要編程n個字節(jié),也不是頁體.
-------------------------------------------------------------------------------------------
*/
unchar K9FProgramNData(unchar n,/*編程字節(jié)個數(shù) */
unchar columndata, /*頁開始地址 */
unchar pageh, /*塊地址高 */
unchar pagel, /*塊地址低 */
volatile unchar xdata *xramadd) /*編程數(shù)據(jù)存貯器*/
{
unint i;
i=0;
K9FCELOW;

K9FWriteComm(K9FWRITECOMMAND); //0x80

K9FWriteAdd(columndata,pageh,pagel);

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

K9FWriteComm(K9FENDPROGRAMFLASH); //發(fā)送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;
}

}
/*
-------------------------------------------------------------------------------------------
輸入:頁高地址,頁低地址,存放數(shù)據(jù)的連續(xù)空間
輸出:坊數(shù)據(jù)是否成功
功能:用來讀取正好一頁的內(nèi)容.
-------------------------------------------------------------------------------------------
*/

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;

}

/*
-------------------------------------------------------------------------------------------
輸 入:選擇塊區(qū);要讀出的頁數(shù);數(shù)據(jù)讀的開始地址.及讀出存放的地址.
輸 出:數(shù)據(jù)存放在指針所指的地址中.返回數(shù)據(jù)是否讀出正確.
功 能:可以實現(xiàn)從A,B,C任意塊開始讀,可以讀一頁甚至多頁,
-------------------------------------------------------------------------------------------
*/
unchar K9FReadSequenceData(unchar comm, /*選擇是A、B、還是C;暫時考慮不使用C*/
unchar pages, /*讀出的頁數(shù) */
unchar columndata, /*數(shù)據(jù)的開始位置 */
unchar pageh, /*數(shù)據(jù)開始的高地址 */
unchar pagel, /*數(shù)據(jù)開始的低地址 */
volatile unchar xdata *xramadd) /*數(shù)據(jù)存放的開始地址 */
{
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) //然后讀出是一整頁的數(shù)據(jù).順序存放在間接地址中.
{
for (i=0; i{
*xramadd=K9FADD;
xramadd++;
}
pages--; //直到要求讀的頁數(shù)為0,則停止.

K9FDetectBusy();
}

K9FCEHIGH; //拉高片選.結束讀數(shù)據(jù).
}
/*
-------------------------------------------------------------------------------------------
輸 入:讀一個字節(jié)的地址
輸 出:字節(jié)是否正確讀出.
功 能:可以只讀一個字節(jié).也可以讀N個字節(jié),使用片選線結束繼續(xù)讀下面的數(shù)據(jù).返回為數(shù)據(jù)讀出
是否正確.
-------------------------------------------------------------------------------------------
*/
unchar K9FReadNData(
unchar comm, /*A,B,還是C? */
unchar n, /*讀出數(shù)據(jù)的個數(shù) */
unchar columndata, /*單個數(shù)據(jù)的開始地址 */
unchar pageh, /* */
unchar pagel, /* */
volatile unchar xdata *xramadd) /*讀出的數(shù)據(jù)存放的位置 */
{
unchar i;
i=0;
K9FCELOW; //拉低片選.
if(comm!=0x00)
{
K9FWriteComm(comm);
}
K9FWriteComm(K9FREADCOMMAND);

K9FWriteAdd(columndata,pageh,pagel);

K9FDetectBusy();

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

K9FCEHIGH; //拉高片選,完成讀數(shù)據(jù).
return (TRUE);

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

-------------------------------------------------------------------------------------------
*/
unchar K9FReadAData(unchar comm,
unchar columndata, /*單個數(shù)據(jù)的開始地址 */
unchar pageh, /* */
unchar pagel) /* */
{
unchar i;

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

K9FWriteAdd(columndata,pageh,pagel);

K9FDetectBusy();

i=K9FADD;

K9FCEHIGH; //拉高片選,完成讀數(shù)據(jù).
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
返 回:讀狀態(tài)是否正常,為1正常.
實現(xiàn)功能:讀寫操作完成后,芯片是否正常完成操作.
-------------------------------------------------------------------------------------------
*/
unchar K9FStatusRead(void)
{
unchar rdata;

K9FCELOW;

K9FWriteComm(K9FSTATUSCOMMAND); //0x70

rdata=K9FADD; //讀數(shù)據(jù).

K9FCEHIGH;

if((rdata&0x01)==0x00) //編程是不是正確.
{
return TRUE; //
}
else
{
return FALSE;
}
}
/*
-------------------------------------------------------------------------------------------
輸 入:數(shù)據(jù)寫入的開始地址,頁的高低字節(jié).
輸 出:void
功 能:給芯片發(fā)送等待操作的地址.
-------------------------------------------------------------------------------------------
*/
void K9FWriteAdd(unchar columndata,unchar pageh,unchar pagel)
{
ALEHIGH; /*數(shù)據(jù)開始地址*/ /*頁高*/ /*頁低*/
K9FADD=columndata;
K9FADD=pagel;
K9FADD=pageh;
ALELOW;
}
/*
-------------------------------------------------------------------------------------------
輸 入:寫入芯片的指令.
輸 出:void
功 能:給芯片發(fā)送命令指令.
-------------------------------------------------------------------------------------------
*/
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);
}



評論


技術專區(qū)

關閉