W25X16 片外Flash W25X16是华邦公司推出的继W25X10/20/40/80(从1Mb~8Mb)后容量更大的FLASH 产品,W25X16 的容量为 16Mb,还有容量更大的W25X32/64,ALIENTEK 所选择的 W25X16 容量为 16Mb,也就是2M 字节,同AT45DB161 是一样大小的。 W25X16 将 2M 的容量分为 32 个块(Block),每个块大小为64K 字节,每个块又分为 16个扇区(Sector),每个扇区16页 4K个字节。W25X16的最少擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25X16 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高 对于Ram 小的系统 开辟4K空间过于紧张,分配更小的Ram空间 如何使用这个芯片存取 一些数据呢? 主要是存一些配置信息,数据量大概几个扇区,但是每次修改只有几十个字节 有没有什么好的方法? 芯片手册上说 具备页编程指令 但是试了下不具备页擦除 |
我想我知道你的问题本质了。你的想法是,已经把数据写入到了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要求每那么大了。
我测试过,只写一个字节的数据都是可以的。
甚至可以跨页写都行(需要注意分页)。
只是擦除的时候最小单位是扇区而已。
评分
查看全部评分
需要能够读取或修改部分数据
如果重复的往一个地址读写,你直接写就行,不需要擦除该地址里的数据,不过这个得是eeprom
评分
查看全部评分
评分
查看全部评分
这个好像真不行。W25X16好像是你要写数据之前都要先擦除变为FF后才能写入。直接写入会失败。
你说的办法很好, 确实是这样, 需要用时间换空间,目前来看, 大部分的单片机内存已经具备开辟4K缓存的条件
玩单片机,很多时候就是螺蛳壳里做道场,闪转腾挪