我正在使用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);
请指导我覆盖特定地址的相同地址/擦除选项中的新数据
答案 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,然后将阵列写入该扇区中