FLASH secpos++;//扇区地址增1

2019-08-14 05:33发布

 原子大哥,刚学习到FLASH的读写这一章,有个问题,看了两天也没有看明白,如下:
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)  
{
 u32 secpos;
 u16 secoff;
 u16 secremain;   
  u16 i;   
 u8 * SPI_FLASH_BUF;  
    SPI_FLASH_BUF=SPI_FLASH_BUFFER;     
  secpos=WriteAddr/4096;//扇区地址 
 secoff=WriteAddr%4096;//在扇区内的偏移
 secremain=4096-secoff;//扇区剩余空间大小  
  //printf("ad:%X,nb:%X ",WriteAddr,NumByteToWrite);//测试用
  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      
//上面这句话,是说扇区地址加1,我还是没有理解,按照我的理解,应该是加4096,比如secpos为扇区的首地址(比如:XX0000H),那么当这个扇区写完后,应该是跳转到写下一个扇区,W25Q64上是XX1000H,加1怎么实现的?还是我把这个概念搞混淆了?恳请原子大哥给指导指导,先谢谢原子大哥!

   secoff=0;//偏移位置为0         pBuffer+=secremain;  //指针偏移
   WriteAddr+=secremain;//写地址偏移   
      NumByteToWrite-=secremain;    //字节数递减
   if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
   else secremain=NumByteToWrite;   //下一个扇区可以写完了
  } 
 }; 
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。