OpenEdv-开源电子网

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

mini板中W25X16芯片操作程序中循环写入位置的一个小疑点

[复制链接]

21

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2014-3-12
在线时间
3 小时
发表于 2015-3-8 22:05:39 | 显示全部楼层 |阅读模式
5金钱

你好,原子。。


在分析迷你板  W25X16  的程序,其中看到FLASH写入函数这里   SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)

整段程序如下



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);//写入整个扇区
       

  }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;   //?????????????????ê??
  } 
 };   



 其中     SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区

这里   我觉得不妥,在检测到当前扇区有不等于0xff的字节内容时,删除扇区后随后这个函数就是在所删除的扇区的第0个字节开始写了4096个字节

如果说  NumByteToWrite>secremain    甚至NumByteToWrite>4096   那么前面已经写了一个扇区的字节了,在第二次循环写入前,后面数组 pBuffer应该偏移增加4096个字节  而不是程序中的pBuffer+=secremaim   应该写成 pBuffer+=4096 


或者还有个方法就是把之前的函数    SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区

                                         改成    SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//即使这个扇区被擦除了,也不要从这个扇区的头个字节开始写,还是从这个扇区被锁定的Writeaddr字节处开始写入剩余的secremain    这样就符合后面一个语句  pBuffer+=secremaim   


个人感觉这样是合理的,由于测试程序写入的字节数都很少,pBufferNumByteToWrite<=最初的secremain  所以不会牵扯到第二轮循环写入,程序测试中看不出什么问题。

否则第一轮写入部分pBuffer数组内容后,将会有偏移位置错误,导致第二轮循环中起始写入位置不对


原子老师不知是不是这里要修改下,这是我的理解。。

最佳答案

查看完整内容[请看2#楼]

我们的测试程序,不是很小的写入哦? 整个字库,大的2M多,小的也有几百K,都是安然无恙的呢. 所以,你的猜想不对,你可以自己验证下,根据你的猜想写代码测试.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-8 22:05:40 | 显示全部楼层
我们的测试程序,不是很小的写入哦?
整个字库,大的2M多,小的也有几百K,都是安然无恙的呢.
所以,你的猜想不对,你可以自己验证下,根据你的猜想写代码测试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-3-9 08:08:33 | 显示全部楼层
楼主可以写入和读取大点的数据量看下,当初我的理解和你也是一样,自己写代码验证,小数据量可以,大于4096就不稳定了,有时候成功,有时候失败,写入后读取的数据对不上
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

21

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2014-3-12
在线时间
3 小时
 楼主| 发表于 2015-3-9 22:44:50 | 显示全部楼层
回复【3楼】八度空间:
---------------------------------
恩,大于4096,有时成功,有时失败,其实我也是想就事论事,想了解这个过程,理解不明白的地方。

为什么在第一次写入循环中,如果需要删除有内容的扇区进入这个函数SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);  后

下面程序给出的含有数据的数组地址指针不是偏移4096,而是偏移secremain   初次循环写入时,secremain不太可能正好等于4096字节的,基本是小于的

所以第二次循环写入时很有可能在新的地址上重复之前写入过的一些数据字节。我实在没有充足的理由推翻自己认为这一节点上程序这样写是不合理的。但不管怎么

程序非常精密,非常有学习价值。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 12:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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