搜索
bottom↓
回复: 5

求 LPC2378 上的nandflash初始化程序,谢谢

[复制链接]

出0入0汤圆

发表于 2008-7-20 11:18:19 | 显示全部楼层 |阅读模式
最近在调LPC2378外挂nandflash,想用总线方式调试,但一直没有成功,请大家帮忙

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入17汤圆

发表于 2008-7-20 13:58:16 | 显示全部楼层
用IO口模拟时许吧,我试过,可以读写数据的

出0入0汤圆

 楼主| 发表于 2008-7-20 14:28:39 | 显示全部楼层
IO模拟程序搞不定啊,可以读ID,但读写页面不正常,读出来是FF,能不能传一下调好的程序

//写命令
void NFWrCmd(uint8 cmd)
{
    OS_ENTER_CRITICAL();
    NF_DPORT_OUT;
    NF_ALE_CLR;
    NF_nCS_CLR;
    NF_CLE_SET;
    NF_nWE_CLR;
    FIO3SET |= (uint32)cmd;
    NF_nWE_SET;
    NF_CLE_CLR;
    NF_ALE_SET;
    OS_EXIT_CRITICAL();
}

//写地址
void NFWrAddr(uint8 addr)
{
    OS_ENTER_CRITICAL();
    NF_DPORT_OUT;
    NF_nWE_SET;
    NF_nCS_CLR;
    NF_CLE_CLR;
    NF_ALE_SET;
    NF_nWE_CLR;
    FIO3SET |= (uint32)addr;
    NF_nWE_SET;
    NF_BUSY_END; // wait busy end

    NF_ALE_CLR;
    OS_EXIT_CRITICAL();
}

//写数据
void NFWrDat(uint8 dat)
{
    OS_ENTER_CRITICAL();
    NF_DPORT_OUT;
    NF_nWE_SET;
    NF_CLE_CLR;
    NF_nCS_CLR;
    NF_ALE_CLR;
    NF_nWE_CLR;
    NF_BUSY_END; // wait busy end
    FIO3SET |= (uint32)dat;
    NF_BUSY_END; // wait busy end
    NF_nWE_SET;
    OS_EXIT_CRITICAL();
}

//读数据
uint8 NFRdDat(void)
{

    uint8 Rdata;
    OS_ENTER_CRITICAL();
    NF_DPORT_IN;
    NF_nWE_SET;
    NF_CLE_CLR;
    NF_ALE_CLR;
    NF_nCS_CLR;
    NF_nOE_CLR;
    NF_BUSY_END; // wait busy end

    Rdata =  (UINT8)( FIO3PIN );
    NF_BUSY_END;
    NF_nOE_SET;
    OS_EXIT_CRITICAL();
    return Rdata;

}


/*********************************************************************************************************
** 函数名: NF_ReadPage()
** 说  明: 读页面
*********************************************************************************************************/
void NF_ReadPage(uint32  Block, uint8 Page,uint8 *Buff)
{

    uint16 i, j;
    uint32  BlockPage;
    uint8 HAdd;
    uint8 MAdd;
    uint8 LAdd;
    uint8 *bufPt = Buff;
        
        //每块32页,每页512字节
    Page &= 0x1F;              //[Page  = A9,A10,A11,A12,A13]
    //计算实际地址
    BlockPage = (Block<<5) + Page; //[Block = A14 ...]
    LAdd = (unsigned char)(BlockPage & 0xFF);
    MAdd = (unsigned char)(BlockPage>>8 & 0xFF);
    HAdd = (unsigned char)(BlockPage>>16 & 0xFF);
        
    //读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变
    OS_ENTER_CRITICAL();

    NFWrCmd(0x00);
    NFWrAddr(0x00);
    //NFWriteAdd(HAdd, MAdd, LAdd);
    NFWrAddr(LAdd);
    NFWrAddr(MAdd);
    NFWrAddr(HAdd);

    //The 528 bytes of data within the selected page are
    //transferred to the data registers in less than 12us(tR).
    for (j=0; j<10; j++);  //wait tWB(100ns)/////??????

    NF_BUSY_END;   // Wait tR(max 12us)

    for (i=0;i<512;i++)
    {
        *bufPt++ = NFRdDat();   // Read one page
    }

    OS_EXIT_CRITICAL();//开中断
}


/*********************************************************************************************************
** 函数名: NF_WritePage()
** 说  明: 写页面
*********************************************************************************************************/
uint8 NF_WritePage(uint32 Block, uint8 Page, uint8 *Buff)
{

    uint8  Status;
    uint8 HAdd;
    uint8 MAdd;
    uint8 LAdd;
    uint16 i;
    uint32  BlockPage;
    uint8 *bufPt = Buff;
   
  

    //每块32页,每页512字节
    Page     &= 0x1F;              //[Page  = A9,A10,A11,A12,A13]
    //计算实际地址
    BlockPage = (Block<<5) + Page; //[Block = A14 ...]
    LAdd = (unsigned char)(BlockPage & 0xFF);
    MAdd = (unsigned char)(BlockPage>>8 & 0xFF);
    HAdd = (unsigned char)(BlockPage>>16 & 0xFF);



    //读写NAND的时候,总线不可以变化,中断读写特殊寄存器可能引起总线跳变
    OS_ENTER_CRITICAL();//关中断

    NFWrCmd(0x80);
    NFWrAddr(0x00);
        //NFWriteAdd(HAdd, MAdd, LAdd);
        NFWrAddr(LAdd);
    NFWrAddr(MAdd);
    NFWrAddr(HAdd);
        
    for (i=0;i<512;i++)
    {
        NFWrDat(*bufPt++);    // Write one page to NFM from buffer
    }

    NFWrCmd(0x10);
    //Read Staus Register
    while (1)
    {//Device Operation --- BIT6
        NFWrCmd(0x70);
        Status = NFRdDat();
        if (Status & (1<<6))
        {//Busy : "0" Ready : "1"
            break;
        }
    }
    //Read Staus Register
    //Total Pass/Fail -- BIT0
    NFWrCmd(0x70);;
    Status = NFRdDat();
    if (Status & (1<<0))
    {//Fail : "1"
        OS_EXIT_CRITICAL();//开中断
        return 0;
    }
    else
    {//Pass : "0"
        OS_EXIT_CRITICAL();;//开中断
        return 1;
    }
}

出0入0汤圆

发表于 2011-3-30 09:34:42 | 显示全部楼层
你好,请问如何去模拟IO时序,我现在也想扩展NAND FLASH

出0入0汤圆

发表于 2011-3-30 16:23:01 | 显示全部楼层
之前写的可以读写,但坏块检测还没搞。而且读的时候特别慢……
我没有按页读写,比页小的那个单位是啥来着?忘了

出0入0汤圆

发表于 2011-3-30 16:23:34 | 显示全部楼层
我记得好像是在读的时候加了延时……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表