我正在使用华邦W25Q64JV SPI闪存芯片来存储数据和微控制器STM32F101RCT6。当我尝试将数据存储在华邦芯片中时,它工作正常,我可以在华邦芯片中读写数据,但如果我想覆盖同一地址中的新数据,它不会被覆盖,而是给出旧数据,即新数据不写入同一内存。如果我使用擦除选项,则擦除所有地址位置中的所有数据,我无法擦除特定地址数据。擦除所有地址数据后,我可以写入新数据,但我在所有其他位置丢失了数据,因此请指导我覆盖同一地址位置的新数据/特定地址的擦除选项,我的代码如下
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);
请指导我覆盖同一地址中的新数据/特定地址的擦除选项
来自产品数据表
8.3 扇区擦除 (20h)
扇区擦除指令将指定扇区内的所有内存(4K 字节)设置为所有 1 的擦除状态 (FFh)。
这是一个闪存,而不是EEPROM,因此有一个最小的擦除块大小,即4KB。无法擦除单个字节。
W25Q64JV 有 64 mbit = 8 MB。 每个扇区有 4 KB 大小,然后你有 2000 个扇区或0x7d0 因此,您可以擦除的最大地址是0x7d0
您要擦除此字节0x1014位于扇区 2 上 然后你应该擦除扇区0x2但这个扇区中的每隔一个字节也会擦除 您可以在阵列中复制扇区 2,然后擦除扇区 2,然后将阵列写入此扇区