cancel
Showing results for 
Search instead for 
Did you mean: 

Quad-SPI DDR indirect read mode dummy cycles count

axlrose21
Associate

Hello ST community,

I have some troubles with dummy cycles using Quad-SPI interface in DDR mode on STM32H743 and STM32F746.

I am trying to read data from IS25LP080D QSPI flash with FAST READ QUAD IO DTR MODE OPERATION (0xED command). It is 1-4-4 mode.
I am having trouble with number of dummy cycles. From IS25LP080D datasheet there must be 6 dummy sclk cycles between address and data. But to get 6 dummy cycles I must set cmd.DummyCycles = 3; in my program. Why there are 3 extra dummy cycles on diagram?

My read function for HAL is below. In this function I set cmd.DummyCycles = 3.

IS25LP_Status_t IS25LP_ReadQuadDDR(QSPI_HandleTypeDef *hqspi, uint8_t *buf, uint32_t addr, uint32_t size)
{
    QSPI_CommandTypeDef cmd = {0};

    cmd.InstructionMode    = QSPI_INSTRUCTION_1_LINE;
    cmd.Instruction        = IS25LP_FAST_READ_QUAD_IO_DDR;
    cmd.AddressMode        = QSPI_ADDRESS_4_LINES;
    cmd.AddressSize        = QSPI_ADDRESS_24_BITS;
    cmd.Address            = addr;
    cmd.AlternateByteMode  = QSPI_ALTERNATE_BYTES_NONE;
    cmd.AlternateBytesSize = QSPI_ALTERNATE_BYTES_24_BITS;
    cmd.AlternateBytes	   = 0x0;
    cmd.DummyCycles        = 3;
    cmd.DataMode           = QSPI_DATA_4_LINES;
    cmd.NbData             = size;
    cmd.DdrMode            = QSPI_DDR_MODE_ENABLE;
    cmd.DdrHoldHalfCycle   = QSPI_DDR_HHC_HALF_CLK_DELAY;
    cmd.SIOOMode           = QSPI_SIOO_INST_EVERY_CMD;

    if (HAL_QSPI_Command(hqspi, &cmd, QSPI_TIMEOUT) != HAL_OK) {
        return IS25LP_ERROR;
    }

    if (HAL_QSPI_Receive(hqspi, buf, QSPI_TIMEOUT) != HAL_OK) {
        return IS25LP_ERROR;
    }

    return IS25LP_OK;
}

In my main.c I use this function to read 8 bytes of data:

status = IS25LP_ReadQuadDDR(&hqspi, readBuf, 0x1000, 8);

And I am getting correct flash data:
First 8 bytes (DDR): 00 01 02 03 04 05 06 07

DCYC field in CCR register is 0x3, so there must be only 3 dummy cycles.

DCYC_reg.png

But on time diagram I can see 6 dummy cycles:

stm32h743.png

So I got 3 extra dummy cycles on STM32H743 board.

My question is: why there are extra dummy cycles? How should I calculate there number?

I also tried this code on STM32F746 board and I got 1 extra dummy cycles, but not 3.

Thank you for any thoughts!

 

I'm attaching my main.c and is25lp_mem.c for the reference.

 

Processor: STM32H743ZI

Board: Nucleo-H743ZI

Driver version: STM32Cube MCU Package for STM32H7 1.12.0

Compiler: GNU Tools for STM32 (12.3.rel1)

Cube MX 6.13.0

2 REPLIES 2
KDJEM.1
ST Employee

Hello @axlrose21 and welcome to the datasheet;

 

As mentioned in the memory datasheet, the number of dummy cycles depends on clock speed. Detailed information in Table 6.11 Read Dummy Cycles.

KDJEM1_0-1766136633451.png

What is the QUADSPI frequency?

Thank you.

Kaouthar

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

Hello @KDJEM.1 !

I am using 615 kHz and 10 MHz frequencies for QSPI. My flash read register setting are P[6:3] = 0; (default dummy cycles count for Fast Read Quad IO command is 6).