Skip to main content
Visitor II
January 4, 2020
Question

OctoSPI configuration for hyperflash

  • January 4, 2020
  • 4 replies
  • 4582 views

does anyone have a configuration for the CypressS26KL256S hyperflash? in the stm32cube_fw_l4_v1130 are examples only for regular command mode (micron or macronix) but not for hyperflash mode. thanks in advance

    This topic has been closed for replies.

    4 replies

    Leo_PandaAuthor
    Visitor II
    January 21, 2020

    With some investigation i can erase write and read the hyperflash.

    The only problem now is reading flash in memory mapped mode: if i make an address jump, say read word from base and immediatly read word at base+300 then the system crashes, i lost the connection to the st-link, is not able to debug any more. I can do the same reading procedure on hyper ram without any problem!

    Can anyone help? Thanks!

    Visitor II
    May 18, 2024

    Hello ,

    This may be an very late but can you share how you erase and read/write hyperflash. I am stuck with cypress hyperflash and it would really help me if you share your code snippet or basic changes details to make it work.

    Leo_PandaAuthor
    Visitor II
    January 23, 2020

    it seems nobody has experiences with stm ospi on hyperflash memory here.

    Now i solved the problem. I use dma and interrupt for writing the flash and then switch it into memory mapped mode. but the dma is still linked and the interrupt is active. this combination seems to be wrong for the memory mapped mode. after removing the dma and disabling the interrupt, it works fine.

    Visitor II
    August 3, 2020

    Hi @Leo_Panda​ ,

    Could you share how you got reading, writing and erase to work with Cypress HyperFlash? I am able to execute one command sequence (HyperbusCmd, Transmit, Receive), but after that OSPI driver returns with timeout error (busy flag not reset).

    I'm not sure is it in OSPI configuration, command I send or hardware issue that is causing the error.

    I have contacted ST support, but I guess holiday season is causing delays for answers...

    Graduate II
    August 3, 2020

    That and everyone locked down for COVID-1984..

    Might want to try your local Cypress/Infineon FAE, more likely to have specific understanding of their FLASH IC, and how it integrates with common MCUs

    Parts distributors might also have support staff to help integrate.

    Failing that you'll need to pull out a logic analyzer and review/interpret the data sheets

    Visitor II
    November 3, 2020

    Hi @Leo_Panda (Community Member)​ and ALan (Community Member)

    I'm developing with the STM32H7B0 and I use an external hyperFlash Memory (Cypress S26KL512) with HyperBus mode.

    Octospi :

    IO[7:0] as bidirectional data bus, RWDS for read and write data strobe,  nCS and CLK

    Quartz : 24Mhz  => sysclock = 120 Mhz  and  OctoSPi Clock = 60 Mhz

    .

    Currently, I can't read the Status Register Mode of the flash, it answers 0xFFFF.

      

    configuration :

    void MX_OCTOSPI1_Init(void)

    {

     OSPIM_CfgTypeDef sOspiManagerCfg = {0};

     OSPI_HyperbusCfgTypeDef sHyperBusCfg = {0};

     hospi1.Instance = OCTOSPI1;

     hospi1.Init.FifoThreshold = 1;

     hospi1.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;

     hospi1.Init.MemoryType = HAL_OSPI_MEMTYPE_HYPERBUS;

     hospi1.Init.DeviceSize = 26;

     hospi1.Init.ChipSelectHighTime = 1;

     hospi1.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;

     hospi1.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;

     hospi1.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;

     hospi1.Init.ClockPrescaler = 2;

     hospi1.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE;

     hospi1.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE;

      if (HAL_OSPI_Init(&hospi1) != HAL_OK)

     {

       Error_Handler();

     }

     sOspiManagerCfg.ClkPort = 1;

     sOspiManagerCfg.DQSPort = 1;

     sOspiManagerCfg.NCSPort = 1;

     sOspiManagerCfg.IOLowPort = HAL_OSPIM_IOPORT_1_LOW;

     sOspiManagerCfg.IOHighPort = HAL_OSPIM_IOPORT_1_HIGH;

     if (HAL_OSPIM_Config(&hospi1, &sOspiManagerCfg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)

     {

       Error_Handler();

     }

     sHyperBusCfg.RWRecoveryTime = 3;

     sHyperBusCfg.AccessTime = 6;

     sHyperBusCfg.WriteZeroLatency = HAL_OSPI_LATENCY_ON_WRITE;

     sHyperBusCfg.LatencyMode = HAL_OSPI_FIXED_LATENCY;

     if (HAL_OSPI_HyperbusCfg(&hospi1, &sHyperBusCfg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)

     {

       Error_Handler();

     }

    }

    Can you help me ?

    Best regard

    Visitor II
    November 5, 2020

    Here is my settings for IS26KL128S (basically same chip as Cypress) using 100 MHz bus:

     hospi1.Instance = OCTOSPI1;

     hospi1.Init.FifoThreshold = 2;

     hospi1.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;

     hospi1.Init.MemoryType = HAL_OSPI_MEMTYPE_HYPERBUS;

     hospi1.Init.DeviceSize = 24;

     hospi1.Init.ChipSelectHighTime = 2;

     hospi1.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;

     hospi1.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;

     hospi1.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;

     hospi1.Init.ClockPrescaler = 2;

     hospi1.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE;

     hospi1.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE;

     hospi1.Init.ChipSelectBoundary = 0;

     hospi1.Init.ClkChipSelectHighTime = 0;

     hospi1.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_BYPASSED;

     hospi1.Init.MaxTran = 0;

     hospi1.Init.Refresh = 0;

     sHyperBusCfg.RWRecoveryTime = 0;

     sHyperBusCfg.AccessTime = 10;

     sHyperBusCfg.WriteZeroLatency = HAL_OSPI_NO_LATENCY_ON_WRITE;

     sHyperBusCfg.LatencyMode = HAL_OSPI_VARIABLE_LATENCY;

    I also recommend to request a low level driver from Cypress/ISSI. It makes the necessary address conversion. Practically it does the same thing as this: sCommand.Address = (address << 1);

    BR,

    Aki

    Visitor II
    November 5, 2020

    Hello, Thank you for your answer

    For my part, I wanted to use the indirect mode to read and write in the flash.

    And use the HAL_OSPI_HyperbusCmd, HAL_OSPI_Transmit and HAL_OSPI_Receive functions.

    I still cannot read the Status Register Mode.

    I think I have a sending problem in my DQ [0..7] data but at the moment I can't find where the problem is.

    I have already recovered low level driver from Cypress for the commands.

    I tried to switch it to Memory-mapped mode but it doesn't work either.

    Should your configuration change following the write (HAL_OSPI_NO_LATENCY_ON_WRITE) or read (HAL_OSPI_LATENCY_ON_WRITE) commands?

    Do you initialize the flash (NVCR / VCR) during the first use?

    Best regard