w25q128fw Внешняя spi-флешка не отвечает на запросы, отправленные с stm32 - PullRequest
0 голосов
/ 24 апреля 2018

Я использую внешнюю флэш-память W25Q128FW от Winbound с микроконтроллером STM32L4 и пытаюсь заставить их взаимодействовать через шину SPI.

Моя проблема в том, что у меня нет ответа от w25q на мои запросы. Например, когда я отправляю протокол «get_id», предполагается, что он отправляет обратно идентификатор (как сказано в таблице данных), но у меня ничего нет на выводе DO флэш-памяти (поэтому ответа от него нет).

Я использовал STM32CubeMX для настройки контактов (GPIO и SPI), вот их конфигурация:

контакты SPI

 static void MX_SPI1_Init(void)
{

  /* SPI1 parameter configuration*/
  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_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //312.25 Kbit/s
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

И порты GPIO

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, SPI_HOLD_Pin|SPI_WP_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : FLASH_CS_Pin */
  GPIO_InitStruct.Pin = FLASH_CS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(FLASH_CS_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : SPI_HOLD_Pin SPI_WP_Pin */
  GPIO_InitStruct.Pin = SPI_HOLD_Pin|SPI_WP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

Затем я использую небольшую тестовую функцию в своей основной программе. Я начинаю с инициализации вспышки командами сброса "0x66", чтобы включить сброс, и "0x99", чтобы сбросить устройство.

  HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET); //chipselect
  BufferSendFlash[0]=0x66;    //reset enable order
  HAL_SPI_Transmit(&hspi1, BufferSendFlash, 1, 1000);
  HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET); //chip desselect
  HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET); //chipselect
  BufferSendFlash[0]=0x99;   //reset devise order
  HAL_SPI_Transmit(&hspi1, BufferSendFlash, 1, 1000);
  HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET); //chipdesselect

мое устройство должно быть инициализировано сейчас. Затем я пытаюсь прочитать идентификатор устройства, отправив команду «0x90», за которой следуют 2 фиктивных байта и 0x00 (как указано в таблице данных), и я должен получить 2 байта вместе с производителем и идентификатором сразу после. дейтаграмма инструкции ID устройства

HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
BufferSendFlash[0]=0x90;  //ask for ID instruction
BufferSendFlash[1]=0x00;  //dummy
BufferSendFlash[2]=0x00;  //dummy
BufferSendFlash[3]=0x00;  //end of address
HAL_SPI_Transmit(&hspi1, BufferSendFlash, 4, 1000);  //send the order
HAL_SPI_Receive(&hspi1,BufferReceiveFlash, 2, 1000);  //read the flash answer
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET);

Вот что я вижу на осциллографе (я использовал подтягивание на выводах MOSI и MISO на STM32):
ввод и вывод данных с флеш-памяти

мы можем видеть, что у меня есть часы и порядок (отправленный с вывода MOSI stm32 на вывод DI вспышки), но мы видим на выводе DO (вывод данных), у нас ничего нет, кроме часов здесь.

Я мог бы забыть шаг инициализации вспышки, но я не могу понять это, так как я следовал за таблицей данных. Я не могу найти что-либо в Интернете, чтобы помочь мне, поэтому, если у кого-то есть решение этой проблемы, пожалуйста, помогите мне, вы действительно здесь! спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Как предложил @old_timer, я проверил вывод HOLD, и действительно, с ним действительно была проблема. Проблема заключалась в аппаратной проблеме с выводом HOLD, удержание всегда было низким, и мы не смогли его контролировать. Теперь, когда мы исправили настройку оборудования, мы можем установить высокий уровень на выводе HOLD, а флэш-память прослушивать и отвечать на команды ввода.

Спасибо @old_timer за помощь.

...