求助版主有关天嵌NAND FLASH 代码问题!
1 在readID()的时候定义了四个要读出的芯片信息,我在调试的过程中发现读完一个字之后NFDAT寄存器就会自动向后移动一个字节。为什么?
pMID = NF_RDDATA8();
pDID = NF_RDDATA8();
nBuff = NF_RDDATA8();
n4thcycle = NF_RDDATA8();
2 读出的pDID是0xDA 在三星的技术手册上应该是0X76才对,为什么? 0Xda对应的是什么芯片?
3 NF_DETECT_RB(); // wait tR(max 12us)
这句话怎么理解。要是是判断nand flash忙不忙,可以直接判断NFSTAT的第二位即可啊?为什么?
请版主给予解释,先行谢过! Nandflash是顺序读取机制的,这点和norflash不同。其次你说读的ID不对,这就要看看你用的是哪个型号,哪款了。不同厂商的不同大小的,肯定不一样。这点你再注意观察一下。
对于你提的第三个问题,是如个代码里面的。最好把文件和行数帖出来,我好帮你看一下。 2# machoe
首先谢谢回复,
1顺序读取怎么理解?
2ID 的问题发出命令之后再 NFDAT寄存器里是0x9510DAECEC为三星公司的标志应该没错的!那么 DA就应该是DEVICE ID 了
3 代码如下 在天嵌公司的TQ2440里 我又加了一个小的测试函数
#include <string.h>
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "Nand.h"
char pMID;// 厂商号
char pDID;//设备号 device ID
char nBuff;//保留字节
char n4thcycle;//多层操作码
int i;
U32 ID=0x0;
//
//Reset the chip
//
static void rNF_Reset()
{
NF_CE_L();//片选
NF_CLEAR_RB();//清状态位
NF_CMD(CMD_RESET);//复位
NF_DETECT_RB();//直到成功
NF_CE_H(); //取消片选
}
static void rNF_Init(void)
{
rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);
//CLE和ALE时间 1 (1-CLK)4(4+1) 0(0+1?
// 1+5+1=7*10ns=70ns
//要求写时间要大于50ns
rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);
// 6: Lock spare ECC
// 5: Unlock main data area ECC generation
// 4: Initialize ECC decoder
// 1: Chip select
// 0;NAND flash controller enable
rNFSTAT = 0;//装态位清零 只读位不能发生变化
rNF_Reset();//重启
}
static U32 rNF_ReadID()
{
NF_nFCE_L(); //片选
NF_CLEAR_RB(); //清状态/就绪位
NF_CMD(CMD_READID); // read id command 0x90
NF_ADDR(0x0);
//for ( i = 0; i < 100; i++ );
pMID = NF_RDDATA8();
pMID = NF_RDDATA8();
pDID = NF_RDDATA8();
nBuff = NF_RDDATA8();
n4thcycle = NF_RDDATA8();
//ID = NF_RDDATA();
NF_nFCE_H();//取消片选
// return ID;
return (pDID);
}
static void rSB_ReadPage(U32 addr, unsigned char * to)
{
U32 i;
rNF_Reset();
//Enable the chip
NF_nFCE_L();
NF_CLEAR_RB();
// Issue Read command
NF_CMD(CMD_READ);//Ox00
//Set up address
NF_ADDR(0x00);
NF_ADDR((addr) & 0xff);
NF_ADDR((addr >> 8) & 0xff);
NF_ADDR((addr >> 16) & 0xff);
NF_DETECT_RB(); // wait tR(max 12us)
for (i = 0; i < 512; i++)
{
to =NF_RDDATA8();
}
NF_nFCE_H();
}
static void rLB_ReadPage(U32 addr, unsigned char * to)
{
U32 i;
rNF_Reset();
//Enable the chip
NF_nFCE_L();
NF_CLEAR_RB();
// Issue Read command
NF_CMD(CMD_READ);
//Set up address
NF_ADDR(0x00);
NF_ADDR((addr>>9) & 0xff);
NF_ADDR((addr >> 17) & 0xff);
NF_ADDR((addr >> 25) & 0xff);
NF_CMD(CMD_READ3);
NF_DETECT_RB(); // wait tR(max 12us)
for (i = 0; i < 2048; i++)
{
to =NF_RDDATA8();
}
NF_nFCE_H();
}
void RdNF2SDRAM( )
{
U32 i;
U32 start_addr = 0x0;
unsigned char * to = (unsigned char *)0x30000000;
U32 size = 0x100000;
rNF_Init();
switch(rNF_ReadID())
{
case 0x76:
for(i = (start_addr >> 9); size > 0; )
{
rSB_ReadPage(i, to);
size -= 512;
to += 512;
i ++;
}
break;
case 0xf1:
case 0xda:
case 0xdc:
case 0xd3:
for(i = (start_addr >> 11); size > 0; )
{
rLB_ReadPage(i, to);
size -= 2048;
to += 2048;
i ++;
}
break;
}
}
void testNandFlash(void)
{
U32 pID,addr;
unsigned char *temp;
int i;
addr=0x30000000;
rNF_Reset();
rNF_Init();
pID= rNF_ReadID();
Uart_Printf("\nmenufactory ID is:");
Uart_Printf("%X",pID);
rLB_ReadPage(addr,temp);
Uart_Printf("\n");
for(i=0;i<512;i++)
Uart_Printf("%c",temp);
} 不懂唉.... 1# duhaoke
去读一下Nand Flash的芯片手册.........
页:
[1]