Как стереть и перезаписать данные в Spi EEPROM

Я использую флеш-чип WinBond W25Q64JV SPI для хранения данных, а микроконтроллер — 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);

пожалуйста, помогите мне перезаписать новые данные в том же адресе / стереть параметр для определенного адреса


person Sathish    schedule 09.06.2019    source источник
comment
Если вам нужно перезаписать часть сектора, вы можете прочитать весь раздел в ОЗУ, стереть сектор, а затем перезаписать измененный сектор.   -  person kkrambo    schedule 09.06.2019


Ответы (2)


Из описания продукта

8.3 Стирание сектора (20 ч)

Команда Sector Erase устанавливает всю память в указанном секторе (4 Кбайта) в стертое состояние всех единиц (FFh).

Это флэш-память, а не eeprom, поэтому минимальный размер стираемого блока составляет 4 килобайта. Нет возможности стереть отдельные байты.

person followed Monica to Codidact    schedule 09.06.2019

W25Q64JV имеет 64 Мбит = 8 МБ, каждый сектор имеет размер 4 Кбайт, тогда у вас есть сектор 2000 или 0x7d0, поэтому максимальный адрес, который вы можете стереть, равен 0x7d0.

вы хотите стереть 0x1014 этот байт находится в секторе 2, тогда вы должны стереть сектор 0x2, но все остальные байты в этом секторе также стираются, вы можете скопировать сектор 2 в массив, затем стереть сектор 2 и после этого записать массив в этот сектор

person alireza.roozitalab    schedule 11.06.2019