主题 : 自己写得NAND FLASH读写程序 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 7651
精华: 0
发帖: 5
金钱: 50 两
威望: 50 点
综合积分: 10 分
注册时间: 2009-07-23
最后登录: 2017-09-13
楼主  发表于: 2009-08-14 10:57

 自己写得NAND FLASH读写程序

管理提醒: 本帖被 qq2440 从 micro2440技术交流专区 移动到本区(2013-11-18)
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "nand.h"
#include "2440slib.h"

//void __RdPage512(U8 *bufPt);
//void __RdPage256(U8 *bufPt);
char NAND_READ(U32 src);
void NAND_WRITE(U32 src,U32 *ch);
void NAND_ERASE_BLOCK(U32 addr);

#define STATUS_READY 0x40
#define STATUS_ERROR 0x01

#define NF_CMD(cmd)         {rNFCMD=(cmd);}
#define NF_ADDR(addr)         {rNFADDR=(addr);}
#define NF_nFCE_L()         {rNFCONT&=~(1<<1);}
#define NF_nFCE_H()         {rNFCONT|=(1<<1);}
#define NF_RSTECC()         {rNFCONT|=(1<<4);}
#define NF_RDDATA()            (rNFDATA)
#define NF_WRDATA(data)        {rNFDATA=(data);}
#define NF_WAITRB()            {while(!(rNFSTAT&(1<<0)));}
#define NF_CLEAR_RB()        {rNFSTAT|=(1<<2);}
//#define NF_DETECT_RB()        {while(!(rNFSTAT&(1<<2)));}
#define NF_DETECT_RB()        {while(!(rNFSTAT&(1<<2)));}//程序死在这里
#define NF_MECC_UnLock()    {rNFSTAT&=~(1<<5);}
#define NF_MECC_Lock()        {rNFSTAT|=(1<<5);}


#define pNFCONF rNFCONF
#define pNFCMD  rNFCMD
#define pNFADDR rNFADDR
#define pNFDATA rNFDATA
#define pNFSTAT rNFSTAT
#define pNFECC  rNFMECC0

#define NF_CE_L()        NF_nFCE_L()    //{rNFCONT&=~(1<<1);}
#define NF_CE_H()        NF_nFCE_H()    //{rNFCONT|=(1<<1);}
#define NF_DATA_R()        rNFDATA
#define NF_ECC0()        rNFMECC0

typedef union _ECCRegVal
{
    DWORD dwECCVal;
    BYTE bECCBuf[4];
}ECCRegVal;


void Main(void)/////#############    Main()
{
    
    //U8 key;
    int i,j;
    U32 ch[512];
    ChangeMPllValue(127,2,1);//405Mhz
    ChangeClockDivider(0, 12);  //HCLK=FCLK=2PCLK  
    MMU_DisableICache();        //NANDFLASH USE HCLK
    MMU_DisableDCache();
    
    
    //GPB8 7 6 5            0 beep
    //01 0101 0100 0000 0000
    rGPBCON = 0x15401;
    rGPBDAT=(0x0<<5);//led all on
  
    Port_Init();
    Uart_Init(0,115200);
    Uart_Select(0);
    Uart_Printf("\n");
    Uart_Printf("           @@ the main is running @@\n");
    NF_Init();
    NF_Reset();
    NF_ReadID();
    
    
    NAND_ERASE_BLOCK(100<<9);//page 100
  
    for(i=0;i<10000;i++);
    
    
   for(i=0,j=0;i<512;i++,j+=4)
    {
         //ch=(j+3)<<24;
         //ch|=(j+2)<<16;
         //ch|=(j+1)<<8;
         ch|=i;
    }
    
    NAND_WRITE((100<<9),ch);
    
    for(i=0;i<512;i++)
    {
        
        Uart_Printf("[ADD %d ]=%d  ",(i+(100<<9)),NAND_READ(i+(100<<9)));
        if((i+1)%3==0)
            Uart_Printf("\n");
    }

}

void NF_Reset()
{
    NF_CE_L();
    NF_CLEAR_RB();
    NF_CMD(CMD_RESET);
    NF_CE_H();
    //Uart_Printf(" NF_Reset FINISHED\n");
}

void NF_Init(void)
{
    rNFCONF=(0<<12)|(6<<8)|(0<<4)|(0<<0);
    rNFCONT=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(0<<6)|(0<<5)|(1<<4)|(1<<1)|(1<<0);
    rNFSTAT=0x0;
    //Uart_Printf(" NF_Init FINISHED\n");
}

//#ifdef NF_READID
void NF_ReadID()
{
    char wData1,wData2;
    //Uart_Printf(" NF_ReadID 1 start\n");
    
    NF_CE_L();
    NF_CLEAR_RB();
    
    NF_CMD(CMD_READID);
    NF_ADDR(0x00);
    
    NF_WAITRB()    ;
    //Uart_Printf(" NF_ReadID 3 start\n");
    wData1=(BYTE)NF_DATA_R();
    wData2=(BYTE)NF_DATA_R();
    
    NF_CE_H();
    
    Uart_SendString("Nand Maker code: ");
    Uart_Printf("0x%x\n",wData1);
    
    Uart_SendString("Nand Device Code: ");
    
    Uart_Printf("0x%x\n\n",wData2);
}
//#endif


char NAND_READ(U32 src)
{
    char aa;
    U32 column_addr,page_addr;
    column_addr=src%512;
    page_addr=(src>>9);
//  Chip enable
    NF_CE_L();
    NF_CLEAR_RB();
    
       NF_CMD(CMD_READ);
  
    
    NF_ADDR(column_addr);
    NF_ADDR((page_addr)&0xff);
    NF_ADDR((page_addr>>8)&0xff);
    NF_ADDR((page_addr>>16)&0xff);
    NF_WAITRB()    ;
    
    
    aa= NF_DATA_R();
        
    
    NF_CE_H();
    return aa;
}
void NAND_WRITE(U32 src,U32 *ch)
{
    U32 t,i,column_addr,page_addr;
    column_addr=src%512;
    page_addr=(src>>9);
//  Chip enable
    NF_CE_L();
    NF_CLEAR_RB();
    
      
      
    NF_CMD(0x80);
    //for(i=0;i<10;i++);
    NF_ADDR(column_addr);
    NF_ADDR((page_addr)&0xff);
    NF_ADDR((page_addr>>8)&0xff);
    NF_ADDR((page_addr>>16)&0xff);
    //for(t=0;t<10;t++);
    
    
    for(i=column_addr;i<512;i++)
    {
        (BYTE)NF_DATA_R()=*ch++;//这样写入的是字节
        NF_//DATA_R()=*ch++;////这样写入了一个字[31:0],不是字节、即使ch为char星,也是字
        //for(t=0;t<10;t++);
    }//NFDATA *****[31:0]**** NAND flash read/program data value for I/O
     //Note: Refer to data register configuration in Page 6-5.
     //
     //
     //NF_WAITRB();
    
    NF_CMD(0x10);
    NF_WAITRB();
    //for(t=0;t<1000;t++);
    NF_CE_H();
}
void NAND_ERASE_BLOCK(U32 addr)
{
    U32 page_addr;
    
    page_addr=(addr>>9);
//  Chip enable
    NF_CE_L();
    NF_CLEAR_RB();
    
       NF_CMD(0x60);
      
    
    
    
    NF_ADDR((page_addr)&0xff);
    NF_ADDR((page_addr>>8)&0xff);
    NF_ADDR((page_addr>>16)&0xff);
    NF_WAITRB()    ;
    
    
    NF_CMD(0xd0);
    //for(i=0;i<100;i++);
    NF_CE_H();
}
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-08-14 12:13
不错不错,希望借此机会,能让更多的兄弟搞清楚操作NAND Flash的原理
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 7465
精华: 0
发帖: 1
金钱: 10 两
威望: 5 点
综合积分: 2 分
注册时间: 2009-07-16
最后登录: 2009-09-01
2楼  发表于: 2009-09-01 20:24
请问是不是用ADS编译,能否给个完整工程试试,学习一下.
级别: 新手上路
UID: 9123
精华: 0
发帖: 19
金钱: 135 两
威望: 45 点
综合积分: 38 分
注册时间: 2009-09-17
最后登录: 2010-11-12
3楼  发表于: 2009-11-01 09:31
老兄,你干嘛要这样读数据啊?
级别: 新手上路
UID: 893
精华: 0
发帖: 12
金钱: 115 两
威望: 48 点
综合积分: 24 分
注册时间: 2008-06-18
最后登录: 2017-09-13
4楼  发表于: 2010-01-12 17:18
我也是死在NF_DETECT_RB位置
级别: 新手上路
UID: 13211
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
综合积分: 16 分
注册时间: 2010-01-20
最后登录: 2010-08-24
5楼  发表于: 2010-01-20 14:53
级别: 新手上路
UID: 4204
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2009-03-03
最后登录: 2016-11-23
6楼  发表于: 2010-01-29 09:40
能多加些注释不~~~
级别: 新手上路
UID: 55347
精华: 0
发帖: 37
金钱: 185 两
威望: 37 点
综合积分: 74 分
注册时间: 2011-09-16
最后登录: 2013-04-21
7楼  发表于: 2012-03-24 17:13
我用led去测试也发现死在#define NF_DETECT_RB()        {while(!(rNFSTAT&(1<<2)));}