Skip to main content
JCuna.1
Senior
April 29, 2022
Question

HAL QSPI AUTOPOLLING SUPPORT 4LINES?

  • April 29, 2022
  • 2 replies
  • 1238 views

I have read many samples in cube h7 github repository, and I have seen any hal autoplling example consulting status registers in 4 lines mode operation. It is supported? I am using STM32H750 with cube h7 1.10.0.

This topic has been closed for replies.

2 replies

Tesla DeLorean
Guru
April 29, 2022

What make/model memory device are you using?

S​eem to recall you using Bank 2

Show initialization code, paste as quoted text, not graphic. See </> icon.

PB2 CLK​

PC11 BK2 NCS

PE7 BK2​ D0

PE8

PE9

PE10 BK2 D3​

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
JCuna.1
JCuna.1Author
Senior
April 29, 2022
/* QUADSPI init function */
void MX_QUADSPI_Init(void)
{
 
 /* USER CODE BEGIN QUADSPI_Init 0 */
 
 /* USER CODE END QUADSPI_Init 0 */
 
 /* USER CODE BEGIN QUADSPI_Init 1 */
 
 /* USER CODE END QUADSPI_Init 1 */
 hqspi.Instance = QUADSPI;
 hqspi.Init.ClockPrescaler = 9;
 hqspi.Init.FifoThreshold = 1;
 hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;
 hqspi.Init.FlashSize = 21;
 hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
 hqspi.Init.ClockMode = QSPI_CLOCK_MODE_3;
 hqspi.Init.FlashID = QSPI_FLASH_ID_2;
 hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
 if (HAL_QSPI_Init(&hqspi) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN QUADSPI_Init 2 */
 
 /* USER CODE END QUADSPI_Init 2 */
 
}
 
void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle)
{
 
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 if(qspiHandle->Instance==QUADSPI)
 {
 /* USER CODE BEGIN QUADSPI_MspInit 0 */
 
 /* USER CODE END QUADSPI_MspInit 0 */
 
 /** Initializes the peripherals clock
 */
 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_QSPI;
 PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_D1HCLK;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* QUADSPI clock enable */
 __HAL_RCC_QSPI_CLK_ENABLE();
 
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOE_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 /**QUADSPI GPIO Configuration
 PB2 ------> QUADSPI_CLK
 PE7 ------> QUADSPI_BK2_IO0
 PE8 ------> QUADSPI_BK2_IO1
 PE9 ------> QUADSPI_BK2_IO2
 PE10 ------> QUADSPI_BK2_IO3
 PC11 ------> QUADSPI_BK2_NCS
 */
 GPIO_InitStruct.Pin = GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI;
 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 
 GPIO_InitStruct.Pin = GPIO_PIN_11;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
 /* USER CODE BEGIN QUADSPI_MspInit 1 */
 
 /* USER CODE END QUADSPI_MspInit 1 */
 }
}
 
void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* qspiHandle)
{
 
 if(qspiHandle->Instance==QUADSPI)
 {
 /* USER CODE BEGIN QUADSPI_MspDeInit 0 */
 
 /* USER CODE END QUADSPI_MspDeInit 0 */
 /* Peripheral clock disable */
 __HAL_RCC_QSPI_CLK_DISABLE();
 
 /**QUADSPI GPIO Configuration
 PB2 ------> QUADSPI_CLK
 PE7 ------> QUADSPI_BK2_IO0
 PE8 ------> QUADSPI_BK2_IO1
 PE9 ------> QUADSPI_BK2_IO2
 PE10 ------> QUADSPI_BK2_IO3
 PC11 ------> QUADSPI_BK2_NCS
 */
 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2);
 
 HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
 
 HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11);
 
 /* USER CODE BEGIN QUADSPI_MspDeInit 1 */
 
 /* USER CODE END QUADSPI_MspDeInit 1 */
 }
}

 My code works for read or write operation (polling only wel bit). But for erase operation I need to poll wel and wip/busy bit. I am using W25Q32JVSSIM-TR.

Tesla DeLorean
Guru
April 29, 2022

Other L4 examples break the register read into a more normal interaction/loop

The auto-poll should work, not sure if there is any errata. You have the Y or V step of the H750 ? Doubt you have Z or X's

https://www.st.com/resource/en/errata_sheet/es0396-stm32h750xb-and-stm32h753xi-device-limitations-stmicroelectronics.pdf Nothing jumping out..

Does it really need you looking at both bits? BUSY is the thing you need to spin on

Try the Mode 0 clock mode. ie where it doesn't idle high

05h should work in 1-bit and 4-bit, mode? Make sure spimode is right, that QE is set, and Quad Mode is enabled (38h), won't be by default. It will exit QPI if FFh is clocked as a command

QE is in SR2, and SR1/SR2 need to be written as a pair

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..