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

时间:2019-06-09 06:05:25

标签: microcontroller stm32 spi flash-memory eeprom

我正在使用WinBond W25Q64JV SPI Flash芯片来存储数据,微控制器是STM32F101RCT6。当我尝试将数据存储在Winbond芯片中时,它可以正常工作,我可以在Winbond芯片中读取和写入数据,但是如果我想覆盖同一地址中的新数据,则不会覆盖它,而是给出了旧数据。是新数据未写入同一内​​存。如果我使用擦除选项,则是擦除所有地址位置中的所有数据,我无法擦除特定的地址数据。删除所有地址数据后,我可以写入新数据,但是我丢失了所有其他位置的数据,因此请指导我在同一地址位置/新地址下面的特定地址的“擦除”选项中覆盖新数据

     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);

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

2 个答案:

答案 0 :(得分:4)

从产品数据表中

  

8.3扇区擦除(20小时)

     

扇区擦除指令将指定扇区(4K字节)内的所有内存设置为全1的擦除状态   (FFh)。

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

答案 1 :(得分:0)

W25Q64JV具有64兆位= 8兆字节 每个扇区的大小为4 KB,则您有2000个扇区或0x7d0 因此您可以擦除的最大地址为0x7d0

您要擦除0x1014,此字节位于扇区2上 那么您应该擦除扇区0x2,但该扇区中的所有其他字节也要擦除 您可以复制阵列中的扇区2,然后擦除扇区2,然后将阵列写入该扇区中