[原创] 【M4开发板Hanker试用狂-Shower.Xu】6、W25x80操作-我要记住你

shower.xu   2012-5-31 09:33 楼主
W25x80是华邦出的一款串行falsh存储器, 存储容量8M bit,通过SPI接口进行数据读写,具有写保护功能。它有4096个可编程页组成,每页256字节,每个扇区由16个页组成,用页编程指令每次可编程256字节,用扇区擦除指令每次可擦除4K字节,也可进行块擦除或整个新片擦除。
芯片采用标准SPI接口控制,四线制,传输速率可支持到75MHz,使用快读双输出指令可更高。

本以为很简单的,结果浑浑噩噩搞了几天,大致能用,中间状况百出,至今还有几点没弄明白,继续折腾。
我觉得几点需要注意的地方:
1、传入要写的参数需要是全局变量
2、要严格注意时序
3、写之前必须先擦除目标区域,即目标区为0xff时可写。
4、读写时注意最小读写单元是页,最好整页操作或做充分的页地址判断
我利用Flash的存储写了个小程序进行演示。
程序上电会判断w25x80里是否有我们之前保存的数据(指示上次掉电前led灯状态),如果有则读出数据并恢复LED上次一样的显示,没有则默认全灭。
每次我们触摸屏幕选择LED的亮灭都会被记录下来以供下次开机调用。
视頻在这里:
[media]http://www.tudou.com/v/6G7iEgM6mw8/&rpid=100900070&resourceId=100900070_04_05_99/v.swf[/media]
源代码在这里:
3.13 SPI new.rar (401.99 KB)
(下载次数: 90, 2012-5-31 09:43 上传)

[ 本帖最后由 shower.xu 于 2012-5-31 09:43 编辑 ]

回复评论 (10)

老大搞出来啦!!学习!!
点赞  2012-5-31 09:57
引用: 原帖由 anananjjj 于 2012-5-31 09:57 发表 老大搞出来啦!!学习!!

郁闷的很,折腾了我几天,还有点疑惑没搞明白
点赞  2012-5-31 10:07
程序上电会判断w25x80里是否有我们之前保存的数据

这个是怎么判断的?
点赞  2012-6-1 08:46
引用: 原帖由 Study_Stellaris 于 2012-6-1 08:46 发表 程序上电会判断w25x80里是否有我们之前保存的数据 这个是怎么判断的?

每次改变灯时会保存灯的当前状态到flash,其实就是一字节数据,每次开机判断该地址的数据是否为我们要求的格式,是则显示,否则默认全灭。

点赞  2012-6-1 09:28
请教 你几个关于W25X80的问题哈
就是关于W25X80的地址是怎么判断的呢  为什么我写了数据 每次读的数据都是0xff呢  真的搞不懂啊
点赞  2012-11-17 15:23
还有就是  
IO_Write_Byte(0x00000000,0xa5);     
SendSPIByte(((Dst_Addr & 0xFFFFFF) >> 16));  /* send 3 address bytes */
SendSPIByte(((Dst_Addr & 0xFFFF) >> 8));
SendSPIByte(Dst_Addr & 0xFF);

这几句的含义是什么呢   为什么是0x00000000呢
有点摸不清啊
点赞  2012-11-17 15:26
原帖由 ly471089608 于 2012-11-17 15:26 发表
还有就是  
IO_Write_Byte(0x00000000,0xa5);     
SendSPIByte(((Dst_Addr & 0xFFFFFF) >> 16));  /* send 3 address bytes */
SendSPIByte(((Dst_Addr & 0xFFFF) >> 8));
SendSPIByte(Dst_Addr & 0xFF);

...


不好意思,没找到这几句话在哪里
简单解释一下
        SPI_Write_Byte(W25X_SectorErase);
        SPI_Write_Byte((unsigned char)((nDest & 0xFFFFFF) >> 16));
        SPI_Write_Byte((unsigned char)((nDest & 0xFFFF) >> 8));
        SPI_Write_Byte((unsigned char)nDest & 0xFF);

这几行根据数据表来的
先写命令控制字,擦除就是0x20
QQ截图20121117181812.jpg
后面三字节是地址,这里是扇区地址(4k/扇区)

还有,先格式化,在读写操作

[ 本帖最后由 shower.xu 于 2012-11-18 22:49 编辑 ]
点赞  2012-11-17 18:19
你好  我的芯片是C8051F020  为什么每次读出来的数据都是0xff  你QQ多少  我把程序给你看下  有没有什么问题呢
点赞  2012-11-21 16:10
IO_Erase_Sector(0x00000000);    0xD8吧  写进去就可以了吧  这就是格式化吧
点赞  2012-11-21 16:27
引用: 原帖由 ly471089608 于 2012-11-21 16:27 发表
IO_Erase_Sector(0x00000000);    0xD8吧  写进去就可以了吧  这就是格式化吧
我没有用过那个IC

对,每次写之前先擦除扇区
点赞  2012-11-21 18:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复