|
-------------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();
}
-----------------------------------------------
上网找了很多资料 程序不知道哪错了?~~~~芯片信息可以读的出来 但是读写却出问题了 求大神指点 苦逼一天了 感激不尽! |
|