nandflash k9f5608的读写程序.c

来自「NANDFlash的扩展源码!现在很多单片机需要更大的容量必须扩展nandfla」· C语言 代码 · 共 406 行

C
406
字号
/********************************************************************

本程序大部分功能调试通过,没有调试或没有通过已在功能模块里说明

注: 本程序只供学习使用,未经作者允许,不能用于其它任何用途 

//模 块 名:单片机控制K9F5608的读写程序

//创 建 者:电子伙伴                        

//修 改 者:情非得以                                             

//功能描述:NANDFLASH读写程序

//其他说明:50MHz晶振,双倍数振荡频率 单指令周期为0.12us

//兼容性 :适合大部分的NANDFLASH,如需要根据手册做简单修改即可

//芯片型号:    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);
}
 
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?