首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >w25q128fw外部spi闪存没有响应从stm32发出的命令

w25q128fw外部spi闪存没有响应从stm32发出的命令
EN

Stack Overflow用户
提问于 2018-04-24 14:16:06
回答 1查看 1.4K关注 0票数 0

我正在使用一个名为W25Q128FW的外部闪存,它来自with绑定和一个STM32L4微控制器,我试图让它们通过SPI总线进行通信。

我的问题是,对于我的请求,我没有得到w25q的响应。例如,当我发送"get_id“协议时,它应该返回ID (就像数据表中所说的那样),但是闪存的DO引脚上没有任何信息(因此没有响应)。

我使用STM32CubeMX来设置引脚(GPIO ),下面是它们的配置:

SPI引脚

代码语言:javascript
复制
 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端口

代码语言:javascript
复制
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”来重置设计。

代码语言:javascript
复制
  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“命令来读取devise,后面跟着2个虚拟字节和0x00 (如数据表中所述),然后我应该接收到制造商的2个字节,以及后面的ID。设计ID指令数据报

代码语言:javascript
复制
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引脚):

flash数据输入和输出

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

我可能忘记了启动闪存的一步,但我无法理解,因为我遵循数据表。我在网上找不到任何东西来帮助我,所以如果有人有解决这个问题的办法,请帮帮我,这里真的很欢迎你!谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-26 11:59:17

正如@old_timer建议的那样,我检查了保持针,实际上,它确实有一个问题。这个问题是持销的硬件问题,持位一直很低,我们无法控制它。现在,我们已经修复了硬件设置,我们可以把保持针高,闪存监听和响应输入命令。

感谢@old_timer的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50003970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档