你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于 W25X16 的用法

[复制链接]
AI++ 提问时间:2018-10-16 18:00 /
W25X16   片外Flash

W25X16是华邦公司推出的继W25X10/20/40/80(从1Mb~8Mb)后容量更大的FLASH 产品,W25X16 的容量为 16Mb,还有容量更大的W25X32/64ALIENTEK 所选择的 W25X16 容量为 16Mb,也就是2M 字节,同AT45DB161 是一样大小的。 W25X16 2M 的容量分为 32 个块(Block),每个块大小为64K 字节,每个块又分为 16个扇区(Sector),每个扇区16页 4K个字节。W25X16的最少擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25X16 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高


对于Ram 小的系统 开辟4K空间过于紧张,分配更小的Ram空间 如何使用这个芯片存取 一些数据呢?
主要是存一些配置信息,数据量大概几个扇区,但是每次修改只有几十个字节

有没有什么好的方法?




芯片手册上说 具备页编程指令
但是试了下不具备页擦除









收藏 评论12 发布时间:2018-10-16 18:00

举报

12个回答
STM1024 回答时间:2018-10-17 09:58:41
本帖最后由 stm1024 于 2018-10-17 10:00 编辑
50031185 发表于 2018-10-16 18:15
需要能够读取或修改部分数据

我想我知道你的问题本质了。你的想法是,已经把数据写入到了W25,然后发现需要修正1个字节。但是这个时候W25已经被写入了数据,如果你想写入新数据,就要先擦除原来的数据,一擦除就是一个sector,所以必须想办法保存原来的数据,你的想法是在RAM中开辟一个缓冲区,然后先读数据,然后在RAM中修改,然后擦除W25,最后再写入。
如果我没理解错的话,给你的建议是这样的:
1.你没必要把缓冲区完全放在宝贵的RAM中,可以把W25作为一个二级缓冲区,例如W25的最后一个Sector,这个位置可以固定,然后一般的数据也不要往这里面写入。在RAM中只保留一个很小的一级缓冲区,例如一个页面,16Byte,这个大小对应该RAM来说应该毫无压力了吧?
2.现在有一级缓冲区,也有二级缓冲器了,如何使用呢?先按sector删除二级缓冲区,这样二级缓冲区就变成可用状态了。对于你需要读取并修改的数据,先按页读取到一级缓冲区中,如果不需要修改,则直接写入二级缓冲区的对应位置,如果发现需要修改,则修改后写入二级缓冲区的对应位置;循环执行页读取,直到操作完成整个sector。
3.执行完第二步以后,原Sector数据没变,新数据被写入到了二级缓冲区里面了,最后一步就是把最后一个sector的数据copy到原需要修改的sector中,这个可以采用2类似的操作。
这种方法不是太高效,有点像是用时间换空间的感觉,但本质上空间并没有省去,相反时间也增加了。只是把RAM的空间换到外部的ROM中了,唯一的优点可能是选择芯片的时候对内部flash要求每那么大了。
STM1024 回答时间:2018-10-16 18:11:13
如果只是写入,你没必要去开辟一个这么大的缓冲区。
我测试过,只写一个字节的数据都是可以的。
甚至可以跨页写都行(需要注意分页)。
只是擦除的时候最小单位是扇区而已。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

AI++ 回答时间:2018-10-16 18:15:22
stm1024 发表于 2018-10-16 18:11
如果只是写入,你没必要去开辟一个这么大的缓冲区。
我测试过,只写一个字节的数据都是可以的。
甚至可以跨 ...

需要能够读取或修改部分数据
化雨眠 回答时间:2018-10-17 07:59:33
本帖最后由 化雨眠 于 2018-10-17 08:44 编辑
50031185 发表于 2018-10-16 18:15
需要能够读取或修改部分数据

如果重复的往一个地址读写,你直接写就行,不需要擦除该地址里的数据,不过这个得是eeprom

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

废鱼 回答时间:2018-10-17 08:26:15
我用的时候,使用的macoll申请一个临时空间使用。每个地址是只能写入一次,下次写入时必须要擦除才能写。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

STM1024 回答时间:2018-10-17 09:43:42
化雨眠 发表于 2018-10-17 07:59
如果重复的往一个地址读写,你直接写就行,不需要擦除该地址里的数据,不过这个得是eeprom

...

这个好像真不行。W25X16好像是你要写数据之前都要先擦除变为FF后才能写入。直接写入会失败。
tanic 回答时间:2018-10-17 09:52:55
写入flash的数据不一定要地址连续,比如能开一个256字节的ram,那么一个扇区你就存256个字节数据,多的数据存到下个扇区,依此类推
AI++ 回答时间:2018-10-29 23:51:53
stm1024 发表于 2018-10-17 09:58
我想我知道你的问题本质了。你的想法是,已经把数据写入到了W25,然后发现需要修正1个字节。但是这个时候W ...

你说的办法很好, 确实是这样, 需要用时间换空间,目前来看, 大部分的单片机内存已经具备开辟4K缓存的条件
STM1024 回答时间:2018-10-30 08:02:36
50031185 发表于 2018-10-29 23:51
你说的办法很好, 确实是这样, 需要用时间换空间,目前来看, 大部分的单片机内存已经具备开辟4K缓存的 ...

玩单片机,很多时候就是螺蛳壳里做道场,闪转腾挪
sincomaster 回答时间:2018-10-30 08:46:26
学习了,谢谢大大们
wujique 回答时间:2018-10-30 17:33:34
用多块,轮流写,做标记,标记对的就是新的
TLLED 回答时间:2018-10-30 17:50:10
这个芯片擦除得页擦除,先要把数据读出来,页擦除后再写入要写的数据

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版