OpenEdv-开源电子网

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

请教关于W25Q128的写入问题?

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-5-19
在线时间
0 小时
发表于 2018-5-19 21:31:23 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 猫的天空之城 于 2018-5-20 08:15 编辑

如果要写入的数据量很大(4096的好几倍)且每个扇区都要擦除,那么红色部分secremain将多次为4096,pBuffer将在每个扇区中重复写入pBuffer[0]到第pBuffer[4095],是这样理解吗?是否改成W25QXX_BUF[i+secoff]=*pBuffer; pBuffer++;好一点呢?
while(1)
{
  W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容
  for(i=0;i<secremain;i++)//校验数据
  {
   if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除     
  }
  if(i<secremain)//需要擦除
  {
   W25QXX_Erase_Sector(secpos);  //擦除这个扇区
   for(i=0;i<secremain;i++)      //复制
   {
    W25QXX_BUF[i+secoff]=pBuffer;   
   }
   W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//写入整个扇区  
  }else W25QXX_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劲爆上市
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2018-5-19 23:08:36 | 显示全部楼层
你确定你没抄漏掉???不应该是W25QXX_BUF[i+secoff]=pBuffer; ?????
你那样写肯定是错误的,会导致pBuffer指针改变,后边还会用到的。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-5-19
在线时间
0 小时
 楼主| 发表于 2018-5-20 08:17:37 | 显示全部楼层
miaoguoqiang 发表于 2018-5-19 23:08
你确定你没抄漏掉???不应该是W25QXX_BUF=pBuffer; ?????
你那样写肯定是错误的,会导致pBuffer指针改变 ...

不好意思,复制的时候不知怎么漏掉了,应该是
W25QXX_BUF[i+secoff]=pBuffer;但这样也只能取到pBuffer的前4096个数据啊,后面的能取到吗?
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2018-5-20 18:13:20 | 显示全部楼层
本帖最后由 miaoguoqiang 于 2018-5-20 18:15 编辑
猫的天空之城 发表于 2018-5-20 08:17
不好意思,复制的时候不知怎么漏掉了,应该是
W25QXX_BUF=pBuffer;但这样也只能取到pBuffer的前4096个数 ...

一个扇区最大4096.写不完切换到下一个扇区。
pBuffer在切换扇区的时候地址就已经偏移了的,不存在不能访问。pBuffer+=secremain;      //指针偏移

回复

使用道具 举报

10

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2017-5-16
在线时间
64 小时
发表于 2018-5-20 20:21:16 | 显示全部楼层
楼上正解
回复

使用道具 举报

0

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2016-6-23
在线时间
66 小时
发表于 2020-12-25 15:53:07 | 显示全部楼层
for(i=0;i<secremain;i++)      //复制
   {
    W25QXX_BUF[i+secoff]=pBuffer[i];   
   }
你们调过吗? 我这里只有pBuffer[0]后面的就没有了。那里有问题呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 12:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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