Как стереть и перезаписать данные в Spi EEPROM - PullRequest
1 голос
/ 09 июня 2019

Я использую микросхему 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 ]

4 голосов
/ 09 июня 2019

Из таблицы данных продукта

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

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

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

0 голосов
/ 11 июня 2019

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

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

...