三星NANDFLASH K9F2G08U0B

如果有朋友写三星NANDFLASH   K9F2G08U0B的驱动,以此帖为讨论,大家一同分享一下。

目前,正在研究这个,很多地方的理解不正确,大家一同探讨,答疑!

for(i = (start_addr >> 12); size > 0; )  //右移12位,获取到列地址
{
        rLB_ReadPage(i, to);
        size -= 2048;
        to += 2048;
        i ++;
}


void rLB_ReadPage(U32 addr, unsigned char * to)    //该处的addr就是以上右移12位后的行地址信息
{
        U32 i;

        rNF_Reset();

        //  Enable the chip
        NF_nFCE_L();   
        NF_CLEAR_RB();

        // Issue Read command
        NF_CMD(CMD_READ);

        //  Set up address    设置读取的地址
        NF_ADDR(0x00);
        NF_ADDR(0x00);
        NF_ADDR((addr) & 0xff);      //以下三个地址是行地址
        NF_ADDR((addr >> 8) & 0xff);
        NF_ADDR((addr >> 16) & 0xff);

        NF_CMD(CMD_READ3);

        NF_DETECT_RB();                // wait tR(max 12us)

        for (i = 0; i < 2048; i++)       //该指令执行以后,实际可获取的是2112 bytes,但2048 bytes 以后的数据是属于附加的一些信息,所以这里没有获取
        {
                to[i] =  NF_RDDATA8();
        }

        NF_nFCE_H();

}


其它的相关指令还在研究中,如果有朋友已经有结果,有兴趣的话分享一下。

作者: txgc_wm   发布时间: 2011-03-30

一楼很强

作者: Junyi   发布时间: 2011-03-30

本帖最后由 txgc_wm 于 2011-3-30 23:13 编辑

擦除已验证通过,但不是很完善。


int Nandflash_Erase_Block(int addr)
{
        //U8 stat;
        //char data;

        addr &= ~0xfff;
               
        NF_nFCE_L();
        NF_CLEAR_RB();
                 
        NF_CMD(CMD_ERASE1);               
        NF_ADDR((addr>>12) & 0xff);
        NF_ADDR((addr >> 20) & 0xff);
        NF_ADDR((addr >> 28) & 0xff);

        NF_CMD(CMD_ERASE2);               
       
        //NF_DETECT_RB();       
        //NF_CMD(CMD_STATUS);
        NF_WAITRB();
        Uart0_SendString("erase the block success!");

        NF_nFCE_H();
               
        return 0;
}

如果大家有什么好的修改意见,请帮忙修改!

作者: txgc_wm   发布时间: 2011-03-30