广告

samsung 的flash芯片k9f1208的读写操作

2009-6-19 21:45 3566 0 分类: 通信

转自http://autoelec.blog.sohu.com/75529864.html


nand flash芯片是k9f1208,它的读写操作、包括块擦除函数如下所示:


//addr = page address 参数addr是页对齐的地址,每个页是512个字节


U32 EraseBlock(U32 addr)
{
 U8 stat;


 addr &= ~0x1f;
  
 NFChipEn(); 
 WrNFCmd(ERASECMD0);  
 WrNFAddr(addr);
 WrNFAddr(addr>>8);
 if(NandAddr)
  WrNFAddr(addr>>16);
 WrNFCmd(ERASECMD1);  
 stat = WaitNFBusy();
 NFChipDs();
 
#ifdef ER_BAD_BLK_TEST
 if(!((addr+0xe0)&0xff)) stat = 1; //just for test bad block
#endif
 
 //printf("Erase block 0x%x %s\n", addr, stat?"fail":"ok");
 putch('.');
 return stat;
}


 


//addr = page address
void ReadPage(U32 addr, U8*buf)
{
 U16 i;
 //printf("read page %x",addr);
 NFChipEn();
 WrNFCmd(READCMD0);
 WrNFAddr(0);
 WrNFAddr(addr);
 WrNFAddr(addr>>8);
 if(NandAddr)
  WrNFAddr(addr>>16);
 InitEcc();
 WaitNFBusy();
 for(i=0; i<512; i++)
  buf[i] = RdNFDat();
 NFChipDs();
}
void ReadSpare(U32 addr, U8*buf)
{
   
 //U8 dat;
 U8 i;
 //printf("read spare %x",addr);
 //addr &= ~0x1f;
 
 NFChipEn();
 
 WrNFCmd(READCMD2); //point to area c
 WrNFAddr(0);  //mark offset 0~15
 WrNFAddr(addr);
 WrNFAddr(addr>>8);
 if(NandAddr)
  WrNFAddr(addr>>16);
 WaitNFBusy();
    for(i=0;i<16;i++){
  buf[i] = RdNFDat();
     
    }
 WrNFCmd(READCMD0); //point to area a
 
 NFChipDs();


 //return (dat!=0xff);
}


写页内容的函数,除了对512个字节操作以外,还对于16个spare的字节做了操作,可以根据自己的要求决定是否包含对spare的操作。
U32 WritePage(U32 addr, const U8 *buf, U16 blk_idx)
{
 U16 i;
 U8 stat;
 U8 ecc_code[3];
 U8 oob_info[16];
 //printf("write page %x",addr); 
 for(i=0; i<sizeof(oob_info); i++)
  oob_info[i] = 0xff;
 
 nand_calculate_ecc(buf, ecc_code);
 oob_info[eccpos[0]] = ecc_code[0];
 oob_info[eccpos[1]] = ecc_code[1];
 oob_info[eccpos[2]] = ecc_code[2];
 nand_calculate_ecc(buf+256, ecc_code);
 oob_info[eccpos[3]] = ecc_code[0];
 oob_info[eccpos[4]] = ecc_code[1];
 oob_info[eccpos[5]] = ecc_code[2];
 oob_info[BLK_IDXL]  = blk_idx;
 oob_info[BLK_IDXH]  = blk_idx>>8;
 oob_info[FMT_TAG]   = format_tags[addr&0x1f];
 
 NFChipEn();
 WrNFCmd(PROGCMD0);
 WrNFAddr(0);
 WrNFAddr(addr);
 WrNFAddr(addr>>8);
 if(NandAddr)
  WrNFAddr(addr>>16);
// InitEcc(); 
 for(i=0; i<512; i++)
  WrNFDat(buf[i]);
  
 /*if(!addr) {
  WrNFDat('b');
  WrNFDat('o');
  WrNFDat('o');
  WrNFDat('t');  
 } else {  
  for(i=0; i<sizeof(oob_info); i++)
   WrNFDat(oob_info[i]);
 }*/
/* tmp[0] = rNFECC0;
    tmp[1] = rNFECC1;
    tmp[2] = rNFECC2;
     
 WrNFDat(tmp[0]);
 WrNFDat(tmp[1]);
 WrNFDat(tmp[2]);
*/  
 WrNFCmd(PROGCMD1);
 stat = WaitNFBusy();
 NFChipDs();
 
#ifdef WR_BAD_BLK_TEST
 if((addr&0xff)==0x17) stat = 1; //just for test bad block
#endif
  
 if(stat)
  printf("Write nand flash 0x%x fail\n", addr);
 else { 
  U8 RdDat[512];
  
  ReadPage(addr, RdDat);  
  for(i=0; i<512; i++)
   if(RdDat[i]!=buf[i]) {
    printf("Check data at page 0x%x, offset 0x%x fail\n", addr, i);
    stat = 1;
    break;
   }
 }
  
 return stat; 
}
void WriteSpare(U32 addr,const U8* buf)
{
    int i;
 //addr &= ~0x1f;
 //printf("write spare %x",addr);
 NFChipEn();
 
 WrNFCmd(READCMD2); //point to area c
 
 WrNFCmd(PROGCMD0);
 WrNFAddr(0);  //mark offset 0
 WrNFAddr(addr);
 WrNFAddr(addr>>8);
 if(NandAddr)
  WrNFAddr(addr>>16);
 for(i=0;i<16;i++){
  WrNFDat(buf[i]);
 }


 //WrNFDat(0);   //mark with 0
 //WrNFDat(0);
 //WrNFDat(0);   //mark with 0
 //WrNFDat(0);
 WrNFCmd(PROGCMD1);
 WaitNFBusy();  //needn't check return status
 
 WrNFCmd(READCMD0); //point to area a
  
 NFChipDs();
}


有关READDCMD0等的定义,可以参考k9f1208的用户手册。


 

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
lisa_sd 2010-03-14 20:01
详解 堆与栈
题记--最近实验室的同志们讨论起堆栈的问题,从单片机、汇编给出的堆栈的概念到后来C语音的定义,以及数据结构、操作系统等,想想确实比较混乱。我的C语言没有接受过系统的讲解,都是用到时自己看书学的,所以一...
lisa_sd 2010-01-26 11:20
电容分类
转自:http://diybbs.zol.com.cn/9/198_87546.html 电容分类及钽电容详解    消费者可能不会知道,好的显卡采用的电容价格不菲,如钽聚合物电容每颗价格都在1美元左...
lisa_sd 2009-12-25 10:11
系统设计中低功耗的探讨
系统设计中低功耗的探讨来源:日电电子(NEC)网1 引言节能是二十一世纪生活中最大的一个话题。电源储备的概念并不仅仅用于嵌入式便携设备, 几乎对于所有产品都是一个重要部分。说到低功耗,大部分人都会想到...
lisa_sd 2009-12-11 10:08
随着笔记本电脑外形的千差万别,电池要迎合它的外形而变化,有长方形的(像板砖:)),圆柱型的。由于电池
再好的笔记本电池如果不注重日常的维护和保养,它的使用寿命也会很快变短。如何更好的使用电池成为了我们关心的话题。常常在网上看到一些朋友不舍得使用电池,我觉得大可不必这样,电池属于消耗型产品,总有一天会老...
lisa_sd 2009-12-11 10:07
各式各样的电池并不通用
随着笔记本电脑外形的千差万别,电池要迎合它的外形而变化,有长方形的(像板砖:)),圆柱型的。由于电池存在这差异,因此他们不能通用,有时候即使是同一系列的都不成。如IBM X2和X3系列。而且很多电池放...
lisa_sd 2009-12-11 10:06
笔记本电池的分类及结构特点
从笔记本诞生的那天起,电池这个”仆人“就已经伴随在它的身边,没有电池,可以说笔记本就不能称为”移动的电脑“。随着笔记本性能和技术的不断提升与改进,它”仆人“的“素质”也越来越高,从过去的镍铬电池、镍氢...
我要评论
0
0
广告
关闭 热点推荐上一条 /1 下一条