天嵌 ARM开发社区

 找回密码
 注册
查看: 2033|回复: 3

求指点NAND 读写~~~

[复制链接]
单身 发表于 2010-10-7 03:30:46 | 显示全部楼层 |阅读模式
照着测试程序写的函数怎么都不能读,求前辈指点:
#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[i] =  NFDATA8;
                }
               

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


/****************************** nand flash 页随机字节读取函数 ****************************************/  
unsigned char  NF_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[i];
                }
               
                NFCMD = 0x10;                                        //发出写命令2
               
            for (i = 0; i < 1000; i++);     //延时、write flash

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


/****************************** nand flash 页随机字节 写函数 ****************************************/  
/************************* ByteAddr 为写入的地址,dat为写入的字节数据  ******************************/
void  NF_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;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-11 21:29 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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