OpenEdv-开源电子网

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

MINI版SPI试验的一个问题。

[复制链接]

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-2-22
在线时间
1 小时
发表于 2014-6-17 09:37:17 | 显示全部楼层 |阅读模式
5金钱
 

原子哥:

你好

MINI版第17试验中程序

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

              }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;               //下一个扇区可以写完了

              }    

       };          

}

红色部分的疑惑。

根据if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除          

已经判断出偏移量后面的字节是否需要擦除。

那么              if(i<secremain)//需要擦除

我的理解是i<要写入的字节数时需要擦除。这个i含义是啥?为什么小于要写入的字节数时擦除。搞不明白。该处判断的依据是啥?

最佳答案

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

1、FLASH的特性,如果写入的扇区不是1的话就要擦除,否则就写入失败 2、if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除     这句就是判断一个扇区是否全部是1 3、举例FLASH一个扇区大小为4096,secremain的值是4096,当执行这句if(SPI_FLASH_BUF[secoff+i]!=0XFF),i的值加到了500就跳出了for循环。 4、if(i<secremain)//需要擦除   从这句来判断,i为500,secremain为4096,很明 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-6-17 09:37:18 | 显示全部楼层
1、FLASH的特性,如果写入的扇区不是1的话就要擦除,否则就写入失败
2、if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除     这句就是判断一个扇区是否全部是1
3、举例FLASH一个扇区大小为4096,secremain的值是4096,当执行这句if(SPI_FLASH_BUF[secoff+i]!=0XFF),i的值加到了500就跳出了for循环。
4、if(i<secremain)//需要擦除   从这句来判断,i为500,secremain为4096,很明显的说明1><secremain成立了,说明该扇区里面有数据,不是整个扇区都是1,结合第一点说明,所以执行擦除操作,再写入数据>
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-2-22
在线时间
1 小时
 楼主| 发表于 2014-6-17 13:58:55 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
您好!
是不是可以理解为i就是在这个扇区剩余空间内字节为0xff的总数。if(i<secremain)代表在这个扇区内剩余空间内字节为0xff的总数小于剩余扇区数时,代表有的字节不是0xff。
那么必须执行擦除程序。>
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-6-17 15:11:08 | 显示全部楼层
回复【3楼】百草堂:
---------------------------------
可以这么理解,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-2-22
在线时间
1 小时
 楼主| 发表于 2014-6-18 22:36:49 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------

您好,还是这个程序。我发现了一个问题。
 NumByteToWrite-=secremain;   
 if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完 

else secremain=NumByteToWrite;               //下一个扇区可以写完了 

              }     

       };           

}
我发现此处};括号后有引号。
通过简化这部分程序,发现有没有引号程序都能运行。不知道引号在括号后对程序有什么影响。我是才学习C的。查了资料也没找到。麻烦您讲解一下。谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-18 23:31:10 | 显示全部楼层
回复【5楼】百草堂:
---------------------------------
没有影响.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 07:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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