//写SPI FLASH
//在指定地址开始写入指定长度的数据
//该函数带擦除操作!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)
u8 SPI_FLASH_BUF[4096];
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);//读出整个扇区的内容 这句话在读出整个扇区的内容时,整个扇区被写入0xff。既然扇区内容变成了0xff,为什么后面还是需要调用擦除函数呢?擦除也是将扇区全部 变成0xFF,作用的效果不是一样?擦除和写0xFF有什么区别?调用 SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096)之后,因为整个扇区已 经是0XFF了,是否不需后面的判断是否需要擦除的程序,而直接进行写数据?
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; //下一个扇区可以写完了
}
};
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
谢谢原子哥,我知道了。
一周热门 更多>