你好,原子。。
在分析迷你板 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数组内容后,将会有偏移位置错误,导致第二轮循环中起始写入位置不对
原子老师不知是不是这里要修改下,这是我的理解。。
|