您的位置:首页 > 其它

Nand Flash数据存储规则与数据读写方法(三)

2011-11-28 17:38 344 查看
    谈到Nand Flash的数据存储方式,关于NAND Flash的数据读写方法方面的文章不多,这篇文章详细讲述了Nand Flash数据存储方式和数据读写方法,并用具体的芯片为例作了详细的解释。

      
Nand Flash数据存储规则与数据读写方法(一)

      
Nand Flash数据存储规则与数据读写方法(二)
      
Nand Flash数据存储规则与数据读写方法(三)

    下面是源代码:

/* 

本代码只属于交流学习,不得用于商业开发

*/

#include "s3c2410.h"

#include "nand_flash.h"

static unsigned char seBuf[16]={0xff};

//--------------------------------------------------------------------------------------

unsigned short nf_checkId(void)

{

int i;

unsigned short id;

NF_nFCE_L(); //chip enable

NF_CMD(0x90); //Read ID

NF_ADDR(0x0);

for(i=0;i<10;i++); //wait tWB(100ns)

id=NF_RDDATA()<<8; // Maker code(K9S1208V:0xec)

id|=NF_RDDATA(); // Devide code(K9S1208V:0x76)

NF_nFCE_H(); //chip enable

return id;

}

//--------------------------------------------------------------------------------------

static void nf_reset(void)

{

int i;

NF_nFCE_L(); //chip enable

NF_CMD(0xFF); //reset command

for(i=0;i<10;i++); //tWB = 100ns.

NF_WAITRB(); //wait 200~500us;

NF_nFCE_H(); //chip disable

}

//--------------------------------------------------------------------------------------

void nf_init(void)

{

rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);

// 1 1 1 1 1 xxx r xxx, r xxx

// En r r ECCR nFCE=H tACLS tWRPH0 tWRPH1

nf_reset();

}

//--------------------------------------------------------------------------------------

void nf_read(unsigned int src_addr,unsigned char *desc_addr,int size)

{

int i;

unsigned int column_addr = src_addr % 512; // column address

unsigned int page_address = (src_addr >> 9); // page addrress

unsigned char *buf = desc_addr;

while((unsigned int)buf < (unsigned int)(desc_addr) + size)

{

NF_nFCE_L(); // enable chip

/*NF_ADDR和NF_CMD为nand_flash的地址和命令寄存器的解引用*/

if(column_addr > 255) // 2end halft

NF_CMD(0x01); // Read2 command. cmd 0x01: Read command(start from 2end half page)

else

NF_CMD(0x00); // 1st halft?

NF_ADDR(column_addr & 0xff); // Column Address

NF_ADDR(page_address & 0xff); // Page Address

NF_ADDR((page_address >> 8& 0xff); // ...

NF_ADDR((page_address >> 16) & 0xff); // ..

for(i = 0; i < 10; i++); // wait tWB(100ns)/////??????

NF_WAITRB(); // Wait tR(max 12us)

// Read from main area

for(i = column_addr; i < 512; i++)

{

*buf++= NF_RDDATA();

}

NF_nFCE_H(); // disable chip

column_addr = 0;

page_address++;

}

return ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  flash 存储 cmd command c