首页 文章

w25q128fw外部spi flash没有响应从stm32发送的命令

提问于
浏览
0

我正在使用Winbound的外部闪存W25Q128FW和STM32L4微控制器,我试图让它们通过SPI总线进行通信 .

我的问题是,我的请求没有响应w25q . 例如,当我发送“get_id”协议时,它应该发回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(如数据表中所述)来读取设计ID,然后我应该接收制造商和ID之后的2个字节 . devise ID instruction datagram

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);

这是我在示波器上看到的(我在STM32上的MOSI和MISO引脚上使用了一个上拉电阻):
data input and output from flash

我们可以看到我有时钟和顺序(从stm32的MOSI引脚发送到闪存的DI引脚)但我们在DO(数据输出)引脚上看到,我们什么都没有,但时钟在这里 .

我可能忘记了闪存初始化的一个步骤但我无法理解,因为我按照数据表 . 我无法在网上找到任何帮助我的信息,所以如果有人能解决这个问题,请帮帮我,欢迎你来到这里!谢谢 .

1 回答

  • 0

    正如@old_timer建议的那样,我检查了HOLD引脚,事实上,确实存在问题 . 这个问题是HOLD引脚的硬件问题,保持很低,我们无法控制它 . 现在我们修复了硬件设置,我们可以将HOLD引脚置为高电平,闪存监听并响应输入命令 .

    感谢@old_timer的帮助 .

相关问题