如何擦除和覆盖 Spi EEPROM 中的数据

How To Erase and Overwrite Data in Spi EEPROM

我正在使用WinBond W25Q64JV SPI Flash 芯片存储数据,微控制器是STM32F101RCT6。当我尝试将数据存储在 Winbond 芯片中时,它工作正常,我可以在 winbond 芯片中读取和写入数据,但是如果我想覆盖同一地址中的新数据,它不会被覆盖,它会提供旧数据新数据是否未写入相同 memory.If 我使用擦除选项它擦除所有地址位置中的所有数据我无法擦除特定地址数据。擦除所有地址数据后,我可以写入新数据,但我丢失了所有其他位置的数据,因此请指导我覆盖同一地址位置中的新数据/特定地址的擦除选项我的代码如下

     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
     HAL_Delay(1000);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
     Spi_data[0]=0x06;  //Write Enable
     HAL_SPI_Transmit(&hspi2,Spi_data,1,1000);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET); 
     Spi_data[0]=0x02; //Page Program
     Spi_data[1]=0x00;
     Spi_data[2]=0x10;
     Spi_data[3]=0x14;
     Spi_data[4]=0x43;
     HAL_SPI_Transmit(&hspi2,Spi_data,5,10000);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);

     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
     Spi_data[0]=0x03;//Read Data
     Spi_data[1]=0x00;
     Spi_data[2]=0x10;
     Spi_data[3]=0x14;
     HAL_SPI_Transmit(&hspi2,Spi_data,4,100);
     HAL_SPI_Receive(&hspi2,GSdata,4,100);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);

当我尝试覆盖 0x1014 位置的新数据时,如果我使用以下擦除选项,它不会被覆盖,它是擦除所有内存地址数据

   HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
   Spi_data[0]=0x20;//Erase
   Spi_data[1]=0x00;
   Spi_data[2]=0x10;
   Spi_data[3]=0x14;
   HAL_SPI_Transmit(&hspi2,Spi_data,4,1000);
   HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);

请指导我在特定地址的相同 address/Erase 选项中覆盖新数据

来自产品数据表

8.3 Sector Erase (20h)

The Sector Erase instruction sets all memory within a specified sector (4K-bytes) to the erased state of all 1s (FFh).

这是闪存,而不是 eeprom,因此有最小擦除块大小,即 4 KB。无法擦除单个字节。

W25Q64JV 有 64 兆位 = 8 兆字节 每个扇区有 4 KB 大小,那么你有 2000 个扇区或 0x7d0 所以你可以擦除的最大地址是 0x7d0

你想擦除 0x1014 这个字节在扇区 2 那么你应该擦除扇区 0x2 但这个扇区中的所有其他字节也擦除 您可以复制数组中的扇区 2,然后擦除扇区 2,然后将数组写入该扇区