天嵌 ARM开发社区

 找回密码
 注册
查看: 1736|回复: 0

关于nand读写的问题

[复制链接]
宇哥到此一游~ 发表于 2013-5-16 23:28:45 | 显示全部楼层 |阅读模式
-------------s3c2440.h---------
// NAND flash
#define NFCONF               (*(volatile unsigned long *) 0x4E000000)
#define NFCONT               (*(volatile unsigned long *) 0x4E000004)
#define NFCMD                (*(volatile unsigned long *) 0x4E000008)
#define NFADDR               (*(volatile unsigned long *) 0x4E00000C)
#define NFDATA               (*(volatile unsigned long *) 0x4E000010)
#define NFMECCD0             (*(volatile unsigned long *) 0x4E000014)
#define NFMECCD1             (*(volatile unsigned long *) 0x4E000018)
#define NFSECCD              (*(volatile unsigned long *) 0x4E00001C)
#define NFSTAT               (*(volatile unsigned long *) 0x4E000020)
#define NFESTAT0             (*(volatile unsigned long *) 0x4E000024)
#define NFESTAT1             (*(volatile unsigned long *) 0x4E000028)
#define NFMECC0              (*(volatile unsigned long *) 0x4E00002C)
#define NFMECC1              (*(volatile unsigned long *) 0x4E000030)
#define NFSECC               (*(volatile unsigned long *) 0x4E000034)
#define NFSBLK               (*(volatile unsigned long *) 0x4E000038)
#define NFEBLK               (*(volatile unsigned long *) 0x4E00003C)
----------------------------
---------------main.c------------------------------------
#include <s3c2440.h>
void main()
{
nand_init();
   nand_read_ID();
WritePage(2001*64+0); //2001,第0页   1   1   1   1   1   0   1   0   0   0   1   0   0   0   0   0   0    128064
ReadPage(2001*64+0);        //A      12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28    17位

}

void delay()
{
int i;
for(i=0;i<=100;i++);
}
------------------nand.c-----------------
#include  <s3c2440.h>
//K9F2G08U0A的命令


#define CMD_READ1                0x00  //页读命令周期1
#define CMD_READ2                0x30        //页读命令周期2
#define CMD_READID               0x90        //读ID命令
#define CMD_WRITE1               0x80        //页写命令周1
#define CMD_WRITE2               0x10        //页写命令周期2
#define CMD_ERASE1               0x60        //块擦除命令周期1
#define CMD_ERASE2               0xd0        //块擦除命令
#define CMD_STATUS               0x70        //读状态命令
#define CMD_RESET                0xff        //复位
#define CMD_RANDOMREAD1          0x05        //随意读命令周期1
#define CMD_RANDOMREAD2          0xE0        //随意读命令周期2
#define CMD_RANDOMWRITE          0x85       //随意写命令


//为了方便使用的宏定义
#define NF_nFCE_L()           {NFCONT &= ~(1<<1);}
#define NF_CE_L()             NF_nFCE_L()                 //打开nandflash片选
#define NF_nFCE_H()           {NFCONT |= (1<<1); }
#define NF_CE_H()             NF_nFCE_H()                 //关闭nandflash片选




//判断忙定义
#define NF_WAITRB()      {while(!(NFSTAT&(1<<0)));}     //等待Nand Flash不忙
#define NF_CLEAR_RB()         {NFSTAT |= (1<<2);}              //清除RnB信号
#define NF_DETECT_RB()        {while(!(NFSTAT&(1<<2)));} //等待RnB信号变高,即不忙



//传输命令,地址和数据等定义
#define NF_CMD(data)          {NFCMD = (data); }                 //传输命令
#define NF_ADDR(addr)         {NFADDR = (addr); }                //传输地址



unsigned long Rdata[2048];
int i;
int n;
//复位nand flash

void nand_flash_reset()
{
NF_CE_L();                 //打开nandflash片选
NF_CLEAR_RB();               //清除RnB信号

  NF_CMD(CMD_RESET);           //写入复位命令
  NF_DETECT_RB();              //等待RnB信号变高,即不忙
  NF_CE_H();                   //关闭nandflash片选
}


//初始化nand flash
void nand_init()
{
NFCONF=0x300;   //时间参数设为:TACLS=0 TWRPH0=3 TWRPH1=0
NFCONT =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)| (1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0); ; //使能NAND Flash控制器, 禁止片选
  nand_flash_reset ();
}

//读芯片信息

void nand_read_ID()
{

unsigned long massage;
NF_nFCE_L();            //打开nand flash 片选

NF_CLEAR_RB();          //清RnB信号
NF_CMD(CMD_READID);     //读ID命令
NF_ADDR(0x0);           //写0x00地址
delay();
   massage=NFDATA;
NF_nFCE_H();            //关闭nandflash片选
}


void ReadPage(unsigned long page_number)   //一页(2K+64),一块64页,一共2048块  2k=2048byte
{                                          //一共2048*64=131072页 unsigned long 8字节
NF_nFCE_L();             //使能芯片
NF_CLEAR_RB();           //清除RnB
NF_CMD(CMD_READ1);       //页读命令周期1,0x00

//接下来写入5个地址周期
NF_ADDR(0x00);            //列地址A0-A7   列地址是页内空间寻址
NF_ADDR(0x00);            //列地址A8-A11
NF_ADDR((page_number) & 0xff);   //行地址A12-A19    行地址是页寻址   
NF_ADDR((page_number >> 8) & 0xff);//行地址A20-A27
NF_ADDR((page_number >> 16) & 0xff);//行地址A28
NF_CMD(CMD_READ2);         //页读命令周期2,0x30
NF_DETECT_RB();            //等待RnB信号变高,即不忙
//接下来开始读
for(n=0;n<=2047;n++)
{
Rdata[n]=NFDATA;
}
NF_CE_H();
//ECC校验部分暂时忽略
}

void WritePage(unsigned long page_number)   //这个函数仅用于测试,实际由DWN完成
{                                           //用DWN时要注意烧写的地址


NF_nFCE_L();             //使能芯片
NF_CLEAR_RB();           //清除RnB
NF_CMD(CMD_WRITE1);       //页写命令周期1
//接下来写要写入的地址
//接下来写入5个地址周期
NFADDR=0x00;            //列地址A0-A7   列地址是页内空间寻址
NFADDR=0x00;            //列地址A8-A11
NF_ADDR((page_number) & 0xff);   //行地址A12-A19    行地址是页寻址   
   NF_ADDR((page_number >> 8) & 0xff);//行地址A20-A27
NF_ADDR((page_number >> 16) & 0xff);//行地址A28
//开始写数据
for(i=0;i<=2047;i++)
{

NFDATA=0x1;
}
NF_CMD(CMD_WRITE2);
delay();
delay();
delay();
delay();
NF_DETECT_RB();
NF_CMD(CMD_STATUS);
NF_nFCE_H();

}
-----------------------------------------------
上网找了很多资料 程序不知道哪错了?~~~~芯片信息可以读的出来 但是读写却出问题了  求大神指点 苦逼一天了  感激不尽!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-5-17 09:54 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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