使用SPI往flash内写数据,先把flash中原有的数据读出来,再与新数据一起写进去,偏移量有助于原数据和新数据区分开。
下方代码实现的是块写,先计算出一块减去偏移量的空间,之后在一块一块的写
void SpiWriteFlashData(uint32_t write_addr , void* pbuffer , uint16_t num_byte_to_write)
{
uint32_t u32BlockAddr; // 写flash起始地址
uint32_t u32offset; // 写flash块内偏移
uint32_t u32BytesWrited; // 已经写入的字节数
uint32_t u32CurrBytes; // 当前块写入的字节数
uint8_t *pInData = (uint8_t *)pbuffer;
u32BlockAddr = write_addr & 0xFFFFF000;
u32offset = write_addr & 0x0FFF;
u32BytesWrited = 0;
while (u32BytesWrited < num_byte_to_write)
{
//一块一块写,剩余不够一块的再写
// u32CurrBytes >= FLASH_SPI_FLASH_BLOCK_SIZE, FLASH_SPI_FLASH_BLOCK_SIZE;
u32CurrBytes = ((num_byte_to_write - u32BytesWrited) >= SPI_FLASH_BLOCK_SIZE) ? SPI_FLASH_BLOCK_SIZE : (num_byte_to_write - u32BytesWrited);
if ((u32offset + u32CurrBytes) > SPI_FLASH_BLOCK_SIZE)
u32CurrBytes = u32CurrBytes - ((u32offset + u32CurrBytes) % SPI_FLASH_BLOCK_SIZE);
// 1. 读flash块
SpiReadFlashData(u32BlockAddr, SpiFlashBuff, SPI_FLASH_BLOCK_SIZE);
// 2. 复制新数据至原先块内数据相应的偏移位置
memcpy(SpiFlashBuff + u32offset, pInData + u32BytesWrited, u32CurrBytes);
// 3. 擦除块
SPIFlashErase(u32BlockAddr);
// 4. 将数据写入
WriteBlockData(u32BlockAddr, SpiFlashBuff, SPI_FLASH_BLOCK_SIZE);
// 5. 进行下一块数据写入
u32BlockAddr += SPI_FLASH_BLOCK_SIZE;
u32BytesWrited += u32CurrBytes;
u32offset = 0;
}
}