当我尝试使用使用所有四个数据线作为指令的 QuadSPI 命令进行轮询时,我无法使状态标志轮询模式正常工作。在这种模式下使用带有 4 行指令的命令时,它会正确轮询第一个命令,但第二个命令的时钟周期比预期少一个,然后片选再也不会变高。我试过让它与多个配置设置一起使用,但共同点似乎是导致问题的 4 行指令。
- QSPI_HandleTypeDef hqspi =
- {
- .Instance = QUADSPI,
- .Init.ClockPrescaler = 63,
- .Init.FifoThreshold = 1,
- .Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE,
- .Init.FlashSize = 1,
- .Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE,
- .Init.ClockMode = QSPI_CLOCK_MODE_0,
- .Init.FlashID = QSPI_FLASH_ID_1,
- .Init.DualFlash = QSPI_DUALFLASH_DISABLE,
- };
- QSPI_CommandTypeDef qspiCmd =
- {
- .Instruction = 0x05,
- .Address = 0x00000000,
- .AlternateBytes = 0x00000000,
- .AddressSize = QSPI_ADDRESS_24_BITS,
- .AlternateBytesSize = QSPI_ALTERNATE_BYTES_8_BITS,
- .DummyCycles = 0,
- .InstructionMode = QSPI_INSTRUCTION_4_LINES,
- .AddressMode = QSPI_ADDRESS_NONE,
- .AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE,
- .DataMode = QSPI_DATA_4_LINES,
- .NbData = 1,
- .DdrMode = QSPI_DDR_MODE_DISABLE,
- .DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY,
- .SIOOMode = QSPI_SIOO_INST_EVERY_CMD,
- };
- QSPI_AutoPollingTypeDef autoPollCfg =
- {
- .Match = 0x12345678, // Don't match, continue polling indefinitely
- .Mask = 0xFFFFFFFF,
- .Interval = 1,
- .StatusBytesSize = 1,
- .MatchMode = QSPI_MATCH_MODE_AND,
- .AutomaticStop = QSPI_AUTOMATIC_STOP_DISABLE,
- };
- HAL_QSPI_Init(&hqspi);
- HAL_QSPI_AutoPolling(&hqspi, &qspiCmd, &autoPollCfg, HAL_MAX_DELAY);
上面的代码产生以下输出:
(忽略正在读取的实际数据)
仅更改指令行数似乎会产生正确的轮询:
- .InstructionMode = QSPI_INSTRUCTION_1_LINE,
- .InstructionMode = QSPI_INSTRUCTION_2_LINES,