新手上路 
 
	- 积分
 - 49
 
        - 金钱
 - 49 
 
       - 注册时间
 - 2019-6-27
 
      - 在线时间
 - 17 小时
 
 
 
 | 
 
2金钱 
u32 FLASH_SIZE; 
FLASH_SIZE=128*1024*1024;        //FLASH 大小为2M字节 
这句源码是不是应该改成:FLASH_SIZE=16*1024*1024;        //FLASH 大小为16M字节 
而且W25Q128芯片上的24位地址,应该是字节地址吧,不应该是位地址吧; 
 
   W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);   //从倒数第100个地址处开始,写入SIZE长度的数据 
这句里面的FLASH_SIZE应该改成:FLASH_SIZE=16*1024*1024; 这种的字节地址吧 
 
 
 
 
就像这个函数的第二个入口参数的大小明确说了是24位的地址  而不是128*1024*1024的27位地址吧【如下】 
 
 
//写SPI FLASH   
//在指定地址开始写入指定长度的数据 
//该函数带擦除操作! 
//pBuffer:数据存储区 
//WriteAddr:开始写入的地址(24bit)       
//NumByteToWrite:要写入的字节数(最大65535)    
u8 W25QXX_BUFFER[4096];    
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)    
{  
 u32 secpos; 
 u16 secoff; 
 u16 secremain;     
  u16 i;     
 u8 * W25QXX_BUF;    
    W25QXX_BUF=W25QXX_BUFFER;       
  secpos=WriteAddr/4096;//扇区地址   
 secoff=WriteAddr%4096;//在扇区内的偏移 
 secremain=4096-secoff;//扇区剩余空间大小    
  //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用 
  if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节 
 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;  //下一个扇区可以写完了 
  }   
 };   
} 
 
 
 
 
 |   
 
 
 
 
 
 |