单身 发表于 2010-10-7 03:30:46

求指点NAND 读写~~~

照着测试程序写的函数怎么都不能读,求前辈指点:
#include"s3c2440.h"

static void NF_Reset()                //复位芯片
{
        NFCONT &= ~(1<<1);                                //片选
        NFSTAT |= (1<<2);                                //
        NFCMD= (0xff);                                //reset 芯片
        while(!(NFSTAT&(1<<2)));                //检测RNB传输
        NFCONT |= (1<<1);                                //禁止片选
}

void NF_Init(void)
{
        NFCONF = (1<<12)|(4<<8)|(0<<4)|(0<<0);
        NFCONT =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
        NFSTAT = 0;
        NF_Reset();
}

char NF_ReadID()
{
        char        pMID;
        char        pDID;
        char        nBuff;
        char        n4thcycle;
        int        i;


        NFCONT &= ~(1<<1);                        //发出片选
        NFSTAT |= (1<<2);                        //开启RnB传输检测
        NFCMD= 0x90;                        // read id command
        NFADDR = 0x0;
        for ( i = 0; i < 100; i++ );

        pMID = NFDATA8;
        pDID = NFDATA8;

        nBuff   = NFDATA8;                //Internal Chip Number, Cell Type, Number of Simultaneously Programmed Pages, Etc
        n4thcycle = NFDATA8;               //Page Size, Block Size,Redundant Area Size, Organization, Serial Access Minimum
        NFCONT |= (1<<1);                       //禁止片选


        return (pDID);
}
//-------------------------------------------------------------------------------------------------------------------



/**************** nand flash 页读取函数 *******************************************************/
/********************** 2048B PAGE ************************************************************/
void NF_ReadPage_2KB(U32 block_number,U32 page_number, U8 * to)                //读2048B ,页地址为0x00000~0x1ffff
{
        U32 i;
        U32 addr = (block_number << 6) + page_number;
        //NF_Reset();
        NFCONT &= ~(1<<1);                                //发出片选
        NFSTAT |= (1<<2);                          //开启RnB传输检测
               
               
                NFCMD= 0x00;                        //发出读命令1
               
                NFADDR = 0x00;                        //发出地址,读页
                NFADDR = 0x00;
                NFADDR = (addr) & 0xff;
                NFADDR = (addr >> 8) & 0xff;
                NFADDR = (addr >> 16) & 0xff;
               
                NFCMD= 0x30;                   //发出读命令2
               
               
                while(!(NFSTAT&(1<<2)));        //查询是否就绪
               
                for (i = 0; i < 2048; i++)
                {
                        to =NFDATA8;
                }
               

        NFCONT |= (1<<1);                                //关闭片选
       
}


/****************************** nand flash 页随机字节读取函数 ****************************************/
unsigned charNF_ReadByte(unsigned int ByteAddr)
{
   U32 Temp1;

        NFCONT &= ~(1<<1);                                                  //发出片选
        NFSTAT |= (1<<2);                                                  //开启RnB传输检测
               
               
                NFCMD= 0x05;                                                     //发出 随机读 命令1

                NFADDR = ByteAddr& 0xff;                     //Column Address A0~A7
                NFADDR = (ByteAddr >> 8) & 0xff;       //Column Address A8~A11
                NFADDR = (ByteAddr >> 16) & 0xff;       //Row Address    A12~A19
                //NFADDR = (ByteAddr >> 24) & 0xff;    //Row Address    A20~A27
                //NFADDR = (ByteAddr >> 32) & 0xff;       //                          A28
               
          NFCMD = 0xe0;                                             //发出 随机读 命令2

                while(!(NFSTAT&(1<<2)));                 //查询是否就绪

                Temp1 =NFDATA8;
               

        NFCONT |= (1<<1);                                               //关闭片选
       
        return Temp1;

}
//------------------------------------------------------------------------------------------------------//



/********************************** 读取NAND FLASH TO SDRAM ************************************/
/****************   从NAND Flash的0地址处开始读count大小的数据到SDRAM中 ************************/

void NF_TO_SDRAM()   
{

        U32 block_number = 0;
        U32 page_number = 0;
        U8 * to = (U8 *) 0x30000000;
        U32 size = 0x100000;
        NF_Init();                                                                //NAND FLASH初始化
       
        while( size > 0 )
        {
                NF_ReadPage_2KB(block_number,page_number, to);
                size -= 2048;
                to += 2048;
                page_number ++;
                if(page_number == 64)
                {
                        page_number = 0;
                        block_number ++;
                }
        }

}               
//---------------------------------------------------------------------------------------------------------




/**********************   nand flash 2048B 页    写函数 ****************************************************/
/********************* block_number = 0~2047,page_number = 0~63********************************************/
void NF_WritePage_2KB(U32 block_number,U32 page_number,U8 * from)               
{
        U32 i;
        U32 addr;
        addr = (block_number << 6) + page_number;
        NF_Reset();
        NFCONT &= ~(1<<1);                                //发出片选
        NFSTAT |= (1<<2);                          //开启RnB传输检测
       
               
                NFCMD= 0x80;                                        //发出写命令1
               
                NFADDR = 0x00;                            //Column Address A0~A7
                NFADDR = 0x00;                                        //Column Address A8~A11
                NFADDR = addr & 0xff;                  //Row Address    A12~A19
                NFADDR = (addr >> 8) & 0xff;    //Row Address    A20~A27
                NFADDR = (addr >> 16) & 0xff;   //Row Address    A28

               for (i = 0; i < 2048; i++)   //write flash
                {
                       NFDATA8 = from;
                }
               
                NFCMD = 0x10;                                        //发出写命令2
               
          for (i = 0; i < 1000; i++);   //延时、write flash

        while(!(NFSTAT&(1<<2)));        //查询是否就绪
        NFCONT |= (1<<1);                                //关闭片选
}


/****************************** nand flash 页随机字节 写函数 ****************************************/
/************************* ByteAddr 为写入的地址,dat为写入的字节数据******************************/
voidNF_WriteByte(U32 ByteAddr,U8 dat)
{

        NFCONT &= ~(1<<1);                                                  //发出片选
        NFSTAT |= (1<<2);                                                  //开启RnB传输检测志
               
               
                NFCMD= 0x85;                                                     //发出 随机写 命令

                NFADDR = ByteAddr& 0xff;                     //Column Address A0~A7
                NFADDR = (ByteAddr >> 8) & 0xff;;       //Column Address A8~A11
               
               
                while(!(NFSTAT&(1<<2)));                 //查询是否就绪
               
                NFDATA8 = dat;
               
       
        NFCONT |= (1<<1);                                               //关闭片选
       
}

/********************************** nand flash块擦除函数 ********************************************/
/************************* 输入参数?block_number 块地址 *****************************************/
void NF_Block_Erase(U32 block_number)                         //block_number = 0~2047
{
        U32 i;
        U32 addr;
        addr = (block_number << 6);                        //由块地址获得完整的页地址 A12~A28,其中每块的64页选择地址线A12~A17为0
                                                                                //假如 要擦除第6块,则 应该给的地址 addr 是 0 0000 0000 1100 0000
        NF_Reset();           //复位

        NFCONT &= ~(1<<1);                                //发出片选
        NFSTAT |= (1<<2);                                //开启RnB传输检测
       

                NFCMD = 0x60;

                NFADDR = (addr) & 0xC0;                   //Row Address    A12~A19,(A18~A28共11条地址线寻址2048个BLOCK)
                NFADDR = (addr >> 8) & 0xff;   //Row Address    A20~A27
                NFADDR = (addr >> 16) & 0xff;//Row Address    A28
               
                NFCMD = 0xd0;
               

    for (i = 0; i < 1000; i++);   //等待

        while(!(NFSTAT&(1<<2)));       //查询是否就绪
        NFCONT |= (1<<1);                                //关闭片选
}


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

单身 发表于 2010-10-7 03:34:44

忘了说是256MB的NAND

天嵌_support1 发表于 2010-10-7 17:34:35

2# 单身


这个得到的是什么:
addr = (block_number << 6) + page_number;

minranyuxin1 发表于 2010-11-4 16:03:27

这个得到的是什么:
addr = (block_number << 6) + page_number;
页: [1]
查看完整版本: 求指点NAND 读写~~~