打印

spi flash擦写次数的暴力测试

[复制链接]
23575|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mei326|  楼主 | 2014-8-15 22:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用了华邦的SPI FLASH W25Q64 ,由于要经常性的更新Flash中的数据,初步估计平均每天更新100次左右,按照手册上的最高可大100,000次,也顶多只能用个3年。因此写了个测试程序来测试下。结果令人大跌眼镜~已经到了300,000+ 了,还没挂...有这么强大吗?这样就能用十年了...
   本来计划写个简单的算法,每个扇区擦写个五万次后就写入个故障标志再换个扇区继续...

附上测试程序
union {
        unsigned int wfcount;
        unsigned char wfbuf[4];       
}RD_FLASH;


unsigned char rdbuf[4096],wbuf[4096];
#define TEST_FLASH_ADDR        0x6A6000
/********************************************main function**************************************
**************************************************************************************
********************************************************************************************/
int main()
{
        unsigned int i;
        unsigned char rbuf[2]="  ";
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
        BSP_Init();       
        STM_EVAL_LEDOff(LED3);
        printf("\r\n Test flash start... \r\n" );

        SPI_FLASH_BufferRead(rdbuf,TEST_FLASH_ADDR, 4096);
        if((rdbuf[0] == 0xff)&&(rdbuf[1] == 0xff)
                &&(rdbuf[2] == 0xff)&&(rdbuf[3] == 0xff)){
                        RD_FLASH.wfcount = 0;
                        memcpy(wbuf, RD_FLASH.wfbuf, 4);
                        SPI_FLASH_SectorErase(TEST_FLASH_ADDR);
                        SPI_FLASH_BufferWrite(wbuf, TEST_FLASH_ADDR, 4096);
                        SPI_FLASH_BufferRead(rdbuf, TEST_FLASH_ADDR, 4096);
                        if(memcmp(wbuf,rdbuf,4096)==0){
                                RD_FLASH.wfcount ++;
                                printf("\r\n%d", RD_FLASH.wfcount );
                        }else
                                printf("\r\n write flash error! " );
        }else{
                memcpy(RD_FLASH.wfbuf, rdbuf, 4);
                while(1){
                        RD_FLASH.wfcount ++;
                        memcpy(wbuf, RD_FLASH.wfbuf, 4);
                        SPI_FLASH_SectorErase(TEST_FLASH_ADDR);
                        SPI_FLASH_BufferWrite(wbuf, TEST_FLASH_ADDR, 4096);
                        SPI_FLASH_BufferRead(rdbuf,TEST_FLASH_ADDR, 4096);
                        if(memcmp(wbuf,rdbuf,4096)==0){
                                printf("\r\n%d", RD_FLASH.wfcount );
                        }else{
                                printf("\r\n write flash error! " );
                                break;
                        }       
                        if(STM_EVAL_KeyGetState(Key1) == 0){        //有按键按下就退出测试
                                printf("\r\n write flash break! " );
                                break;
                        }
                }               
        }

        printf("\r\n Test flash flish... \r\n" );
       
        STM_EVAL_LEDOn(LED3);
        while(1)
        {
               
        }
}

相关帖子

沙发
tuzihog| | 2014-8-16 08:19 | 只看该作者
本来计划写个简单的算法,每个扇区擦写个五万次后就写入个故障标志再换个扇区继续...
楼主感觉FLASH中的嵌入式文件系统怎么样?手头上有个项目,也是担心读写寿命。想加个轻型文件系统(非LINUX下的文件系统),不知道楼主有这些的资料提供不?

使用特权

评论回复
板凳
lyjian| | 2014-8-16 08:51 | 只看该作者
规格书上的100,000次可是最小次数,不是最大。

使用特权

评论回复
地板
qq65411253| | 2014-8-16 12:18 | 只看该作者
这个次数不是说超过后立马歇菜,而是说数据保存时间不保证能达到手册注明的下限。

使用特权

评论回复
5
vavsz003| | 2014-8-16 14:26 | 只看该作者

规格书上的100,000次可是最小次数,不是最大。    楼主是高人。···如此搞法。

使用特权

评论回复
6
shell.albert| | 2014-8-16 17:53 | 只看该作者
这样测试未必不可,我的一块老PC机上机械硬件都20年了,现在依然工作正常。做何解释?

使用特权

评论回复
7
lyjian| | 2014-8-16 18:34 | 只看该作者
这有关系吗?

使用特权

评论回复
8
chen_jhhb| | 2014-8-16 19:54 | 只看该作者
手册规定的是最低要求,一般都会有一定的余量,还和环境有关,如电压的稳定度,有没有干扰,温度多少,把他加到70~85度下,看看寿命会不会减少

使用特权

评论回复
9
xxlin1984| | 2014-8-18 09:34 | 只看该作者
Flash写坏了后并不是不能写,而是断电后不能保存或保存能力变差(时间、温度)

使用特权

评论回复
10
mei326|  楼主 | 2014-8-19 12:26 | 只看该作者
tuzihog 发表于 2014-8-16 08:19
本来计划写个简单的算法,每个扇区擦写个五万次后就写入个故障标志再换个扇区继续...
楼主感觉FLASH中的嵌 ...

文件系统并不带均衡算法,如fatfs.还是需要自己写均衡算法的

使用特权

评论回复
11
落叶行健ywm| | 2015-6-4 09:01 | 只看该作者
俺现在也在考虑spiflash的擦写次数问题呢。一直要记录数据就得擦写flash,由于经常掉电又不能保存在ram中后统一写入,蛋疼中。

使用特权

评论回复
12
幸福至上| | 2015-6-4 10:22 | 只看该作者
一般芯片手册上给出的次数是最保守的,超过此之后,芯片厂商就不保证一定能用,但可能能用。人家也是做过测试的。楼主需求的空间大不,不然可以考虑下FRAM存储芯片,就是贵了点~~~

使用特权

评论回复
13
dqgcs123| | 2015-6-4 10:58 | 只看该作者
像这种参数不可能是最大值,肯定是最小值
一般电子元器件的技术规格书里面都有最大电气参数值,以前有个领导老想让我测试这些参数究竟能达到多大,我就特别无语

使用特权

评论回复
14
大道至简| | 2015-6-4 19:54 | 只看该作者
疑似广告贴。。。。。。。。。。。。。。。。。。。。。。。。

使用特权

评论回复
15
TYZZD| | 2016-11-3 00:19 | 只看该作者
假如一页256个字节,我要经常写数据。那可不可以一下做法呢:
定义一个8位的数组,数组256个元素,初始值都赋值为0xFF,
要保存第一个8位数据data0,就把数组第一个元素赋值为data0,然后写入flash,后面的全是0XFF,写入后也不变
要保存第二个8位数据data1,就把数组第二个元素赋值为data1,然后写入flash,第一个数和开始一样的,再次写不会改变。
以后的以次类推,这样就不怕掉电了。如果等吧数据线保存在数组里一次写入,突然掉电数据就会丢失。
不知道这样可行不。如果可行,只有最开始执行一次擦除,然后写256次,那flash算擦写一次还是256次?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:与其等待机会,不如主动出击...

117

主题

764

帖子

2

粉丝