⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k9f5608.c

📁 K9F5608.rar
💻 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 + -