新手上路
- 积分
- 45
- 金钱
- 45
- 注册时间
- 2014-4-29
- 在线时间
- 1 小时
|
原子哥. 我按照战舰版的程序.
移植到W25Q128的项目上去. 然后做了个循环写的程序. 不停的写FLASH.然后地址自动+1.
从0写到0X0FFF的时候.不会有问题.
当我持续写入到地址0x1000的时候. 应该只擦除一次就OK.
但是通过打印.我发现每次调用SPI_Flash_Write的时候都会跑进去擦出.
u8 TEST_NUM=0;
u32 FLASH_WriteAddress=0x000000;
SPI_Flash_Write(&TEST_NUM,FLASH_WriteAddress++,1);
TEST_NUM++; //这2条语句在主循环里执行
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);//写入整个扇区
Flash_Erase_Cont++; // 这里是我自己加的打印.目的是看擦除次数
printf("Erase_Cont IS:%x\r\n",Flash_Erase_Cont);
}
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; //下一个扇区可以写完了
}
};
}
|
|