找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1731|回复: 11
收起左侧

单片机+24C08 EEPROM保存和读取对应数据的程序思路

[复制链接]
ID:997026 发表于 2022-10-17 01:04 来自手机 | 显示全部楼层 |阅读模式
现在单片机需要外接一颗24C08的eeprom,需要保存100-200之间的随机数字,在eeprom开辟一个5地址空间来保存,从0地址开始写,写到4满后,再回头从0开始写,如此循环。

要保存的数100-200是随机的,只需在上电开机读最后一次保存的数字,其他不关注,比如,数字变化了6次,依次是,101,112,122,133,145,166,那么101写到0地址,依次写,145写到4地址,写满后,166写到0地址覆盖了101,现在需要在开机时检测最后一个数字166,有什么好的思路,怎么知道166是最后一个数字呢,怎么知道166在0地址呢?有什么方法检测到这个166?这个举例是是数字变化了6次,要求在数字变化10次,100次依然可以检测到。
回复

使用道具 举报

ID:883242 发表于 2022-10-17 05:50 | 显示全部楼层
按页擦除,从后往前读,第一个不是0xff的166就是你要的166。
回复

使用道具 举报

ID:997026 发表于 2022-10-17 09:27 来自手机 | 显示全部楼层
Hephaestus 发表于 2022-10-17 05:50
按页擦除,从后往前读,第一个不是0xff的166就是你要的166。

感谢回复!你的回复犹如醍醐灌顶!我知道怎么写了,感谢
回复

使用道具 举报

ID:624769 发表于 2022-10-17 09:59 来自手机 | 显示全部楼层
24c系列,只有读写的eeprom,比较适合插标法,即6个字节存5个字节数据,写完数据,后面写个0,下次写,新数据覆盖0,再后面写个0,读的时候,读0前面的数据,如果第一个是0,读最后一个,
回复

使用道具 举报

ID:123289 发表于 2022-10-17 14:39 | 显示全部楼层
地址【0,1,2,3,4】写随机数据,地址【5】写指针0-4,记录当前位置
例:开机读到【5】=3,即上次写的是地址【3】,则本次写地址【4】,并改【5】=4。
回复

使用道具 举报

ID:997026 发表于 2022-10-18 10:05 | 显示全部楼层
yzwzfyz 发表于 2022-10-17 14:39
地址【0,1,2,3,4】写随机数据,地址【5】写指针0-4,记录当前位置
例:开机读到【5】=3,即上次写的是 ...

谢谢!你这种方法是不是每写一次随机数据,就会在地址【5】记录一次?比如我在地址0写110,就会在地址5记录0,在地址1写150,就会在地址5记录1,是这个意思吗?这个方法很好,但是频繁在地址5写数据,时间长了会不会不太好?我实际上想用一种所谓均摊法,让每个地址写数据的机会几乎均等
回复

使用道具 举报

ID:997026 发表于 2022-10-18 10:11 | 显示全部楼层
188610329 发表于 2022-10-17 09:59
24c系列,只有读写的eeprom,比较适合插标法,即6个字节存5个字节数据,写完数据,后面写个0,下次写,新数 ...

谢谢!我的理解是,比如地址0,1,2,3,4,5,地址0写一个数据后,再在地址1写0,然后在地址1写数据后,覆盖原先的0,然后再在地址2写0,以此类推,然后读的时候,从后往前读,读到第一个0的时候,0前面的就是我要找的数,不知道我的理解对不对
回复

使用道具 举报

ID:624769 发表于 2022-10-18 11:26 | 显示全部楼层
hxdby 发表于 2022-10-18 10:11
谢谢!我的理解是,比如地址0,1,2,3,4,5,地址0写一个数据后,再在地址1写0,然后在地址1写数据后,覆盖 ...

对,就是这个意思,当然,因为你数据 范围是100~200  不会出现 0,所以,用插标法比较经济。因为所有字节均摊这个标志的写入次数。同理,只要数据中有 绝对不会出现的某个值,你都可以把它定为你的“标记” 都可以用插标法。
回复

使用道具 举报

ID:883242 发表于 2022-10-18 11:34 | 显示全部楼层
hxdby 发表于 2022-10-18 10:11
谢谢!我的理解是,比如地址0,1,2,3,4,5,地址0写一个数据后,再在地址1写0,然后在地址1写数据后,覆盖 ...

你的理解完全错误,eeprom和flash不可能“覆盖原先的0”。

必须先把原先的数据全部擦除成1,字节表达就是全擦除成0xff,才可把需要的0写成0,1不变。

既然你的数据不可能出现0xff,那么优化均摊写法就很容易实现,不要像某些二傻子那样找个“记录当前位置”把这个位置写坏掉。
回复

使用道具 举报

ID:997026 发表于 2022-10-18 16:08 | 显示全部楼层
Hephaestus 发表于 2022-10-18 11:34
你的理解完全错误,eeprom和flash不可能“覆盖原先的0”。

必须先把原先的数据全部擦除成1,字节表达 ...

对于flash而言,确实需要在重新写数据之前先擦除,也就是需要写一个函数,专门来干擦除的活,但是eeprom,你的意思是也需要先擦除吗?我之前用过的eeprom都是直接覆盖写入了,并没有先做擦除的动作,还是你表达的意思是芯片内部帮我们做了擦除动作,我们不需要自己在家擦除了?
回复

使用道具 举报

ID:624769 发表于 2022-10-18 17:20 | 显示全部楼层
hxdby 发表于 2022-10-18 16:08
对于flash而言,确实需要在重新写数据之前先擦除,也就是需要写一个函数,专门来干擦除的活,但是eeprom ...

你看一下 24C08 的手册 就知道了, 压根没有擦除指令, 只有读写指令, 难道你去写0xff ?  这不是多此一举么?   网上找答案,也需要学会自己思考
回复

使用道具 举报

ID:997026 发表于 2022-10-18 21:24 | 显示全部楼层
188610329 发表于 2022-10-18 17:20
你看一下 24C08 的手册 就知道了, 压根没有擦除指令, 只有读写指令, 难道你去写0xff ?  这不是多此一 ...

FLASH我用过很多,eeprom也用过,所以我觉得他说的我非常惊讶,第一次听说eeprom要先擦除再写,我之前都是覆盖写入。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表