Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4534535
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: 嵌入式

2010-03-17 21:56:35

    三星公司的Nand Flash型号为K9F1G08U0B是128MB大小的储存器,其读写与64MB的K9F1208有一定的区别,在此记录一下,有关Nand Flash原理的分析请看我的另一篇文章。K9F1G08U0B的 1 Block = 64 Page=(128K +4 K) 1 page = (2K + 64)byte。下面是它的组织结构图。
    其中在命令上也有区别,主要是读数据的命令上有变化,必须在第一个周期发送完命令0x00H,再发送完地址序列后,再发送一个0x30命令。由于页的大小是2KB的,所以在传送地址序列是,列地址的大小也不一样了,页内地址的话、row地址应该是A11~A26. 第五个周期(也就是第三个row地址周期)只有在NAND Flash大小超过128M的时候才有意义。K9F1G08U0B会自己忽略,也就是说可以去掉!下面的数据手册上的地址周期的描述。

int NF_Write_Page(U32 addr,U8 *buf,U32 size)
{    /* 函数传送的参数 addr 应该是一个不大于0x07FFFFFF,的值,因为Nand Flash 是128MB的地址范围就是 0-0x07FFFFFF 64MB 0---0x03FFFFFF*/
    U32 i,page_num;
    U32 bak;
    NF_nFCE_L();
    NF_CLEAR_RB();
    NF_CMD(0x80);
    page_num = addr >> 11;//相当于addr / 2408 页大小是2KB
    
    NF_ADDR(addr & 0xff);
    NF_ADDR((addr>>8) & 0x7);//表示从一页中的某个字节开始写的,
    NF_ADDR(page_num & 0xff);
    NF_ADDR((page_num >> 8) & 0xff);
    NF_ADDR((page_num >> 16)& 0xff);
    //NF_ADDR((addr >> 11) & 0xff); 这里和上面的三行是等价的,也是求page和block地址,只是表示的方法不一样
    //NF_ADDR((addr >> 19) & 0xff);

    //NF_ADDR((addr >> 27) & 0xff);
    for(i = 0;i < size;i++)
    {
        NF_WRDATA(buf[i]);
    }
    
    NF_CMD(0x10);
    NF_WAITRB();
    
    NF_CMD(0x70);
    bak = NF_RDDATA8();
    NF_nFCE_H();
    
    if(bak & 0x01)
    {
        return 0;
        Uart_Printf("Write Faile!\r\n");
    }
    else
    { Uart_Printf("Write successful!\r\n");
        return 1;
    }
}  


int Nand_Read_Page(U32 addr,U8 * buf,U32 size)
{
    U8 *ptr16 = (U8 *)buf;
    U32 i,page_num,bak;
    
    NF_nFCE_L();
    NF_CLEAR_RB();
    NF_CMD(0x00);
    
    page_num = addr >> 11 ;
    
    NF_ADDR (addr & 0xff);
    NF_ADDR ((addr >>8)& 0x7 );
    NF_ADDR(page_num & 0xff);
    NF_ADDR ((page_num >>8) & 0xff);
    NF_ADDR ((page_num >>16) & 0xff);
    //NF_ADDR((addr >> 11) & 0xff);
    //NF_ADDR((addr >> 19) & 0xff);
    //NF_ADDR((addr >> 27) & 0xff);

    NF_CMD(0x30);//发送完地址序列后还要发送 命令0x30
    
    NF_DETECT_RB();
    
    for(i=0;i< size;i++)
    {
        buf[i] = NF_RDDATA8();
    }
    NF_CMD(0x70);
    bak = NF_RDDATA8();
    NF_nFCE_H();
    if(bak & 0x01)
    {
        Uart_Printf("Read faile!\r\n");
        return 0;
    }
    else
    {
        Uart_Printf("Read successful\r\n");
        return 1;
    }
}


阅读(8756) | 评论(5) | 转发(4) |
给主人留下些什么吧!~~

chinaunix网友2010-09-21 16:15:34

请问,列地址不是12位吗,你怎么只移11下,还有ADDRESS不是从A0~~A27吗?

chinaunix网友2010-09-21 13:53:07

你好,谢谢你能回复我,你有没有QQ啊,加下行不,这样有不懂的也好请教下你!我的QQ是360600219。等待!

chinaunix网友2010-09-19 18:57:28

请问你有没有这个驱动的中文资料啊,有的话能不能分享下,我正在做这一块程序。jutyy@163.com谢谢了。

chinaunix网友2010-08-25 15:57:22

可以把K9F1G08U0B这个驱动的 发我吗 864288505@163.com

chinaunix网友2010-08-13 13:35:38

这个函数NF_CLEAR_RB() 什么用处,是清R/B信号么?R/B信号为低说明nandflash正在忙,此时强制拉高会不会有问题?