SPI写数据

使用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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值