|
/********************************************************************
本程序大部分功能调试通过,没有调试或没有通过已在功能模块里说明
注: 本程序只供学习使用,未经作者允许,不能用于其它任何用途
//模 块 名:单片机控制K9F5608的读写程序
//创 建 者:电子伙伴 日期:2006-4-10 15:47
//修 改 者: 日期:
//功能描述:
//其他说明:50MHz晶振,双倍数振荡频率 单指令周期为0.12us
//芯片型号: STC89C58RD
//配 置:
//版 本:V1.0
********************************************************************/
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); } |