QuadSPI Data Line Default State Issue
I am trying to operate two devices using QuadSPI in the STM32MP131 bare-metal environment. Currently, an external Flash is being used in QuadSPI Bank1 in dual mode, and I am attempting to use another external device in Bank2 in quad mode.
The issue I encountered is that while the Flash connected to Bank1 operates normally, a problem occurs when transmitting data to Bank2. Upon inspecting with an oscilloscope, the data itself is transmitted correctly, but the default state of the BK IO3 pin is always fixed to High. Since the external device receives data from QuadSPI without any filtering, the fact that IO3 is fixed to High can cause malfunction. *This device does not require separate NCS or WP pins.
The image below is a measurement taken when 0x01 was transmitted to BK2 using 4-line Quadmode.
Although 0x01 is transmitted correctly, you can see that the state of IO3 returns to High again.

To prevent any potential issues, the qspi-related code that activates the Flash has been disabled.
Below is the relevant code.
uint8_t qspiInit(void)
{
uint8_t ret = TRUE;
__HAL_RCC_QSPI_FORCE_RESET();
__HAL_RCC_QSPI_RELEASE_RESET();
if(qspiParamInit()!=TRUE)
{
return QSPI_INIT_FAIL;
}
isInit = TRUE;
return ret;
}
static uint8_t qspiParamInit(void)
{
uint8_t ret = TRUE;
hxspi.Instance = QUADSPI;
hxspi.Init.ClockPrescaler = 120;
hxspi.Init.FifoThresholdByte = 4;
hxspi.Init.SampleShifting = XSPI_SAMPLE_SHIFTING_NONE;
hxspi.Init.MemorySize = 23-1;
hxspi.Init.ChipSelectHighTimeCycle = 1;
hxspi.Init.ClockMode = XSPI_CLOCK_MODE_0;
hxspi.Init.MemoryMode = HAL_XSPI_SINGLE_MEM;
if (HAL_XSPI_Init(&hxspi) != HAL_OK) {
ret = FALSE;
}
return ret;
}
XSPI_RegularCmdTypeDef qdev;
uint8_t qspiDev_Init(void)
{
uint8_t ret = TRUE;
if(qspiIsinit()!=TRUE)
{
ret = qspiInit();
if(ret !=TRUE)
return QSPI_INIT_FAIL;
}
qdev.Instruction = 0;
qdev.InstructionMode = XSPI_INSTRUCTION_NONE;
qdev.AddressMode = XSPI_ADDRESS_NONE;
qdev.AddressWidth = XSPI_ADDRESS_24_BITS;
qdev.Address = 0;
qdev.AlternateByteMode = XSPI_ALT_BYTES_NONE;
qdev.DTRMode = XSPI_DTR_MODE_DISABLE;
qdev.DelayHoldHalfCycle = XSPI_DHHC_ANALOG_DELAY;
qdev.SIOOMode = XSPI_SIOO_INST_EVERY_CMD;
qdev.DataMode = XSPI_DATA_4_LINES;
qdev.DummyCycles = 0;
qdev.IOSelect = HAL_XSPI_SELECT_IO_7_4;
qdev.DataLength = 1;
if (HAL_XSPI_Command(&hxspi, &qdev, HAL_XSPI_TIMEOUT_DEFAULT_VALUE)!= HAL_OK)
{
return FALSE;
}
isInit = TRUE;
return ret;
}
/*1byte Write*/
uint8_t qdev_WriteByte(uint8_t data)
{
uint8_t ret = TRUE;
/* Transmission of the data */
if (HAL_XSPI_Transmit(&hxspi, &data, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return FALSE;
}
return ret;
}
Best regards.
