nand flash读写求助

sytu_chyq 2010-01-23 11:37:17
希望有人能够指点下

情况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数据手册上的读写时序及读写过程,感觉上面程序没啥问题啊,不知道有没忽略掉什么,很不解,知道的能不能提点建议啊,谢过先。。
...全文
474 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzi_fan 2011-07-25
  • 打赏
  • 举报
回复
我也遇到类似的问题了,郁闷啊,怎么解决啊
yaoxiaoming061 2011-05-05
  • 打赏
  • 举报
回复
我碰到的问题一摸一样,改怎么解决啊
ialwaysgo 2010-01-27
  • 打赏
  • 举报
回复
ls有理,顶一下
yangcuncunzhang 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sytu_chyq 的回复:]
另外:
如果要从串口UART读取数据存到FLASH一般怎么做呢
要一次读取512或528一页一页存储吧
而若串口中断缓存没那么大呢
或是一次读取的数据没那么多呢
该咋整
[/Quote]

你将从串口接收来的数据先暂存在RAM中嘛,等收够一定的数据,再写入Flash啊。

我之前做过一个烧录Flash的代码,就是在Loader中通过Uart/USB收数据,把收到的数据都存在RAM中,等全部数据收完后,还要对数据进行CheckSum校验,保证RAM中的数据没问题才写到Flash中。因为我们可以写Loader自己的,如果数据有问题就写了,有可能导致板子不能启动。
sytu_chyq 2010-01-27
  • 打赏
  • 举报
回复
另外:
如果要从串口UART读取数据存到FLASH一般怎么做呢
要一次读取512或528一页一页存储吧
而若串口中断缓存没那么大呢
或是一次读取的数据没那么多呢
该咋整
sytu_chyq 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yangcuncunzhang 的回复:]
现在有点建议:
1、先调试FlashReadPage(),你在10楼说读的结果是0xFEFFFFFF.....,说明读取结果不正确。但到底是读失败了呢?还是写错误了?因此,你先调试读函数,因为Erase函数比较好做,你做好Erase函数,然后来验证Read函数。等读函数做好了再调试写的。因为要先写进去,再读出来验证嘛。
2、在调试FlashEraseBlock(),FlashReadPage()和FlashWritePage()时,操作完成都有Status,你看看状态值都是什么,有没有操作成功。

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


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

你先试试,我再看看资料
[/Quote]


关键是我现在把系统频率降下来了已经是对的啊,你看看我前面的回复,帮解释下什么情况,谢了。。
另:FlashEraseBlock(),有误
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
我把时钟改为12MHz后
state = FlashReadStatus();//结果是state = 0xE0;
flashid = FlashReadId();//结果是flashid = 0xAD76;
是正确的

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

readbuf结果总是FEFFFFFFFFFFF.....
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yangcuncunzhang 的回复:]
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?
[/Quote]
有等待延时啊是这个宏定义
#define NAND_WAITREADY {while(RB == 0);}
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复
刚才错别字太多!

肯定是这个问题啦!

NAND Flash还有个状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。Flash的dataSheet中的时序图中一定有这个描述的,但在你的代码中,没看到这个步骤?
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复
肯定是这个问题啦!

NAND Flash还有和状态脚R/B,即Ready/Busy,在写一个命令后,一定要查看R/B,等他Ready,即完成当前命令,再进行下一个动作。在你的Flash的dataSheet中的时序途中一定有这个描述的,但在你的代码中,没看到这个步骤?
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
flash速度都是纳秒级的
C8051F CPU 系统时钟24MHz执行一条指令都不止了啊
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
可是我读的FLASH ID和STATUS的值是正确的啊。。
时序我都看了好多遍了,也加了延时等,结果都一样,好郁闷啊。。
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复

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

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

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

你先试试,我再看看资料
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yangcuncunzhang 的回复:]
我也不知道怎么直接在帖子里贴附件,图片我也不会,因此我都是在CSDN空间的相册中上传图片,在这里贴个链接。至于其他文件,在资源区上传,然后在这里贴链接。、
[/Quote]

手册已上传,谢谢
http://download.csdn.net/source/2021921
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sytu_chyq 的回复:]
引用 14 楼 yangcuncunzhang 的回复:
你把你用的Flash的资料也传上来,一起看看!

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

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

我也不知道怎么直接在帖子里贴附件,图片我也不会,因此我都是在CSDN空间的相册中上传图片,在这里贴个链接。至于其他文件,在资源区上传,然后在这里贴链接。、
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yangcuncunzhang 的回复:]
你把你用的Flash的资料也传上来,一起看看!
[/Quote]
好的,谢谢,附件怎么传呢

还有我发现把系统频率再改小为6M
10楼情况结果为00 00 02 02 04 04.。。fe fe只读偶数
改小为3M结果为00 01 02 03 04.。。是对的
这咋回事呢
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复
你把你用的Flash的资料也传上来,一起看看!
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 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)、页读取(...)及页写入(...)才有的啊
[/Quote]

如果你用的Flash的资料上,只有这几个地方有,那你照着做就是对的。
可能是其他方面的问题
sytu_chyq 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 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,是不是每个命令后都要等待完成的啊。


[/Quote]
不是啊,只有块擦除(2ms)、页读取(...)及页写入(...)才有的啊
yangcuncunzhang 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sytu_chyq 的回复:]
引用 8 楼 yangcuncunzhang 的回复:
刚才错别字太多!

肯定是这个问题啦!

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

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

但是你的代码不是这样啊,例如你的读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,是不是每个命令后都要等待完成的啊。

加载更多回复(4)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧