求指点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); //关闭片选
}
//----------------------------------------------------------------------------------------------- 忘了说是256MB的NAND 2# 单身
这个得到的是什么:
addr = (block_number << 6) + page_number; 这个得到的是什么:
addr = (block_number << 6) + page_number;
页:
[1]