📄 k9f5608.c
字号:
/******************************************************************************
本程序大部分功能调试通过,没有调试或没有通过已在功能模块里说明
注: 本程序只供学习使用,未经作者允许,不能用于其它任何用途
//模 块 名:K9F5608单片机控制读写程序
//创 建 者:电子伙伴 日期:2006-4-10 15:47
//修 改 者: 日期:
//功能描述:
//其他说明:50MHz晶振,双倍数振荡频率 单指令周期为0.12us
//芯片型号: STC89C58RD
//配 置:
//版 本:V1.0
//CopyRight:http://www.jxmcu.com gfs0521@126.com
******************************************************************************/
unsigned char ReadByte(unsigned int blockadd,unsigned char pageadd);
unsigned char ReadSpare(unsigned int blockadd,unsigned char pageadd);
unsigned char ReadStatus(void);
unsigned int ReadID(void);
void BadBlockScan(void);
void CopyBack(unsigned int blockaddh_s,blockaddh_e);
void EraseBlock(unsigned int blockadd);
void NfAddre(unsigned int blockadd,unsigned char pageadd);
void NfCommand(unsigned char Com);
void ReadPage(unsigned int blockadd,unsigned char pageadd);
void ReadPageS(unsigned int blockadd,unsigned char select,pageadd);
void WirteByte(unsigned int blockadd,unsigned char pageadd,unsigned char buf);
void WirtePage(unsigned int blockadd,unsigned char pageadd);
void WirtePageF(unsigned int blockadd);
void WirteSpare(unsigned int blockadd,unsigned char pageadd,unsigned char buf);
/*=============================================================================
//参 数: unsigned char Com
//函数功能: 向K9F5608操作命令
=============================================================================*/
void NfCommand(unsigned char Com)
{
NF_CLE=1;
NF_WE=0;
P1=Com;
_nop_();
NF_WE=1;
NF_CLE=0;
P1=0xff;
}
/*=============================================================================
//参 数: unsigned int bolckadd 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 向K9F5608送地址
=============================================================================*/
void NfAddre(unsigned int blockadd,unsigned char pageadd)
{
NF_ALE=1;
NF_WE=0;
P1=pageadd;
_nop_();
NF_WE=1; //送地址第一个字节
NF_WE=0;
P1=blockadd&0xff;
_nop_();
NF_WE=1; //送地址第二个字节
NF_WE=0;
P1=blockadd/256;
_nop_();
NF_WE=1; //送地址第三个字节
NF_ALE=0;
P1=0xff;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
//函数功能: 页读 PAGE READ OPERATION
可连续读512个字节
=============================================================================*/
void ReadPageF(unsigned int blockadd)
{
unsigned int i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0); //送读命令
NfAddre(blockadd,0); //送开始字节
NF_RB=1;while(!NF_RB); //Data Transfer from Cell to Register max 10us
i=0;
P1=0xff;
do
{
NF_RE=0;
DataArray[i]=P1;
NF_RE=1;
i++;
}
while(i<512); //第1页数据传送数据完成
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 页读 PAGE READ OPERATION
可连续写256个字节
=============================================================================*/
void ReadPage(unsigned int blockadd,unsigned char pageadd)
{
unsigned char i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0); //送读命令
NfAddre(blockadd,pageadd); //送开始字节地址
NF_RB=1;while(!NF_RB); //Data Transfer from Cell to Register max 10us
i=0;
P1=0xff;
do
{
NF_RE=0;
DataArray[i]=P1;
NF_RE=1;
i++;
}
while(i); //页数据传送数据完成
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 页读 PAGE READ OPERATION
可连续写512个字节
//___没有调试
=============================================================================*/
void ReadPageS(unsigned int blockadd,unsigned char pageadd,select)
{
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(select); //送读命令
NfAddre(blockadd,pageadd); //送开始字节
NF_RB=1;while(!NF_RB); //Data Transfer from Cell to Register max 10us
DataPtr+=pageadd;
do
{
NF_RE=0;
pageadd++;
*DataPtr=P1;
DataPtr++;
NF_RE=1;
}
while(pageadd<256); //页数据传送数据完成
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: BYTE READ OPERATION 只读取一个字节
=============================================================================*/
unsigned char ReadByte(unsigned int blockadd,unsigned char pageadd)
{
unsigned char i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0); //送读命令
NfAddre(blockadd,pageadd); //送开始字节
NF_RB=1;while(!NF_RB); //Data Transfer from Cell to Register max 10us
NF_RE=0;
P1=0xff;
i=P1;
NF_RE=1;
NF_CE=1;
return(i);
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 保留字读 Command input sequence for programming ’C’ area
只读一个字节
=============================================================================*/
unsigned char ReadSpare(unsigned int blockadd,unsigned char pageadd)
{
unsigned char j;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0x50); //读C页数据512-527
NfAddre(blockadd,pageadd); //送开始字节
NF_RB=1;while(!NF_RB); //Data Transfer from Cell to Register max 10us
NF_RE=0;
P1=0xff;
j=P1;
NF_RE=1;
NF_CE=1;
return(j);
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 单字节写 Command input sequence for programming ’A’ area
单个字节写
=============================================================================*/
void WirteByte(unsigned int blockadd,unsigned char pageadd,unsigned char buf)
{
// unsigned int i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0x80);
NfAddre(blockadd,pageadd); //送开始字节
NF_WE=0;
P1=buf;
NF_WE=1;
NfCommand(0x10);
NF_RB=1;while(!NF_RB); //Page Program Time max 500us
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 保留字写 Command input sequence for programming ’C’ area
单个字节写
=============================================================================*/
void WirteSpare(unsigned int blockadd,unsigned char pageadd,unsigned char buf)
{
// unsigned int i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0x50);
NfCommand(0x80);
NfAddre(blockadd,pageadd); //送开始字节
NF_WE=0;
P1=buf;
NF_WE=1;
NfCommand(0x10);
NF_RB=1;while(!NF_RB); //Page Program Time max 500us
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 页编程 PAGE PROGRAM OPERATION
可连续写256个字节
=============================================================================*/
void WirtePage(unsigned int blockadd,unsigned char pageadd)
{
unsigned char i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0x00);
NfCommand(0x80);
NfAddre(blockadd,pageadd); //送开始字节
i=0;
do
{
NF_WE=0;
P1=DataArray[i];
i++;
NF_WE=1;
}
while(i); //页数据传送数据完成
NfCommand(0x10);
NF_RB=1;while(!NF_RB); //Page Program Time max 500us
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int blockaddh 2nd 3th的地址 (Row地址)
unsigned char pageadd 1st的地址 (Column地址)
//函数功能: 页编程 PAGE PROGRAM OPERATION
连续写一整页512个字节
=============================================================================*/
void WirtePageF(unsigned int blockadd)
{
unsigned int i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0x00);
NfCommand(0x80);
NfAddre(blockadd,0); //送开始字节
i=0;
do
{
NF_WE=0;
P1=DataArray[i];
i++;
NF_WE=1;
}
while(i<512); //页数据传送数据完成
NfCommand(0x10);
NF_RB=1;while(!NF_RB); //Page Program Time max 500us
NF_CE=1;
}
/*=============================================================================
//参 数: 将IO0送出,判断IO0是否为0,为1操作失败
//函数功能: 读状态 Status Read Cycle
=============================================================================*/
unsigned char ReadStatus(void)
{
unsigned char i;
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NF_CLE=1;
P1=0x70; NF_WE=0; NF_WE=1;
NF_CLE=0;
NF_RE=0;_nop_();
i=P1;
NF_RE=1;NF_CE=1;
if(i&0x01) return(0); //操作失败返回
else return(0xff); //操作成功返回
}
/*=============================================================================
//参 数: unsigned int blockaddh_s 2nd 3th的地址
//函数功能: 块擦除 BLOCK ERASE OPERATION
=============================================================================*/
void EraseBlock(unsigned int blockadd)
{
NF_RE=1;NF_CE=0;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NfCommand(0x60);
NF_ALE=1;
P1=blockadd%256;NF_WE=0;NF_WE=1;
P1=blockadd/256;NF_WE=0;NF_WE=1;
NF_ALE=0;
NfCommand(0xD0); //块擦除命令
NF_RB=1;while(!NF_RB); //读忙信号 max 3ms
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned cahr blockaddl_s 源1st的地址
unsigned int blockaddh_s 源2nd 3th的地址
unsigned char blockaddl_e 目的1st的地址
unsigned int blockaddh_e 目的2nd 3th的地址
//函数功能: 备份复制操作 COPY-BACK PROGRAM OPERATION
//___这个调试不通过,还不有找到原因
=============================================================================*/
void CopyBack(unsigned int blockaddh_s,blockaddh_e)
{
NF_RE=1;NF_CLE=0;NF_ALE=0;NF_WE=1;NF_WP=1;
NF_CE=0;
NfCommand(0);
NfAddre(blockaddh_s,0); //WE High to Busy 100ns
NF_RB=1;while(!NF_RB); //读忙信号 10us
NfCommand(0x80);
NfAddre(blockaddh_e,0);
NfCommand(0x10);
NF_RB=1;while(!NF_RB); //读忙信号 max500us
NF_CE=1;
}
/*=============================================================================
//参 数: unsigned int id 送出NandFlash ID号
//函数功能: 读芯片的ID号
=============================================================================*/
unsigned int ReadID(void)
{
unsigned int i;
NF_CE=0;NF_ALE=0;NF_WE=1;NF_RE=1;
NfCommand(0x90);
NF_ALE=1;
P1=0; NF_WE=0;NF_WE=1;
NF_ALE=0;
P1=0xff;
NF_RE=0;
i=0x00ff&P1;
NF_RE=1;
P1=0xff;
NF_RE=0;
i=(P1*256)|i;
NF_RE=1;
NF_CE=1;
return(i);
}
void ReadAdder(void)
{
unsigned int BlockCoun;
BlockCoun=0;
do
{
SBUF=ReadSpare(BlockCoun,0x03); //判断第4个字节是否为0xff
while(!TI);
TI=0;
SBUF=ReadSpare(BlockCoun,0x04); //判断第5个字节是否为0xff
while(!TI);
TI=0;
BlockCoun+=32; //每块共有32page
}
while(BlockCoun);
}
void BadBlockScan(void)
{
unsigned int BlockCoun;
BlockCoun=0;
do
{
SBUF=ReadSpare(BlockCoun,0x05); //判断第6个字节是否为0xff
while(!TI);
TI=0;
BlockCoun+=32; //每块共有32page
}
while(BlockCoun);
}
void Send___(unsigned char i)
{
SBUF=i;
while(!TI);
TI=0;
}
void SendPage___(void)
{
unsigned int j;
for(j=0;j<256;j++)
{
SBUF=DataArray[j];
while(!TI);
TI=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -