OpenEdv-开源电子网

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

关于W25Q64的存储问题

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-4-29
在线时间
1 小时
发表于 2014-4-30 18:04:14 | 显示全部楼层 |阅读模式
原子哥. 我按照战舰版的程序. 

移植到W25Q128的项目上去. 然后做了个循环写的程序. 不停的写FLASH.然后地址自动+1.

从0写到0X0FFF的时候.不会有问题.

当我持续写入到地址0x1000的时候. 应该只擦除一次就OK.

但是通过打印.我发现每次调用SPI_Flash_Write的时候都会跑进去擦出.


u8 TEST_NUM=0;
u32 FLASH_WriteAddress=0x000000;
SPI_Flash_Write(&TEST_NUM,FLASH_WriteAddress++,1);  
TEST_NUM++;  //这2条语句在主循环里执行

void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   

u32 secpos;
u16 secoff;
u16 secremain;   
  u16 i;    

secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小   

if(NumByteToWrite<=secremain)
secremain=NumByteToWrite;//不大于4096个字节
while(1) 
{
SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除    
}
if(i<secremain)//需要擦除
{
SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
for(i=0;i<secremain;i++)   //复制
{
SPI_FLASH_BUF[i+secoff]=pBuffer;  
}
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  
Flash_Erase_Cont++;                        // 这里是我自己加的打印.目的是看擦除次数
printf("Erase_Cont IS:%x\r\n",Flash_Erase_Cont);
}
else 
SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.   
if(NumByteToWrite==secremain)
break;//写入结束了
else//写入未结束
{
secpos++;//扇区地址增1
secoff=0;//偏移位置为0  

  pBuffer+=secremain;  //指针偏移
WriteAddr+=secremain;//写地址偏移   
  NumByteToWrite-=secremain; //字节数递减
if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
else secremain=NumByteToWrite; //下一个扇区可以写完了
}  
};  
}

 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-30 20:56:33 | 显示全部楼层
你要写入的扇区如果数据不是1的话程序就会调用擦除操作函数
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-4-29
在线时间
1 小时
 楼主| 发表于 2014-5-4 10:50:59 | 显示全部楼层
回复【2楼】Badu_Space:
你要写入的扇区如果数据不是1的话程序就会调用擦除操作函数
---------------------------------
这个我知道.  但是擦除数函数调用一次不就OK了吗.  

我现在的问题是每次都在擦除
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-5-4 11:01:42 | 显示全部楼层
回复【3楼】zf1127:
---------------------------------
说明你的扇区不是全1的。。。
因为我们的擦出改写后 ,又会将原本不需要改的内容,重新写回去。
最差的情况,就是整个扇区都是0X00,那么些2K字节,一次写1字节,那么就肯定要擦 2K次。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-4-29
在线时间
1 小时
 楼主| 发表于 2014-5-4 12:00:52 | 显示全部楼层
回复【4楼】正点原子:
回复【3楼】zf1127:
---------------------------------
说明你的扇区不是全1的。。。
因为我们的擦出改写后 ,又会将原本不需要改的内容,重新写回去。
最差的情况,就是整个扇区都是0X00,那么些2K字节,一次写1字节,那么就肯定要擦 2K次。
---------------------------------

哦. 原来是有个还原功能啊.  

就是这个语句在还原吧  SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区 


我就说呢. 每次写一个字节的时候. 都要擦除..

原子哥一解释. 豁然开朗.

3Q!!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-10 10:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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