5692|22

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

nand flash读写求助 [复制链接]

希望有人能够指点下

         情况1:
             FlashReset();
                   state = FlashReadStatus();   //结果是state = 0xe0;
                   flashid = FlashReadId();        //结果是flashid = 0xe0e0;
         情况2:
             FlashReset();
                   flashid = FlashReadId();        //结果是flashid = ad76
                   state = FlashReadStatus();   //结果是state = 0xad;
         情况3:
             FlashReset();
                   state = FlashReadStatus();   //结果是state = 0xe0;
                   FlashReset();
                   flashid = FlashReadId();        //结果是flashid = 0xad76;
                  正确的,先读哪个都正确。
         情况4:
             FlashReset();
                   state = FlashReadStatus();   //结果是state = 0xe0;
                   FlashReadPage(0,readbuf);   //结果是readbuf为e0e0e0...,
                   FlashReset();
                   flashid = FlashReadId();        //结果是flashid = 0xad76;
                   FlashReadPage(0,readbuf);   //结果是readbuf为ad76ad76ad76...,
         情况5:
          FlashReset();
                   state = FlashReadStatus();   //结果是state = 0xe0;
                   FlashReset();
                   FlashReadPage(0,readbuf);   //结果是readbuf为f0ffffffffff...,
         情况6:
            unsigned char FlashReadStatus(void)
                 {
                   unsigned char status = 0x00;

                   CE = 0;
                   //如果在这里再加一个FlashWriteCmd(任意命令);那读之前不要先写复位命令FlashReset();也可以得到与写了FlashReset();一样的结果,其他如FlashReadId();FlashReadPage(0,readbuf);也一样。
                   FlashWriteCmd(NAND_READSTATUS);
                   status = FlashDataRead();
                   CE = 1;
                   return status;
                 }
到底是咋回事呢,看了hy27us08121a数据手册上的读写时序及读写过程,感觉上面程序没啥问题啊,不知道有没忽略掉什么,很不解,知道的能不能提点建议啊,谢过先。。

最新回复

ls有理,顶一下  详情 回复 发表于 2010-1-27 23:46
点赞 关注

回复
举报

57

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用的HY27US08121A程序如下,有啥问题呢

void FlashWriteCmd(unsigned char cmd)
{
CLE = 1;              
ALE = 0;            
RE = 1;
WE = 0;            
DataPort = cmd;
WE = 1;
}



void FlashWriteAddr(unsigned char addr)
{
CLE = 0;           
ALE = 1;         
RE = 1;
WE = 0;         
DataPort = addr;  
WE = 1;
}



void FlashDataWrite(unsigned char dat)
{
CLE = 0;
ALE = 0;
RE = 1;
WE = 0;
DataPort = dat;
WE = 1;
}



unsigned char FlashDataRead(void)
{
unsigned char dat;

DataPort = 0xFF;         
CLE = 0;         
ALE = 0;         
WE = 1;         
RE = 1;         
RE = 0;
dat = DataPort;
RE = 1;
return dat;
}



void FlashReset(void)
{
CE = 0;
FlashWriteCmd(NAND_RST);
_nop_();
NAND_WAITREADY
CE = 1;
}



unsigned int FlashReadId(void)
{
unsigned int deviceId = 0x0000;
  
CE = 0;            
FlashWriteCmd(NAND_READ_ID);
FlashWriteAddr(0x00);
deviceId  = FlashDataRead();
deviceId  = deviceId << 8;
deviceId |= FlashDataRead();
CE =1;
return   deviceId;
}



unsigned char FlashReadStatus(void)
{
unsigned char status = 0x00;

CE = 0;
FlashWriteCmd(NAND_READSTATUS);
status = FlashDataRead();
CE = 1;
return status;
}



unsigned char FlashEraseBlock(unsigned int blockAddr)
{  
unsigned char status = 0x00;        

CE = 0;
FlashWriteCmd(NAND_READ0);
FlashWriteCmd(NAND_BLOCKERASE_C1);
FlashWriteAddr(blockAddr & 0xFF);
FlashWriteAddr((blockAddr >> 8) & 0xFF);
FlashWriteAddr(0x00);
FlashWriteCmd(NAND_BLOCKERASE_C2);
_nop_();
NAND_WAITREADY         
status = 0x01 & (FlashReadStatus());   
CE = 1;
return  status;         
}



void FlashReadPage(unsigned long PageAddr,unsigned char * buf)
{
unsigned int i;        
  
CE = 0;
FlashWriteCmd(NAND_READ0);
FlashWriteAddr(0x00);
FlashWriteAddr(PageAddr & 0xFF);
FlashWriteAddr((PageAddr >> 8) & 0xFF);
FlashWriteAddr((PageAddr >> 16) & 0xFF);
_nop_();
NAND_WAITREADY
for(i = 0;i < NAND_PAGE_SIZE;i++)
{
  buf = FlashDataRead();
}
CE = 1;
}



unsigned char FlashWritePage(unsigned long PageAddr,unsigned char * buf)
{
unsigned char status = 0x00;
unsigned int i;

CE = 0;
FlashWriteCmd(NAND_READ0);
FlashWriteCmd(NAND_PAGE_PROG_C1);
FlashWriteAddr(0x00);         
FlashWriteAddr(PageAddr & 0xFF);        
FlashWriteAddr((PageAddr >> 8) & 0xFF);  
FlashWriteAddr((PageAddr >> 16) & 0xFF);   
for(i = 0;i < NAND_PAGE_SIZE;i++)
{
  FlashDataWrite(buf);
}
FlashWriteCmd(NAND_PAGE_PROG_C2);
_nop_();
NAND_WAITREADY         
status = 0x01 & (FlashReadStatus());   
CE = 1;
return  status;                          
}
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮顶下。

MARK.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
估计你还是要看看FLASH的DATASHEET,看看时序有没有问题。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

5
 
你的读和写寄出函数用了程序控制口线的方式选择ALE,CS,RD,WR等信号,这样,对NAND FLASH的读写严重依赖于你所使用的CPU时钟频率,易导致时序不匹配。建议根据Datasheet 和CPU的口线输出频率查找原因。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

6
 
可是我读的FLASH ID和STATUS的值是正确的啊。。
时序我都看了好多遍了,也加了延时等,结果都一样,好郁闷啊。。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
flash速度都是纳秒级的
C8051F CPU 系统时钟24MHz执行一条指令都不止了啊
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

8
 
肯定是这个问题啦!

NAND Flash还有和状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。在你的Flash的dataSheet中的时序途中一定有这个描述的,但在你的代码中,没看到这个步骤?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 yangcuncunzhang 的回复:
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?

有等待延时啊是这个宏定义
#define NAND_WAITREADY  {while(RB == 0);}
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
我把时钟改为12MHz后
state = FlashReadStatus();//结果是state = 0xE0;
flashid = FlashReadId();//结果是flashid = 0xAD76;
是正确的

但读写还是有问题,继续求助
state = FlashEraseBlock(0);
for(i = 0;i < NAND_PAGE_SIZE;i++)
writebuf = i;
state = FlashWritePage(0,writebuf);
FlashReadPage(0,readbuf);

readbuf结果总是FEFFFFFFFFFFF.....
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 9 楼 sytu_chyq 的回复:
引用 8 楼 yangcuncunzhang 的回复:
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?

有等待延时啊是这个宏定义
#define NAND_WAITREADY? {while(RB == 0);}


但是你的代码不是这样啊,例如你的读ID函数
unsigned int FlashReadId(void)
{
unsigned int deviceId = 0x0000;
  
CE = 0;            
FlashWriteCmd(NAND_READ_ID);
FlashWriteAddr(0x00);
deviceId  = FlashDataRead();
deviceId  = deviceId < < 8;
deviceId |= FlashDataRead();
CE =1;
return  deviceId;
}

FlashWriteCmd(NAND_READ_ID);之后没有等待Ready啊?
FlashWriteAddr(0x00); 之后也没有啊?
你看看DataSheet,是不是每个命令后都要等待完成的啊。

 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 yangcuncunzhang 的回复:
引用 9 楼 sytu_chyq 的回复:
引用 8 楼 yangcuncunzhang 的回复:
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?

有等待延时啊是这个宏定义
#define NAND_WAITREADY? {while(RB == 0);}


但是你的代码不是这样啊,例如你的读ID函数
unsigned int FlashReadId(void)
{
unsigned int deviceId = 0x0000;
?
CE = 0;? ? ? ? ? ?
FlashWriteCmd(NAND_READ_ID);
FlashWriteAddr(0x00);
deviceId? = FlashDataRead();
deviceId? = deviceId < < 8;
deviceId |= FlashDataRead();
CE =1;
return? deviceId;
}

FlashWriteCmd(NAND_READ_ID);之后没有等待Ready啊?
FlashWriteAddr(0x00); 之后也没有啊?
你看看DataSheet,是不是每个命令后都要等待完成的啊。



不是啊,只有块擦除(2ms)、页读取(...)及页写入(...)才有的啊
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 sytu_chyq 的回复:
引用 11 楼 yangcuncunzhang 的回复:
引用 9 楼 sytu_chyq 的回复:
引用 8 楼 yangcuncunzhang 的回复:
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?

有等待延时啊是这个宏定义
#define NAND_WAITREADY? {while(RB == 0);}


但是你的代码不是这样啊,例如你的读ID函数
unsigned int FlashReadId(void)
{
unsigned int deviceId = 0x0000;
?
CE = 0;? ? ? ? ? ?
FlashWriteCmd(NAND_READ_ID);
FlashWriteAddr(0x00);
deviceId? = FlashDataRead();
deviceId? = deviceId < < 8;
deviceId |= FlashDataRead();
CE =1;
return? deviceId;
}

FlashWriteCmd(NAND_READ_ID);之后没有等待Ready啊?
FlashWriteAddr(0x00); 之后也没有啊?
你看看DataSheet,是不是每个命令后都要等待完成的啊。



不是啊,只有块擦除(2ms)、页读取(...)及页写入(...)才有的啊


如果你用的Flash的资料上,只有这几个地方有,那你照着做就是对的。
可能是其他方面的问题
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

15
 
你把你用的Flash的资料也传上来,一起看看!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 yangcuncunzhang 的回复:
你把你用的Flash的资料也传上来,一起看看!

好的,谢谢,附件怎么传呢

还有我发现把系统频率再改小为6M
10楼情况结果为00 00 02 02 04 04.。。fe fe只读偶数
改小为3M结果为00 01 02 03 04.。。是对的
这咋回事呢
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 sytu_chyq 的回复:
引用 14 楼 yangcuncunzhang 的回复:
你把你用的Flash的资料也传上来,一起看看!

好的,谢谢,附件怎么传呢

还有我发现把系统频率再改小为6M
10楼情况结果为00 00 02 02 04 04.。。fe fe只读偶数
改小为3M结果为00 01 02 03 04.。。是对的
这咋回事呢


我也不知道怎么直接在帖子里贴附件,图片我也不会,因此我都是在eeworld空间的相册中上传图片,在这里贴个链接。至于其他文件,在资源区上传,然后在这里贴链接。、
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 16 楼 yangcuncunzhang 的回复:
我也不知道怎么直接在帖子里贴附件,图片我也不会,因此我都是在eeworld空间的相册中上传图片,在这里贴个链接。至于其他文件,在资源区上传,然后在这里贴链接。、


手册已上传,谢谢
http://download.eeworld.net/source/2021921
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 

现在有点建议:
1、先调试FlashReadPage(),你在10楼说读的结果是0xFEFFFFFF.....,说明读取结果不正确。但到底是读失败了呢?还是写错误了?因此,你先调试读函数,因为Erase函数比较好做,你做好Erase函数,然后来验证Read函数。等读函数做好了再调试写的。因为要先写进去,再读出来验证嘛。
2、在调试FlashEraseBlock(),FlashReadPage()和FlashWritePage()时,操作完成都有Status,你看看状态值都是什么,有没有操作成功。

我之前用过很多Nand Flash,最早Sharp的,Toashiba的,后来Samsung的,现在也用Hynix的(现在用HY27UF081g2A),基本上没什么难度。

如果连基本的读状态、Erase都返回错误状态的话,看是不是检查一下有些宏的定义、命令值的定义,看有没有出错的????

你先试试,我再看看资料
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 yangcuncunzhang 的回复:
现在有点建议:
1、先调试FlashReadPage(),你在10楼说读的结果是0xFEFFFFFF.....,说明读取结果不正确。但到底是读失败了呢?还是写错误了?因此,你先调试读函数,因为Erase函数比较好做,你做好Erase函数,然后来验证Read函数。等读函数做好了再调试写的。因为要先写进去,再读出来验证嘛。
2、在调试FlashEraseBlock(),FlashReadPage()和FlashWritePage()时,操作完成都有Status,你看看状态值都是什么,有没有操作成功。

我之前用过很多Nand Flash,最早Sharp的,Toashiba的,后来Samsung的,现在也用Hynix的(现在用HY27UF081g2A),基本上没什么难度。


如果连基本的读状态、Erase都返回错误状态的话,看是不是检查一下有些宏的定义、命令值的定义,看有没有出错的????

你先试试,我再看看资料



关键是我现在把系统频率降下来了已经是对的啊,你看看我前面的回复,帮解释下什么情况,谢了。。
另:FlashEraseBlock(),有误
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表