OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4237|回复: 37

关于W25Q64的几点问题小讨论

[复制链接]

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
发表于 2018-7-19 12:20:38 | 显示全部楼层 |阅读模式
外置flash存储编程方面已经用战舰板子实验没有问题,OK。现在有个实际使用需求,每次100KB~2MB不等的数据需要存储更新,然后读取出来使用。数据手册上给出的擦写寿命为10万次。
我的想法是将2048个扇区的片子最开始的【第一个扇区】作为系统参数之类的东西固定存储区,剩余的2047个扇区作为做成一个环形队列的形式进行读写使用,“队头指针”“队尾指针”存放在【第一个扇区】,这样做是不是有助于使用寿命的最大化?即,循环写满8MB就算一次擦写寿命吧?
不知这样做是否存在一些弊端和不足,欢迎各路大神拍砖讨论。@正点原子
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-7-19 12:44:57 | 显示全部楼层
你第一个扇区也在不断地擦啊   逻辑是对的,地址最好再加个EEPROM。这家伙命长
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-19 13:45:46 | 显示全部楼层
jermy_z 发表于 2018-7-19 12:44
你第一个扇区也在不断地擦啊   逻辑是对的,地址最好再加个EEPROM。这家伙命长

你说的确实是。第一个扇区会因为“队头指针”“队尾指针”每次都改写。导致第一个扇区和后面2047个扇区擦写次数不均衡。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-19 13:50:44 | 显示全部楼层
jermy_z 发表于 2018-7-19 12:44
你第一个扇区也在不断地擦啊   逻辑是对的,地址最好再加个EEPROM。这家伙命长

但是,这样第一扇区每次擦写,后面2047扇区循环擦写。
寿命方面,相比不做循环擦写,每次都从第一个扇区开始擦写的做法要好些吧?还是效果差不多呢?
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-7-19 14:27:21 | 显示全部楼层
wyfzgybd 发表于 2018-7-19 13:50
但是,这样第一扇区每次擦写,后面2047扇区循环擦写。
寿命方面,相比不做循环擦写,每次都从第一个扇区 ...

这样算起来,其实你每次写入一次,都要对第一扇区擦除,对寿命其实没有进行延长,毕竟按照你的设计,如果第一扇区挂了,你整个数据也就挂了
学无止境
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-19 17:16:54 | 显示全部楼层
jermy_z 发表于 2018-7-19 14:27
这样算起来,其实你每次写入一次,都要对第一扇区擦除,对寿命其实没有进行延长,毕竟按照你的设计,如果 ...

恩恩,是的。先不加EEPROM了,最恶劣情况时平均一天也就50次左右擦写频率。flash官方寿命打对折5万次,也能使用三年了,应该可以接受。实际使用寿命应该能达到5-10年。
回复 支持 反对

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2036
金钱
2036
注册时间
2017-12-11
在线时间
454 小时
发表于 2018-7-19 19:53:08 | 显示全部楼层
建议直接上大容量的spi eeprom,一劳永逸。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-19 20:05:24 | 显示全部楼层
bootblack 发表于 2018-7-19 19:53
建议直接上大容量的spi eeprom,一劳永逸。

没找到eeprom有MB以上这么大容量的,推荐一些型号我去了解一些,谢谢!
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-7-19 23:52:55 | 显示全部楼层
找开源算法啊,EasyFlash就是一个不错的组件。有能力可也自己搞算法,移植ST那个也行。
回复 支持 反对

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2036
金钱
2036
注册时间
2017-12-11
在线时间
454 小时
发表于 2018-7-20 21:13:26 | 显示全部楼层
wyfzgybd 发表于 2018-7-19 20:05
没找到eeprom有MB以上这么大容量的,推荐一些型号我去了解一些,谢谢!

25lc1024 1mb字节 spi接口
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2018-7-20 21:43:48 | 显示全部楼层
第一个扇区也可以循环写啊,你又不是一次性全部写完
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-7-20 21:48:31 | 显示全部楼层
Electronic 发表于 2018-7-20 21:43
第一个扇区也可以循环写啊,你又不是一次性全部写完

然后呢?哪一个地址在存着之后数据的地址,你知道?
学无止境
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2018-7-20 21:50:10 | 显示全部楼层
查询的方法啊,存一次,序列号加1,下次读取的时候读取序列号最大的地址,我就是这样做的
回复 支持 反对

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-7-20 22:18:34 | 显示全部楼层
本帖最后由 sammy902583 于 2018-7-20 22:24 编辑

看过有人用这样的做法:
1. 基本上资料是从SPI ROM从头到尾写, 每一笔资料前面带Header, 后面接Payload, 一笔接一笔连续写入
2. Header有一个Flag, 每改变一次状态, 其中一个bit就从1改变为0, (比方讲未删除0xF, 删除变0x7), 这样改变状态只要再次写入Flag byte(不用擦除Block)就可以了.
3. 如果要改变某笔资料, 就改变旧资料Flag, 变成删除状态, 然后写入新资料
4. 当SPI ROM处于快满的情况时, 先保存里面有效的资料到另一个地方, 然后讲整块SPI ROM擦除, 再把保存的有效资料重新写回.

只是, 读取某个资料时要, 要从头到尾, 去识别Header就是了.
资料最尾端也不用特别保存记录, 在Header放一个非0xFF的Signature, 如果SPI ROM从到开始找, 看到Header全部是0xFF就是尾端了.
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-9-14
在线时间
32 小时
发表于 2018-7-21 14:37:26 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

19

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-6-8
在线时间
114 小时
发表于 2018-7-21 15:14:52 | 显示全部楼层
可以在每一个扇区的前几个数据作为FLAG,扇区内数据有效则写入1,每次写入新数据时将上一个扇区的FLAG清除,在下一个扇区写入FLAG和数据。
弊端是每一次写入数据都需要擦除一个扇区,并重新写入下一个扇区。
相当于你在第N个扇区写入数据的时候,需要先擦除N-1扇区的FLAG,再在N扇区写入数据,下一次在N+1写入的时候,需要擦除N扇区的FLAG。相当于每次保存一次数据,一个扇区先后各擦除一次。
不过应该可以实现2048个扇区成环形队列进行读写,我用EEPROM写过这样的程序
回复 支持 反对

使用道具 举报

19

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-6-8
在线时间
114 小时
发表于 2018-7-21 15:18:17 | 显示全部楼层
或者可以考虑SD卡?表示最近正准备研究使用SD卡进行一些数据的实时保存。

1M字节的EEPROM也可以考虑考虑
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2018-7-21 15:49:58 | 显示全部楼层
为什么都教别人换芯片?用SD卡?

我的建议是:根据你的“每次100KB~2MB不等的数据需要存储更新”这个需求,设计一个大概的擦写算法就可以了。

你给的这个需求,太笼统,每次100K~2MB,是连续的吗?
如果是连续的,就按你说的,环形写,
而且,不需要第一个扇区,每次上电的时候讲头尾找出来,存在RAM全局变量中就可以了,头尾要加点标志。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-23 10:40:08 | 显示全部楼层
屋脊雀 发表于 2018-7-21 15:49
为什么都教别人换芯片?用SD卡?

我的建议是:根据你的“每次100KB~2MB不等的数据需要存储更新”这个需 ...

我这每次只存一组这样的数据,连续的。你的意思我理解了,就是没必要把第一个扇区开辟出来单独存放存放数据的扇区地址。通过数据写入的时候,加上头和尾。每次上电后挨个sector找出头和尾的位置来就行了。这个方法不存,基本上完美解决这样的使用需求了。而且循环均衡擦写,寿命最大化了。  。不必如2楼说的加个eeprom了。@jermy_z
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-23 10:42:30 | 显示全部楼层
wbyrnygrysc 发表于 2018-7-21 15:14
可以在每一个扇区的前几个数据作为FLAG,扇区内数据有效则写入1,每次写入新数据时将上一个扇区的FLAG清除 ...

这样擦写次数太多了,18楼19楼方法还是不错的
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-23 10:44:18 | 显示全部楼层
Electronic 发表于 2018-7-20 21:50
查询的方法啊,存一次,序列号加1,下次读取的时候读取序列号最大的地址,我就是这样做的

你好,序列号是什么,什么时候改写,存在哪里。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-23 11:02:44 | 显示全部楼层
屋脊雀 发表于 2018-7-21 15:49
为什么都教别人换芯片?用SD卡?

我的建议是:根据你的“每次100KB~2MB不等的数据需要存储更新”这个需 ...

再问你一下,按照这样方式的循环挨个扇区的擦写存数据,是不是擦写2048个扇区后就是做片子的一次寿命的损耗吧?
比如,我一次数据都正好4000个字节左右(每次只需要动用一个扇区),那么也就是存取2048次视为“折寿”一次吧?
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-7-23 16:41:19 | 显示全部楼层
wyfzgybd 发表于 2018-7-23 10:40
我这每次只存一组这样的数据,连续的。你的意思我理解了,就是没必要把第一个扇区开辟出来单独存放存放数 ...

你怎么知道你上次的头尾?还是说你一直找全是0xff的区域?
学无止境
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2018-7-24 09:38:45 | 显示全部楼层
wyfzgybd 发表于 2018-7-23 11:02
再问你一下,按照这样方式的循环挨个扇区的擦写存数据,是不是擦写2048个扇区后就是做片子的一次寿命的损 ...

应该是这样。
如果你能把你的操作,也就是存数据的需求说详细点,我们可以更好讨论
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2018-7-24 09:39:54 | 显示全部楼层
jermy_z 发表于 2018-7-23 16:41
你怎么知道你上次的头尾?还是说你一直找全是0xff的区域?

“这是上次的头20180724”数据。。。。。。。。。。。。。数据“这是上次的尾20180724”
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2018-7-24 09:40:55 | 显示全部楼层
或者楼主可以看看SPIFFS
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-7-24 11:37:29 | 显示全部楼层
屋脊雀 发表于 2018-7-24 09:39
“这是上次的头20180724”数据。。。。。。。。。。。。。数据“这是上次的尾20180724”

前提你要知道哪条是你的最后一跳数据,你要把全部的头尾读出来?然后比较,那开机是要等蛮久的,呵呵
学无止境
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-24 16:30:04 | 显示全部楼层
屋脊雀 发表于 2018-7-24 09:38
应该是这样。
如果你能把你的操作,也就是存数据的需求说详细点,我们可以更好讨论

我的数据就是连续一串数据,一串数据总大小100KB~2MB不等,每次存的数据量大小不定。但是这个flash里仅有一组数据是有效数据,也就是这次来了新数据存下了,之前的一串旧数据就不要了。就这样子的简单存数据,现在就是想如何不加eeprom的情况,做到对这个flash循环均衡擦写。
14楼的没怎么看懂。@sammy902583
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-24 16:46:21 | 显示全部楼层
sammy902583 发表于 2018-7-20 22:18
看过有人用这样的做法:
1. 基本上资料是从SPI ROM从头到尾写, 每一笔资料前面带Header, 后面接Payload,  ...

你好,你的意思是不是每写一次新数据,就把旧数据的头尾通过直接改写的方式改变掉(避免擦除,flash不擦除直接写的条件是写入数据位只有1变0的情况就可以)?
刚写入的有效数据头加入为0xF0,当又有新数据要存入,这把之前这个数据的头直接写成0x00;  和你说的0xf 0x7是一个意思吧?
但是我现在想想好像这种不记录位置通过头尾识别的方式,有个弊端。比如我数据头数据尾标识都存储在扇区开头(浪费点空间就浪费点吧,这样查找头尾只要开机寻找最多2048次),但是头尾标识之间的数据有可能会有和头尾一样的数据字节,会造成误判头尾吧?就算把头尾标识做长,但也存在和数据字节相同的可能性。请问有没有什么好的想法?大家一起来讨论讨论。
回复 支持 反对

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2018-7-24 17:08:18 | 显示全部楼层
你这个好弄,就按你说的就可以,弄个结构体存第一扇区存,可以循环写。一定加校验,写了要读出来校验一遍,错了就再存一遍。这种短数据存我经常用啊,

typedef  struct
{
  uint32_t  addr_atart;
  
  uint16_t  max_n;
  uint16_t  data_lenth;
  
  uint16_t  data_crc_lenth;
  
  uint8_t  crc_8_16_f; //  校验函数8位或16位
  uint8_t  crc_4k_64k_f;// 4k或者16k
}flash_data_st;
flash_data_st   const   flash_data_tel=
{
  40*0x10000+6*0x1000,255,14,16,16,4               
};

typedef  struct
{
uint16_t  sec_f;
uint16_t  addr_n;
}WR_st;

static uint16_t flash_data_tel_addr;
void  flash_data_tel_write( )
{
         WR_st  WR_s;
        WR_s=Falsh_data_W_fun(&flash_data_tel, limit_s.tel ,flash_data_tel_addr );
          if(WR_s.sec_f)
                {
                flash_data_tel_addr=        WR_s.addr_n;
                }       
}

void  flash_data_tel_read( )//只上电调用一次
{
         WR_st  WR_s;
         WR_s=Falsh_data_R_fun(&flash_data_tel,limit_s.tel );
          if(WR_s.sec_f)
                {
                flash_data_tel_addr=        WR_s.addr_n;
                }       
                else
                {
                        sprintf(limit_s.tel ,"88888888"  );
                }
}   


底层读写就不写了,原理是写从低往高,大于max_n就擦除 返回地址0 。我是弄个max_n计数器,写入读出来校验,不对就重写,直到对或者max_n遍(这就坏了)
读从max_n往0读,返回第一个正确的。


回复 支持 反对

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-7-24 21:48:57 | 显示全部楼层
wyfzgybd 发表于 2018-7-24 16:46
你好,你的意思是不是每写一次新数据,就把旧数据的头尾通过直接改写的方式改变掉(避免擦除,flash不擦 ...

1. SPI, 1写成0, 不需要擦除, 0xFF ==> 0x00, 应该是可以的, 以1 bit为单位, 可以有8种状态.
2. 您的叙述其实我并不太理解, Header需要包含实际这笔资料的长度. 从头找到尾的方式, 只要每次读Header之后再加上这笔Header的长度, 就可以定位到下一个Header的位置, 没有数据会相同的问题. 而且也可以缩短从头找到尾的时间, 如果有足够的RAM的话, 还可以做cache缩短扫寻时间.
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-24 22:06:59 | 显示全部楼层
sammy902583 发表于 2018-7-24 21:48
1. SPI, 1写成0, 不需要擦除, 0xFF ==> 0x00, 应该是可以的, 以1 bit为单位, 可以有8种状态.
2. 您的叙 ...

恩恩,这样好像可以。你帮看下我理解的对不对,比如我定义数据头header格式是5个字节, F0  00  00  FF FF,第一个F0,代表有效数据flag,后面4字节00 00 FF  FF 作为有效数据的长度。那么上电后就搜索,搜索到F0,并且根据F0后面的四字节的长度计算出尾的位置,去看看尾的位置是不是尾标志,是的话就说明找到这段有效数据了。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-24 22:09:43 | 显示全部楼层
gotofly21 发表于 2018-7-24 17:08
你这个好弄,就按你说的就可以,弄个结构体存第一扇区存,可以循环写。一定加校验,写了要读出来校验一遍, ...

你好,你这个用来存放数据位置信息的结构体在第一扇区循环存放,上电后如何对第一扇区搜索,怎样判断出有效数据的结构体信息呢?用什么来区分的
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2018-7-25 00:44:56 | 显示全部楼层
本帖最后由 屋脊雀 于 2018-7-25 00:46 编辑

不要在第一扇区做,否则就像其他人说的,第一页会最早坏掉。
因为你的数据最小是100K,是远远大于4K的,所以我们可以把4K当最小单元。这样开机的时候就像你说的,最坏的情况只要读2048次头标志,我觉得开机这一点时间应该能接受。
每段数据必定是地址4K对齐。
那么久在4K对齐的地方存数据头
数据头可以这样:
0X55 0XAA 时间戳 数据长度,。。。。数据头校验和
估计数据头也就32字节。
写新数据后,旧数据只要把签名两个字节强制写为0X00就可以了,不用擦,0X55可以写成0x00。

如果觉得上电可能要读2048次还是慢,那就用第0块做索引。
2个字节做索引,U16,可以索引到2048块。
4K,可以索引2048次。
这样做:
1 第一次擦除第0块。
2 第一次写,用前面两个字节做索引,例如现在是从第1块开始,那么前面两个字节就是0X0002。
3 第二次修改,现在从第100块开始,那么,2字节跟3字节就是0X0064。
4 一直到用完第0块,再做一次擦除。

上电的时候,只要将第0块4096个字节读出来,慢慢找就可以找到数据头在哪里了。

说到这里,想起一个概念:实时操作系统

实时并不意味着快,而是意味着稳定。

如果不做索引,那么有可能就要读2048次32个字节。
但是也有可能只要读一次就找到了,对吧?

用索引,那么就是每次都是读4096个字节,时间是稳定的,这就叫实时。

对了,写到这里突然豁然开朗。

因为你在头里面加了数据长度,其实相当于有一个链表了。
也就是说,旧数据并不是没用:
读第一块,400K,但是,不是最新的,那么,下一个数据,肯定在101块,是吧?
那么就算每个数据都是100K,也就最多读8*1024/100=80.24次
我觉得非常能接受了。
回复 支持 反对

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2018-7-25 08:16:04 | 显示全部楼层
本帖最后由 gotofly21 于 2018-7-25 08:20 编辑
wyfzgybd 发表于 2018-7-24 22:09
你好,你这个用来存放数据位置信息的结构体在第一扇区循环存放,上电后如何对第一扇区搜索,怎样判断出有 ...

因为信息结构体长度L是已知的啊。那么每个起始地址不就是 L*n吗?从最后一个往前读,用crc检验。
回复 支持 反对

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-7-25 09:09:28 | 显示全部楼层
wyfzgybd 发表于 2018-7-24 22:06
恩恩,这样好像可以。你帮看下我理解的对不对,比如我定义数据头header格式是5个字节, F0  00  00  FF FF ...


原本写这个算法的是把识别放Header, 这样直接读一次Header就可以识别了
识别符放尾巴的也是可以的, 意思是一样的
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-25 09:46:50 | 显示全部楼层
gotofly21 发表于 2018-7-25 08:16
因为信息结构体长度L是已知的啊。那么每个起始地址不就是 L*n吗?从最后一个往前读,用crc检验。

恩,就是按照L长度查找,如果发现后面的字节都是FF,那就桌面当前的为最近一次有效的数据信息块。
回复 支持 反对

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-12-29
在线时间
45 小时
 楼主| 发表于 2018-7-25 09:56:51 | 显示全部楼层
屋脊雀 发表于 2018-7-25 00:44
不要在第一扇区做,否则就像其他人说的,第一页会最早坏掉。
因为你的数据最小是100K,是远远大于4K的,所 ...

明白了,讨论这么多了,基本就是你说的两种方式
1、不加索引,读写都是直接数据头数据尾的方式循环。
2、第一个扇区作为索引,循环存数据信息内容。后面的2047个扇区循环存数据。PS:这种方法再加上30楼那位说的加上校验,不要只是写两字节的地址信息,哪怕就是两字节地址两字节crc,一共四字节。这样读取索引的时候校验一下,以免读索引的时候万一受到未知干扰或者错误导致索引不对出乱子。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 17:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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