3997|1

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

当NAND flash执行erase all blocks操作时,若某一block执行erase后返回info为OK,是否可以确信该block就valid了? [复制链接]

以下是某一NAND flash的erase all blocks源码.

/*F**************************************************************************
* NAME: nf_erase_all_block
*----------------------------------------------------------------------------
* PARAMS:   
*           
* return:   
*   OK : erase done
*   KO : erase not done
*----------------------------------------------------------------------------
* PURPOSE:
*   This function erase all blocks on a NF card and write CIS information
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   This function use the global variable Uint32 address
*----------------------------------------------------------------------------
* REQUIREMENTS:
* ram/xram:
* cycle:
* stack:
* code:
*****************************************************************************/
bit nf_erase_all_block (void)
{
Byte i;
Uint16 j;
Uint16 block;
Uint16 block_reserved_space;
bit erase;

  Nf_CS_ON();
  /* Erase all block */
  block_reserved_space = (Uint16) (((nf_reserved_space_start >> 5) % 1000));
  gl_address = 0;
  for (nf_zone = 0; nf_zone < NF_ZONE_MAX_CPT; nf_zone++)
  {
    for (j = 1024; j != 0; j--)
    {
      Nf_wait_busy();
      Nf_read_open_C_area(gl_address, 0x05); /* Read block status byte */
      erase = TRUE;
      if (Nf_rd_byte() != 0xFF) /* if bad block */
      {
        erase = FALSE;          /* don't erase block */
      }
      else
      {
        ((Byte*)&block)[0] = Nf_rd_byte(); /* Read logical block address */
        ((Byte*)&block)[1] = Nf_rd_byte();
        if ( (MEM_RESERVED_SIZE != 0) && (nf_zone == (NF_ZONE_MAX_CPT - 1)))
        {
          if ((((Byte*)&block)[0] & 0xF8) == 0x10)
          {
            block = (block & 0x0FFF) >> 1;
            if (block >= block_reserved_space)      /* If it is a reserved block */
            {
              erase = FALSE;                        /* Don't erase block */
            }
          }
        }
      }

      if (NF_FULL_CHIP_ERASE == FALSE)
      {
        if (((Byte*)&block)[0] != 0xE8)
        {
          erase = FALSE;
        }
      }
      else
      {
        if (((Byte*)&block)[0] == 0x00)
        {
          erase = FALSE;
        }
      }

      if (erase) //以下开始完成erase
      {
        nf_block_erase(gl_address);
        if (nf_check_status() == KO)
        {
          nf_mark_bad_block(); /* Failure on erase operation */     
        }
        else //else部分有何作用???
        { /* Fill redundant area with 0x00 */
          Nf_write_open_C_area(gl_address, 0x00); // 即spare array
          for (i = 16; i != 0; i--)
            Nf_wr_byte(0x00);
          Nf_send_command(NF_PAGE_PROGRAM_CMD);        /* Valid the page programmation */
          if ( nf_check_status() == KO)
          {
            nf_mark_bad_block();                        /* Failure on program operation */
          }
          else
          {
            Nf_read_open_C_area(gl_address, 0x00);        /* Read 16 bytes */
            i = 16;
            while ((i != 0) && (Nf_rd_byte() == 0x00)) i--;

            if (i)
            {
              nf_mark_bad_block();
            }
            else
            {
              nf_block_erase(gl_address);          /* Finally, erase the block */      
              if ( nf_check_status() == KO)
              { /* Failure on erase operation */
                nf_mark_bad_block();      
              }
            }
          }
        }
      }
      gl_address += 32;
    }
  }
  return (nf_read_spare_byte());
}

从以上erase算法可以看出,当需要对block进行erase操作时,虽erase OK了,还要验证spare是否编程OK,若spare也OK了,再把erase前面编程的0,该block才erase结束;否则视bad block处理.如此这般,是为何用?

最新回复

因为擦除时写的是全1,所以之后写个全0啊  详情 回复 发表于 2008-12-20 10:11
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
因为擦除时写的是全1,所以之后写个全0啊
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表