这样的话没有保留之前的数据啊
时间: 2024-04-14 16:28:06 浏览: 18
对不起,我忽略了你需要保留之前的数据的要求。为了实现这一点,你可以在写入前先读取当前扇区的数据,然后将新数据与旧数据合并后写入。下面是修改后的代码示例:
```c
#include <stdint.h>
#include <string.h>
#define SECTOR_SIZE 4096
#define EEPROM_SIZE 16384
// 读取数据
void spi_flash_buffer_read(uint8_t* pbuffer, uint32_t read_addr, uint16_t num_byte_to_read) {
// 实现 flash 读取逻辑
}
// 擦除扇区
uint8_t eraseFlashOneSector(uint32_t sectorNum) {
// 实现扇区擦除逻辑
}
// 写入数据
void spi_flash_buffer_write(uint8_t* pbuffer, uint32_t write_addr, uint16_t num_byte_to_write) {
// 实现 flash 写入逻辑
}
// EEPROM 写入 n 个字节
uint8_t EEPROM_Write_NBytes(uint16_t Addr, uint8_t *Write_Buff, uint16_t len) {
uint8_t sectorNum = Addr / SECTOR_SIZE; // 计算扇区号
uint16_t offset = Addr % SECTOR_SIZE; // 计算偏移量
uint8_t tempBuffer[SECTOR_SIZE]; // 临时缓冲区,用于存储当前扇区的数据
// 读取当前扇区的数据
spi_flash_buffer_read(tempBuffer, sectorNum * SECTOR_SIZE, SECTOR_SIZE);
// 将新数据与旧数据合并
memcpy(&tempBuffer[offset], Write_Buff, len);
// 判断写入数据是否跨越多个扇区
if (offset + len > SECTOR_SIZE) {
// 需要跨越多个扇区,进行扇区翻页操作
uint16_t remainingBytes = len; // 剩余待写入字节数
uint8_t* dataPtr = tempBuffer; // 待写入数据的指针
while (remainingBytes > 0) {
// 擦除当前扇区
if (eraseFlashOneSector(sectorNum) != 0) {
return 0; // 擦除失败
}
// 计算本次写入的字节数
uint16_t writeBytes = SECTOR_SIZE - offset;
if (writeBytes > remainingBytes) {
writeBytes = remainingBytes;
}
// 写入数据
spi_flash_buffer_write(dataPtr, sectorNum * SECTOR_SIZE + offset, writeBytes);
dataPtr += writeBytes; // 更新数据指针
remainingBytes -= writeBytes; // 更新剩余字节数
sectorNum++; // 更新扇区号
offset = 0; // 设置偏移量为 0,因为已经跳到下一个扇区的起始位置
}
}
else {
// 数据不跨越扇区,直接写入即可
spi_flash_buffer_write(tempBuffer, sectorNum * SECTOR_SIZE, SECTOR_SIZE);
}
return 1; // 写入成功
}
int main() {
// 示例用法
uint8_t eepromData[EEPROM_SIZE]; // 模拟 EEPROM 数据
// 读取之前的数据
spi_flash_buffer_read(eepromData, 0, EEPROM_SIZE);
// 写入数据到 EEPROM
uint8_t writeData[] = {0x01, 0x02, 0x03};
EEPROM_Write_NBytes(0, writeData, sizeof(writeData));
// 从 EEPROM 读取数据
uint8_t readData[3];
spi_flash_buffer_read(readData, 0, sizeof(readData));
return 0;
}
```
通过使用临时缓冲区,我们可以在写入之前先读取当前扇区的数据,并将新数据与旧数据合并后写入 Flash。这样就可以保留之前的数据,并在需要时进行更新。请注意,示例代码中的合并方式是简单地使用 `memcpy` 函数,你可以根据实际需求进行修改。