Skip to main content
Leo_Panda
Associate III
January 4, 2020
Question

OctoSPI configuration for hyperflash

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.

12 replies

Leo_Panda
Leo_PandaAuthor
Associate III
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!

Associate III
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_Panda
Leo_PandaAuthor
Associate III
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.

ALan1
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...

Tesla DeLorean
Guru
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

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
Agran.1
Associate III
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

ALan1
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

Agran.1
Associate III
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