主题 : RnB_TransDetect 位有时置1,有时不置1的问题,刚才选错分类了 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 2525
精华: 0
发帖: 8
金钱: 50 两
威望: 10 点
综合积分: 16 分
注册时间: 2008-11-22
最后登录: 2017-09-13
楼主  发表于: 2011-01-09 22:30

 RnB_TransDetect 位有时置1,有时不置1的问题,刚才选错分类了

管理提醒: 本帖被 kasim 从 U-boot技术交流区 移动到本区(2011-01-09)
自己写的mini2440裸机操作NAND FLASH 的代码,读ID没有问题,在InitFlash中调用ResetFlash也没有问题
但是只后再ResetFlash就会在NF_WAIT_RNB()处卡住,发现RnB_TransDetect 位一直没有置1,请大侠指点下

#define vTACLS 0x0
#define vTWRPH0 0x2
#define vTWRPH1 0x0

#define vBusWidth 0x0

//拉低CS片选
#define NF_SEL() rNFCONT&=~(1<<1)
//拉高CS
#define NF_UNSEL() rNFCONT|=(1<<1)

#define NF_CMD(cmd) rNFCMMD=cmd

#define NF_ADDR(addr) rNFADDR=addr

#define NF_CLEAR_RNB() rNFSTAT|=(1<<2)

#define NF_WAIT_RNB() while(!(rNFSTAT&(1<<2)))

#define NF_READ_DATA8() rNFDATA8


void InitFlash(void)
{
rNFCONF=(vTACLS<<12) | (vTWRPH0<<8) | (vTWRPH1<<4) | (vBusWidth<<0);
//初始化时清除 SpareECCLock、MainECCLock位,之后无论何时我们读或写FLASH则在NFMECC0/1中就会产生ECC校验码
rNFCONT=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(0<<6)|(0<<5)|(1<<4)|(1<<1)|(1<<0);

ResetFlash();
}

void ResetFlash(void)
{
//正常流程应该是1-拉低CS片选,2-拉高CLE,3-拉低ALE,但是寄存器NFCONT中有一位Reg_nCE管片选的貌似第2、3步由CPU自己处理了
NF_SEL();
NF_CLEAR_RNB();

//延迟tCS+tWP-tDS=0+25-20=5ns
//由于FCLK为400MHZ,所以一条指令执行时间理论上为2.5ns,所以执行两条空指令
//手册上只给出了最小值,没有给出最大值,所以越大越保险,我们这里引用的是最小值,如果有问题的话可以加大取值

__asm
{
nop
nop
}

//send reset command
NF_CMD(0xFF);

NF_WAIT_RNB();

NF_UNSEL();

printk("NAND FLASH Reset Complete,rNFSTAT=%u,i=%d\n",(U32)rNFSTAT,i);
}

U32 ReadFlashID(void)
{
volatile int i=0;
U8 mc,dc,dontcare,mpc;
NF_SEL();
__asm
{
nop
nop
}

//从时序图上看命令和地址延后CS的时间一样所以只需要一次延迟
NF_CMD(0x90);
NF_ADDR(0x00);

/*
从写地址到ALE失效的时间间隔为tDS+tALH
从ALE失效到读第Maker code的时间间隔为tAR+tREA
所以延迟时间为tDS+tALH+tAR+tREA=20+10+10+0(tREA Min)=40ns
*/
__asm
{
nop
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop

nop
nop
nop
nop
}

mc=NF_READ_DATA8();
dc=NF_READ_DATA8();
dontcare=NF_READ_DATA8();
mpc=NF_READ_DATA8();

NF_UNSEL();

printk("Maker Code=0x%X,Device Code=0x%X,DontCare=0x%X,Multi Plane Code=0x%X,i=%d\n",(U32)mc,(U32)dc,(U32)dontcare,(U32)mpc,i);

return (mc<<24) | (dc<<16) | (dontcare<<8) | mpc;
}