在 HAL 上使用 STM32 QSPI 的意外行为
Unexpected behaviour with using STM32 QSPI over HAL
我正在使用 STM32L452 的 QSPI(或双 SPI)接口为使用 HAL 的 LED 驱动器创建指令。我设法让它工作,但我必须为命令设置相当荒谬的配置选项才能使其工作。
这是我的初始化代码:
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(&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
和 HAL_QSPI_Transmit
发送它。
这是我期望的输出,我可以使用上面的代码实现:
请注意,这是一次一次性传输,只有在我调用上面两个函数时才会输出。
奇怪的是我必须设置
qspiCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
(禁用 DdrMode
时应该不会产生影响)
和
qspiCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
(当 InstructionMode
为 none 时不应有影响)。
如果我不设置它们,就会发生奇怪的事情。如果我删除 DdrHoldHalfCycle
参数,这是输出:
请注意,这是一个连续信号,它在我调用传输函数后开始并且不会停止。
我在这里错过了什么?我真的不需要那些参数来让它工作。
这很尴尬。
qspiCommand
需要是静态的。
我正在使用 STM32L452 的 QSPI(或双 SPI)接口为使用 HAL 的 LED 驱动器创建指令。我设法让它工作,但我必须为命令设置相当荒谬的配置选项才能使其工作。
这是我的初始化代码:
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(&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
和 HAL_QSPI_Transmit
发送它。
这是我期望的输出,我可以使用上面的代码实现:
请注意,这是一次一次性传输,只有在我调用上面两个函数时才会输出。
奇怪的是我必须设置
qspiCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
(禁用 DdrMode
时应该不会产生影响)
和
qspiCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
(当 InstructionMode
为 none 时不应有影响)。
如果我不设置它们,就会发生奇怪的事情。如果我删除 DdrHoldHalfCycle
参数,这是输出:
请注意,这是一个连续信号,它在我调用传输函数后开始并且不会停止。
我在这里错过了什么?我真的不需要那些参数来让它工作。
这很尴尬。
qspiCommand
需要是静态的。