主题 : NAND flash cannot Erase and Write 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 10181
精华: 0
发帖: 3
金钱: 25 两
威望: 11 点
综合积分: 6 分
注册时间: 2009-10-26
最后登录: 2009-12-25
楼主  发表于: 2009-12-18 16:38

 NAND flash cannot Erase and Write

管理提醒: 本帖被 qq2440 从 micro2440技术交流专区 移动到本区(2013-11-18)
Hi :
micro2440/NAND 128M
我根據書上與網路上執行了NAND 的Read/Erase/Write function,但發現執行完Erase/Write(可編繹過)後再用Read去檢查,發現值並無更改,
也研究了好幾天,但仍無解,所以只好請教大家,謝謝..
代碼如下:

int main()
{

    int  m;  
    unsigned int block,page;  
    unsgined char  buffer[NAND_PAGE_SIZE+NAND_SPARE_SIZE];
    unsigned char  sparebuf[NAND_SPARE_SIZE];
  block=500;  
  page=0;

  NF_EraseBlock(block);

  for(m=0; m<20 ;m++)    
     buffer[m] = m ;    
        
  for (m=0; m<64; m++)
     sparebuf[m]=0xff;

   NF_WritePage(block, page, buffer, sparebuf);

   for(m=0; m<64 ;m++)    
       buffer[m] = 0 ;
  

   NF_ReadPage(block, page, buffer, buffer+2048);
  
   for(m=0; m<64 ;m++)
        printf("%02x ",buffer);
  

return 0;
}

int NF_EraseBlock(unsigned int block)  
{  
    unsigned char data;
    unsigned int blockPage;  

    if(is_bad_block(block) && block!=0)    
       return 0;  
  
    nand_enable_chip();  
    
    nand_is_busy();
      
    nand_write_cmd(0x60);
    
    blockPage=(block<<6);  
    nand_write_addr(blockPage&0xff);    
    nand_write_addr((blockPage>>8)&0xff);      
  
    nand_write_cmd(0xd0);
  
    nand_is_busy();    
    
    nand_write_cmd(0x70);
    data=nand_read_data_byte();
          
    if (data&0x1)  {      
        nand_disable_chip();  
        printf("[ERASE_ERROR:block#=%d]\n",block);  
        return 0;  
    }   else  {  
        nand_disable_chip();  
        return 1;  
    }  
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int NF_WritePage(unsigned int block, unsigned int page, unsigned char *buffer, unsigned char *spareBuf)  
{  
    int i;  
    unsigned int blockPage;  
    unsigned char *bufPt=buffer;  
    unsigned char stat;
          
    nand_enable_chip();
    
    nand_is_busy();
    blockPage=(block<<6)+page;  
    nand_write_cmd(0x80);        
    nand_write_addr(0);      
    nand_write_addr(0);
    nand_write_addr(blockPage&0xff);                            
    nand_write_addr((blockPage>>8)&0xff);  
  
    for(i=0;i<2048;i++)    {  
        nand_write_data(*bufPt++);                                        // Write one page to NFM from buffer    
    }    
    
    if(spareBuf!=NULL) {  
      for(i=0;i<64;i++) {  
     nand_write_data(spareBuf);    
     }  
   }  
  
    nand_write_cmd(0x10);    
    nand_is_busy();  
    nand_write_cmd(0x70);  
   stat=nand_read_data_byte();  
    
    if (stat&0x1) {      
        nand_disable_chip();  
        printf("[PROGRAM_ERROR:block#=%d]\n",block);  
        return 0;  
    }  
    else {  
    nand_disable_chip();  
    return 1;  
   }  
}