中文手册
https://blog.csdn.net/cdsmakc/article/details/88177467
流程图
u8 W25QXX_BUFFER[4096];
void W25QXX_Write(u8 *pBuffer, u32 WriteAddr, u16 len)
{
uint32_t write_len = len;
uint32_t section = 0;
uint32_t offset = 0;
uint32_t remain = 0;
uint8_t erase = 0;
while (write_len > 0)
{
erase = 0;
section = WriteAddr / 4096;
offset = WriteAddr % 4096;
remain = 4096 - offset;
if (len > remain)
{
write_len = remain;
}
else
{
write_len = len;
}
W25QXX_Read(W25QXX_BUFFER, section * 4096, 4096); //读出整个扇区的内容
for (uint32_t i = 0; i < 4096; i++)
{
if (W25QXX_BUFFER[i] != 0xff)
{
erase = 1;
break;
}
}
if (erase)
{
W25QXX_Erase_Sector(section); //擦除这个扇区
for (uint32_t j = 0; j < write_len; j++)
{
W25QXX_BUFFER[offset + j] = pBuffer[j];
}
W25QXX_Write_NoCheck(W25QXX_BUFFER, section * 4096, 4096);
}
else
{
W25QXX_Write_NoCheck(pBuffer, WriteAddr, write_len);
}
len -= write_len;
pBuffer += write_len;
WriteAddr += write_len;
}
}