繁体   English   中英

STM32外部flash使用HAL库读取设备ID

[英]STM32 External flash reading device ID using HAL libraries

I am trying to interface with winbond external flash memory using QSPI interface: https://www.winbond.com/resource-files/w25m02gv%20revb%20070115.pdf . 我正在发送读取设备 ID 命令,我希望看到类似的内容:读取设备 ID 波形

我已连接逻辑分析仪,我可以看到我正在发送所需的命令,但在 D1 行上没有得到任何答案:在此处输入图像描述

我正在尝试的代码

void QSPI_read_ID(QSPI_HandleTypeDef *hqspi){
  QSPI_CommandTypeDef     sCommand;
    uint32_t    tmp;
    int         len;

  /* READ ID ------------------------------------------ */
  sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  sCommand.Instruction       = JEDEC_ID_CMD;
  sCommand.AddressMode       = QSPI_ADDRESS_NONE;
  sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  sCommand.DataMode          = QSPI_DATA_NONE;
  sCommand.DummyCycles       = 8;
  sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
  sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;







  if (HAL_QSPI_Command(hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  {
    QSPI_Flash_Error_Handler(hqspi); 
  }

如果我将虚拟周期数从 8 更改为 24,我可以读取设备 ID 的前 2 个字节:在此处输入图像描述

我不确定我是否没有正确理解这一点。 我的印象是,如果我发送读取设备 ID 命令,我应该调用 D1 行来自动向我发送 ID。 它不会让我使用超过 32 个虚拟循环的问题。

尝试将接收大小设置为 3 并应用接收 function

void QSPI_read_ID(QSPI_HandleTypeDef *hqspi){
  QSPI_CommandTypeDef     sCommand;
    uint8_t tmp[3];
    int         len;

  /* READ ID ------------------------------------------ */
  sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  sCommand.Instruction       = JEDEC_ID_CMD;
  sCommand.AddressMode       = QSPI_ADDRESS_NONE;
  sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  sCommand.DataMode          = QSPI_DATA_NONE;
  sCommand.DummyCycles       = 8;
  sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
  sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
  sCommand.NbData        = 3;

  if (HAL_QSPI_Command(hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  {
    QSPI_Flash_Error_Handler(hqspi); 
  }
  if (HAL_QSPI_Receive(hqspi, tmp , HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK){
    QSPI_Flash_Error_Handler(hqspi); 
  } 
}

是的,这行得通。 我没有意识到我必须调用接收 function 来获取字节(现在完全有意义)。 谢谢。

如果有人遇到同样的问题,请在此处编写代码:

void QSPI_read_ID(QSPI_HandleTypeDef *hqspi){
  QSPI_CommandTypeDef     sCommand;
 uint8_t reg[3]; // N25Q128A13EF840E 0xEF, 0xAB, 0x21

  /* READ ID ------------------------------------------ */
  sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  sCommand.Instruction       = JEDEC_ID_CMD;
  sCommand.AddressMode       = QSPI_ADDRESS_NONE;
  sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  //sCommand.DataMode          = QSPI_DATA_NONE;
  sCommand.DataMode = QSPI_DATA_1_LINE;
  sCommand.NbData = sizeof(reg);
  sCommand.DummyCycles       = 8;
  sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
  sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;


  if (HAL_QSPI_Command(hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  {
    QSPI_Flash_Error_Handler(hqspi); 
  }

 memset(reg, 0, sizeof(reg));


    if (HAL_QSPI_Receive(hqspi, &reg[0], HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    {
        puts('ERROR:HAL_QSPI_Receive');
        Error_Handler();
    }


  HAL_Delay(10);


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM