duhaoke 发表于 2010-8-14 09:41:29

求助版主有关天嵌NAND FLASH 代码问题!

1 在readID()的时候定义了四个要读出的芯片信息,
我在调试的过程中发现读完一个字之后NFDAT寄存器就会自动向后移动一个字节。为什么?
        pMID = NF_RDDATA8();
        pDID = NF_RDDATA8();

        nBuff   = NF_RDDATA8();
        n4thcycle = NF_RDDATA8();
2 读出的pDID是0xDA 在三星的技术手册上应该是0X76才对,为什么? 0Xda对应的是什么芯片?

3 NF_DETECT_RB();                // wait tR(max 12us)
这句话怎么理解。要是是判断nand flash忙不忙,可以直接判断NFSTAT的第二位即可啊?为什么?
请版主给予解释,先行谢过!

machoe 发表于 2010-8-14 14:45:43

Nandflash是顺序读取机制的,这点和norflash不同。其次你说读的ID不对,这就要看看你用的是哪个型号,哪款了。不同厂商的不同大小的,肯定不一样。这点你再注意观察一下。
 对于你提的第三个问题,是如个代码里面的。最好把文件和行数帖出来,我好帮你看一下。

duhaoke 发表于 2010-8-17 14:27:19

2# machoe


首先谢谢回复,
1顺序读取怎么理解?
2ID 的问题发出命令之后再 NFDAT寄存器里是0x9510DAECEC为三星公司的标志应该没错的!那么 DA就应该是DEVICE ID 了
3 代码如下 在天嵌公司的TQ2440里 我又加了一个小的测试函数
#include <string.h>

#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "Nand.h"

char        pMID;// 厂商号
        char        pDID;//设备号 device ID
        char        nBuff;//保留字节
        char        n4thcycle;//多层操作码
        int        i;
    U32 ID=0x0;

//
//Reset the chip
//
static void rNF_Reset()
{
        NF_CE_L();//片选
        NF_CLEAR_RB();//清状态位
        NF_CMD(CMD_RESET);//复位
        NF_DETECT_RB();//直到成功
        NF_CE_H();       //取消片选
}


static void rNF_Init(void)
{
        rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
        //CLE和ALE时间 1 (1-CLK)4(4+1)   0(0+1?
        //   1+5+1=7*10ns=70ns         
        //要求写时间要大于50ns
        rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
          //                                          6: Lock spare ECC
          //                                          5: Unlock main data area ECC generation
          //                                          4: Initialize ECC decoder
          //                                          1: Chip select
          //                                          0;NAND flash controller enable
          
        rNFSTAT = 0;//装态位清零 只读位不能发生变化
        rNF_Reset();//重启
}

static U32 rNF_ReadID()
{
       

        NF_nFCE_L();    //片选
        NF_CLEAR_RB();   //清状态/就绪位
        NF_CMD(CMD_READID);        // read id command 0x90
        NF_ADDR(0x0);
        //for ( i = 0; i < 100; i++ );

    pMID = NF_RDDATA8();
       
        pMID = NF_RDDATA8();
        pDID = NF_RDDATA8();

        nBuff   = NF_RDDATA8();
        n4thcycle = NF_RDDATA8();
       
        //ID = NF_RDDATA();
        NF_nFCE_H();//取消片选

    // return ID;
        return (pDID);
}


static void rSB_ReadPage(U32 addr, unsigned char * to)
{
        U32 i;

        rNF_Reset();

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

        // Issue Read command
        NF_CMD(CMD_READ);//Ox00

        //Set up address
        NF_ADDR(0x00);
        NF_ADDR((addr) & 0xff);
        NF_ADDR((addr >> 8) & 0xff);
        NF_ADDR((addr >> 16) & 0xff);


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

        for (i = 0; i < 512; i++)
        {
                to =NF_RDDATA8();
        }

        NF_nFCE_H();

}

static void rLB_ReadPage(U32 addr, unsigned char * to)
{
        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((addr>>9) & 0xff);
        NF_ADDR((addr >> 17) & 0xff);
        NF_ADDR((addr >> 25) & 0xff);

        NF_CMD(CMD_READ3);

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

        for (i = 0; i < 2048; i++)
        {
                to =NF_RDDATA8();
        }

        NF_nFCE_H();

}


void RdNF2SDRAM( )
{
        U32 i;
        U32 start_addr = 0x0;
        unsigned char * to = (unsigned char *)0x30000000;
        U32 size = 0x100000;
        rNF_Init();
        switch(rNF_ReadID())
        {
                case 0x76:
                        for(i = (start_addr >> 9); size > 0; )
                        {
                                rSB_ReadPage(i, to);
                                size -= 512;
                                to += 512;
                                i ++;
                        }
                        break;
                case 0xf1:
                case 0xda:
                case 0xdc:
                case 0xd3:
                        for(i = (start_addr >> 11); size > 0; )
                        {
                                rLB_ReadPage(i, to);
                                size -= 2048;
                                to += 2048;
                                i ++;
                        }
                        break;
        }
}               

void testNandFlash(void)
{
U32 pID,addr;
unsigned char *temp;
int i;
addr=0x30000000;
rNF_Reset();
rNF_Init();
pID= rNF_ReadID();
Uart_Printf("\nmenufactory ID is:");
Uart_Printf("%X",pID);
rLB_ReadPage(addr,temp);
Uart_Printf("\n");
for(i=0;i<512;i++)
Uart_Printf("%c",temp);

}

yuyukaka789 发表于 2010-8-23 10:43:58

不懂唉....

天嵌_support1 发表于 2010-8-23 19:09:27

1# duhaoke


去读一下Nand Flash的芯片手册.........
页: [1]
查看完整版本: 求助版主有关天嵌NAND FLASH 代码问题!