标题: 单片机+24C08 EEPROM保存和读取对应数据的程序思路 [打印本页]

作者: hxdby    时间: 2022-10-17 01:04
标题: 单片机+24C08 EEPROM保存和读取对应数据的程序思路
现在单片机需要外接一颗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次依然可以检测到。
作者: Hephaestus    时间: 2022-10-17 05:50
按页擦除,从后往前读,第一个不是0xff的166就是你要的166。
作者: hxdby    时间: 2022-10-17 09:27
Hephaestus 发表于 2022-10-17 05:50
按页擦除,从后往前读,第一个不是0xff的166就是你要的166。

感谢回复!你的回复犹如醍醐灌顶!我知道怎么写了,感谢
作者: 188610329    时间: 2022-10-17 09:59
24c系列,只有读写的eeprom,比较适合插标法,即6个字节存5个字节数据,写完数据,后面写个0,下次写,新数据覆盖0,再后面写个0,读的时候,读0前面的数据,如果第一个是0,读最后一个,
作者: yzwzfyz    时间: 2022-10-17 14:39
地址【0,1,2,3,4】写随机数据,地址【5】写指针0-4,记录当前位置
例:开机读到【5】=3,即上次写的是地址【3】,则本次写地址【4】,并改【5】=4。
作者: hxdby    时间: 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写数据,时间长了会不会不太好?我实际上想用一种所谓均摊法,让每个地址写数据的机会几乎均等
作者: hxdby    时间: 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前面的就是我要找的数,不知道我的理解对不对
作者: 188610329    时间: 2022-10-18 11:26
hxdby 发表于 2022-10-18 10:11
谢谢!我的理解是,比如地址0,1,2,3,4,5,地址0写一个数据后,再在地址1写0,然后在地址1写数据后,覆盖 ...

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

作者: Hephaestus    时间: 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,那么优化均摊写法就很容易实现,不要像某些二傻子那样找个“记录当前位置”把这个位置写坏掉。
作者: hxdby    时间: 2022-10-18 16:08
Hephaestus 发表于 2022-10-18 11:34
你的理解完全错误,eeprom和flash不可能“覆盖原先的0”。

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

对于flash而言,确实需要在重新写数据之前先擦除,也就是需要写一个函数,专门来干擦除的活,但是eeprom,你的意思是也需要先擦除吗?我之前用过的eeprom都是直接覆盖写入了,并没有先做擦除的动作,还是你表达的意思是芯片内部帮我们做了擦除动作,我们不需要自己在家擦除了?
作者: 188610329    时间: 2022-10-18 17:20
hxdby 发表于 2022-10-18 16:08
对于flash而言,确实需要在重新写数据之前先擦除,也就是需要写一个函数,专门来干擦除的活,但是eeprom ...

你看一下 24C08 的手册 就知道了, 压根没有擦除指令, 只有读写指令, 难道你去写0xff ?  这不是多此一举么?   网上找答案,也需要学会自己思考
作者: hxdby    时间: 2022-10-18 21:24
188610329 发表于 2022-10-18 17:20
你看一下 24C08 的手册 就知道了, 压根没有擦除指令, 只有读写指令, 难道你去写0xff ?  这不是多此一 ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1