Skip to main content
Explorer
April 27, 2024
Question

STM32L562 and Sky High eMMC S40FC008 fails MMC_PowerON() with rtn code 4

  • April 27, 2024
  • 0 replies
  • 866 views

I have a custom board using the STM32L562Q BGA package processor.  I have a high speed capable eMMC part with an 8-bit data interface.

The STM Cube generated code seems to be correctly beginning the init and ID process, however after the 3 different settings are attempted the code error exits with return code 4.  This is the part of the 1-bit boot sequence where code is trying to identify voltage and high capacity or low capacity card.

Do you have reference code for this specific part or something that complies with the 5.1 eMMC specification?  In theory these are all backward compatible, but these newer cards has lots of useful features.

The design also include a Linear Tech triple supply so VCC to this part is independently controlled.  It also has  a hard reset.  So power is applied and we wait for pgood, we toggle and wait the appropriate period on the init signal.  Then the normal eMMC init is kicked off.

Any idea on where to resume debugging this?

Grizz_0-1714234575472.png

Grizz_1-1714234656164.png

void
HAL_MMC_MspInit(MMC_HandleTypeDef* mmcHandle)
{
 GPIO_InitTypeDef GPIO_InitStruct = { 0 };
 RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };
 if (mmcHandle->Instance == SDMMC1) {
 /* USER CODE BEGIN SDMMC1_MspInit 0 */
 bool VCC2_NotReady = true;

 // Power ON Device
 SetVCC2(ON);

 do {
 if (GetPGood2() == GPIO_PIN_SET) {
 VCC2_NotReady = false;
 } else {
 // Timeout power good and handle hardware error
 // TODO Add time check here for fatal error
 }

 } while (VCC2_NotReady);

 /* USER CODE END SDMMC1_MspInit 0 */

 /** Initializes the peripherals clock
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SDMMC1;
 PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_PLLP;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
 Error_Handler();
 }

 /* SDMMC1 clock enable */
 __HAL_RCC_SDMMC1_CLK_ENABLE();

 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 /**SDMMC1 GPIO Configuration
 PB9 ------> SDMMC1_D5
 PD2 ------> SDMMC1_CMD
 PC11 ------> SDMMC1_D3
 PC12 ------> SDMMC1_CK
 PC10 ------> SDMMC1_D2
 PB8 ------> SDMMC1_D4
 PC7 ------> SDMMC1_D7
 PC9 ------> SDMMC1_D1
 PC8 ------> SDMMC1_D0
 PC6 ------> SDMMC1_D6
 */
 GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_8;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_7 |
 GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_6;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 /* SDMMC1 interrupt Init */
 HAL_NVIC_SetPriority(SDMMC1_IRQn, 2, 0);
 HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
 /* USER CODE BEGIN SDMMC1_MspInit 1 */
 // Perform Hard Reset
 SetEmmcRstN(ON);

 // Force a 1 mSec wait for reset
 HAL_Delay(1);

 // Release Hard Reset
 SetEmmcRstN(OFF);

 /* USER CODE END SDMMC1_MspInit 1 */
 }
}

 

    This topic has been closed for replies.