Неожиданное поведение при использовании STM32 QSPI поверх HAL

#c #arm #embedded #stm32 #hal

#c #arm #встроенный #stm32 #hal

Вопрос:

Я использую интерфейс QSPI (или dual-SPI) STM32L452 для создания инструкций для драйвера светодиода с использованием HAL. Мне удалось заставить его работать, но я должен установить довольно абсурдные параметры конфигурации для команды, чтобы заставить ее работать.

Вот мой код инициализации:

   hqspi.Instance = QUADSPI;
  hqspi.Init.ClockPrescaler = 31;
  hqspi.Init.FifoThreshold = 1;
  hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;
  hqspi.Init.FlashSize = 31;
  hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
  hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
  hqspi.Init.FlashID = QSPI_FLASH_ID_1;
  hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
  HAL_QSPI_Init(amp;hqspi);
 

Вот код, который я использую для настройки команды

   qspiCommand.InstructionMode = QSPI_INSTRUCTION_NONE;
  qspiCommand.AddressMode = QSPI_ADDRESS_NONE;
  qspiCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  qspiCommand.DataMode = QSPI_DATA_2_LINES;
  qspiCommand.DummyCycles = 0;
  qspiCommand.NbData = 81;
  qspiCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
  qspiCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; // I have to set this
  qspiCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; // I have to set this
 

Затем я отправляю его с помощью HAL_QSPI_Command and HAL_QSPI_Transmit .

Вот результат, который я ожидаю и которого я могу достичь, используя приведенный выше код:

корректный вывод

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

Странно то, что я должен установить

 qspiCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
 

(который не должен иметь эффекта, когда DdrMode отключен)

и

 qspiCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
 

(что не должно иметь эффекта, если InstructionMode значение равно none).

Если я не установлю их оба, произойдут странные вещи. Это результат, если я удалю DdrHoldHalfCycle параметр:

неверный вывод

Имейте в виду, что это непрерывный сигнал, который запускается и не останавливается после того, как я вызвал функцию передачи.

Чего мне здесь не хватает? Мне действительно не нужны эти параметры, чтобы заставить его работать.

Ответ №1:

Это смущает.

qspiCommand должно быть статичным.