2025-12-05 7:08 AM
Hi,
I'm using OCTOSPI in Mode Quad SPI on a STM32H563ZIT6. I'm having issues when reading Serial Flash data with a 1-1-4 (6Bh) read, 1-1-4 (32h) write is working fine. Also 1-1-1 read and 1-1-2 read also work fine. The serial flash is IS25LP032D. I have verified QE=1 and DummyCycles = 8 before issuing the read command. The 1-1-4 read has more problems if data is FF FF FF versus 01 02 03. 1-1-1 and 1-1-2 reads have no problem. Here is the config (Cube MX) and 1-1-4 read function. I have the SPI bus running at 1MHz
hospi1.Instance = OCTOSPI1;
hospi1.Init.FifoThresholdByte = 1;
hospi1.Init.MemoryMode = HAL_XSPI_SINGLE_MEM;
hospi1.Init.MemoryType = HAL_XSPI_MEMTYPE_MICRON;
hospi1.Init.MemorySize = HAL_XSPI_SIZE_64MB;
hospi1.Init.ChipSelectHighTimeCycle = 1;
hospi1.Init.FreeRunningClock = HAL_XSPI_FREERUNCLK_DISABLE;
hospi1.Init.ClockMode = HAL_XSPI_CLOCK_MODE_0;
hospi1.Init.WrapSize = HAL_XSPI_WRAP_NOT_SUPPORTED;
hospi1.Init.ClockPrescaler = 249;
hospi1.Init.SampleShifting = HAL_XSPI_SAMPLE_SHIFT_HALFCYCLE;
hospi1.Init.DelayHoldQuarterCycle = HAL_XSPI_DHQC_DISABLE;
hospi1.Init.ChipSelectBoundary = HAL_XSPI_BONDARYOF_NONE;
hospi1.Init.DelayBlockBypass = HAL_XSPI_DELAY_BLOCK_BYPASS;
hospi1.Init.Refresh = 0;
int is25_read_114(uint32_t address, uint8_t *buffer, uint32_t length)
{
XSPI_RegularCmdTypeDef cmd = {0};
HAL_StatusTypeDef result;
// Require quad mode for 0x6B
if(quad_enable == QUAD_DISABLE)
return -1;
memset(&cmd, 0, sizeof(cmd));
// 1-1-4 Fast Read Quad Output (0x6B)
cmd.Instruction = 0x6B;
cmd.OperationType = HAL_XSPI_OPTYPE_COMMON_CFG;
cmd.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;
cmd.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;
// Address on 1 line (1-1-4)
cmd.AddressMode = HAL_XSPI_ADDRESS_1_LINE;
cmd.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;
cmd.Address = address;
// No mode/alternate bytes for 0x6B
cmd.AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE;
cmd.AlternateBytesWidth = 0;
cmd.AlternateBytes = 0;
// Data on 4 lines
cmd.DataMode = HAL_XSPI_DATA_4_LINES;
cmd.DataLength = length;
// ISSI Fast Read Dual Output uses 8 dummy clocks by default.
cmd.DummyCycles = 8;
cmd.IOSelect = HAL_XSPI_SELECT_IO_3_0;
result = HAL_XSPI_Command(hqspi, &cmd, HAL_XSPI_TIMEOUT_DEFAULT_VALUE);
if(result != HAL_OK)
{
return -2;
}
result = HAL_XSPI_Receive(hqspi, buffer, HAL_XSPI_TIMEOUT_DEFAULT_VALUE);
if(result != HAL_OK)
{
return -3;
}
return 0;
}Thanks,
-Mike