STM32 Ошибка чтения из w25q32

hidemire

✩✩✩✩✩✩✩
31 Мар 2022
6
0
Доброго времени суток.
Столкнулся с проблемой при чтении данных из w25q32. Ниже, на скриншотах, видно саму запись строки "12345678" и попытку чтения инструкцией Fast Read (0Bh).
Перед записью делаю sector erase, по наблюдениям, команда отрабатывает верно. С инструкцией JEDEC ID (9Fh) также проблем нет.

В наличие есть 2 таких модуля, и все они работают не корректно, подозреваю проблема таки в коде.

1648740127350.png
1648739718404.png
1648739861568.png
main.c -> SPI1_Init():
static void SPI1_Init(void)
{
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
}
stm32f4xx_hal_msp.c -> HAL_SPI_MspInit():
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hspi->Instance==SPI1){
    __HAL_RCC_SPI1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**SPI1 GPIO Configuration
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,955
625
44
1) WP и HOLD подтянуты к VCC?
2) свой код записи/чтения используете или готовый?
 

hidemire

✩✩✩✩✩✩✩
31 Мар 2022
6
0
@Геннадий П, Конвертер не использую. 3v беру на плате discovery (stm32f407vg).
WP и HOLD подтянуты.
Для записи/чтения использую код отсюда, немного допилив.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,955
625
44
Конвертер не использую. 3v беру на плате discovery (stm32f407vg).
Про конвертер это я подумал, что через ардуину. :)

Попробуйте сначала со стандартными примерами, например первый попавшийся: STM32 - SPI флешка W25Qxx / STM32 / stD (istarik.ru)
Или другую библиотеку, например: GitHub - nimaltd/w25qxx: w25qxx SPI FLASH driver for stm32 HAL
 

hidemire

✩✩✩✩✩✩✩
31 Мар 2022
6
0
@Геннадий П, Первый линк, как раз она и есть :)
Со второй поведение не меняется.

Судя по анализатору, сама логика соответствует даташиту для обеих библиотек. Видимо 2 чипа из 2‑х оказались бракованные :(
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,955
625
44
@hidemire, Не исключено. Я обычно для подобных опытов беру заведомо рабочие элементы, чтобы не было сюрпризов.
Если есть программатор, например самый простой на CH341a, можно на нем проверить флешку.
 
  • Лойс +1
Реакции: hidemire

Геннадий П

★★★★★★✩
14 Апр 2021
1,955
625
44
И да, статус-регистры бы посмотреть у флешки, может там блок стоит.
 

hidemire

✩✩✩✩✩✩✩
31 Мар 2022
6
0
@Геннадий П, да, как оказалось включен Quad режим, при котором обычный SPI не работает.
Но появилась другая проблема :), он никак не хочет перезаписываться, при том что другие биты во 2м регистре перезаписываются нормально.
В даташите есть предупреждение типа:
WARNING: The QE bit should never be set to a 1 during standard SPI or Dual SPI operation if the /WP or /HOLD pins are tied directly to the power supply or ground.
И вот тут не совсем понятно, означает ли это что при подтянутом WP и HOLD бит QE нельзя перезаписывать?
1648827912488.png
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,955
625
44
@hidemire, У меня была подобная проблема, но с флешками GD25Q64, тоже никакие программаторы не хотели снимать бит QE чтобы снять лок и отформатировать ее. В итоге их осилил самый простой программатор на CH341a и NeoProgrammer. С флешками WinBond таких проблем ни разу не было.
Посмотри внимательно, может у тебя тоже флешка GD, китайцы их любят ставить.
Если можешь - считай ID флешки.