spi读写问题

[复制链接]
1736|8
 楼主| xuetudou 发表于 2014-12-30 10:43 | 显示全部楼层 |阅读模式
之前用的EEPROM,因为空间太小,改用华邦的W25X16flash,遇到了些问题:flash在写之前要先进行擦除。我把系统参数存在了第一个扇区(前4k),因为参数需要经常改写,写之前要进行擦除,手册上最小的擦除单元就是扇区擦除,每次改一个参数都要把所有参数都读出来,擦了之后整合一下写进去,感觉很麻烦。求解答
aozima 发表于 2014-12-30 12:39 | 显示全部楼层
参数估计4K用不完,所以一个扇区可以存放多个,用最新那个,这样写N次以后再擦除。
万一擦写一半掉电还能恢复上一次的数据。

为更保险以及增加寿命,可以用2个扇区就更好了。

评论

tyw
好主意,赞一个  发表于 2014-12-30 12:42
tyw 发表于 2014-12-30 12:47 | 显示全部楼层
SPI总线协议介绍.pdf (471.75 KB, 下载次数: 14) 2013-6-17 19:55 上传
下载次数: 14


chunyang 发表于 2014-12-30 17:43 | 显示全部楼层
经常写入不适合用FLASH,务必计算擦写循环寿命是否满足。
chunyang 发表于 2014-12-30 17:49 | 显示全部楼层
如果有足够的空余存储空间,可以用增量法写入,这样可以大大延长扇区寿命并降低写入时间。具体而言,FLASH只能位写入0,根据0位可以指向一个扇区的不同位置,用一个或数个字节来做索引,索引字节的位依次写入0,然后根据0的位置转向特定的地址进行写入。所有索引位都为0时才进行整扇擦除。
lee2k 发表于 2014-12-31 08:16 | 显示全部楼层
chunyang 发表于 2014-12-30 17:49
如果有足够的空余存储空间,可以用增量法写入,这样可以大大延长扇区寿命并降低写入时间。具体而言,FLASH ...

真是好办法!学习了!
shell.albert 发表于 2014-12-31 09:09 | 显示全部楼层
这方法不错,平均一下,让所有单元都有被写的机会。
叶伤 发表于 2015-1-1 09:20 来自手机 | 显示全部楼层
系统参数分开存进各个扇区,要改写可以对各自扇区改写,如果是数据较多,利用擦除后为0xff轮着写下去,先读取数据碰到连续n个0xff认为是够写入,就回到第一个0Xff写入进去。读取的时候碰到连续0xff,认为没写到这里,就回到有数据的地方读取。发现整个扇区已写就擦除扇区,再写入。最好使用两个扇区进行互相备份,每写一次,就跟着写入修改次数,次数大的为最近更新。
比如
扇区1,数据,次数0,数据,次数1。
扇区2,数据,次数0,n个0Xff。

说明扇区1存在断电无法存入的可能性,则读取扇区2的0次数据进行恢复(扇区2在1完成后再写入,如果扇区1没写完成就断电或者程序异常,扇区2是不会被写的,这样保证了能读取到有效数据,当然,这个冗余功能可以不要。)。
 楼主| xuetudou 发表于 2015-1-4 13:11 | 显示全部楼层
非常感谢大家回帖和提到的方法,很有用,特别谢谢二楼和春阳版主的回复,先不结贴吧,看看别人还有啥好的方法没,没了再结
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

70

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部