C++ 使用HAL库的STM32外部闪存读取设备ID

C++ 使用HAL库的STM32外部闪存读取设备ID,c++,C++,我正在尝试使用QSPI接口与winbond外部闪存接口:。我正在发送读取设备ID命令,我希望看到类似的内容: 我已连接逻辑分析仪,我可以看到我正在发送所需的命令,但在D1行上没有得到任何答案: 我正在尝试的代码 void QSPI_read_ID(QSPI_HandleTypeDef *hqspi){ QSPI_CommandTypeDef sCommand; uint32_t tmp; int len; /* READ ID -----

我正在尝试使用QSPI接口与winbond外部闪存接口:。我正在发送读取设备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并应用接收功能

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

是的,这很有效!我没有意识到我必须调用receive函数来获取字节(现在完全有意义了)。谢谢

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

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


}