STM32. Невозможно инициализировать eMMC, поскольку зависает при выполнении функции GetCardCSD().
У меня проблема с использованием драйверов stm32 для подключения к eMMC.https://datasheet.lcsc.com/lcsc/2205071500_Zetta-ZDEMMC04GA_C3010207.pdf
Проблема в том, что инициализация зацикливается при выполнении функции HAL_MMC_GetCardCSD(hmmc, &CSD) . Я использую соединение Sdio MMC 4bus. С конфигурацией по умолчанию, созданной с помощью куба MX. Весь проект CubeIDE: https://drive.google.com/file/d/11SYNmtlIMufuW7qhBfG2uZRTAETRmxBl/view?usp=sharing
ФУНКЦИЯ ИНИЦИАЛИЗАЦИИ:
static void SDIO_MMC_Init(void){
hmmc.Instance = SDIO;
hmmc.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
hmmc.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
hmmc.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
hmmc.Init.BusWide = SDIO_BUS_WIDE_4B;
hmmc.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
hmmc.Init.ClockDiv = 0;
if (HAL_MMC_Init(&hmmc) != HAL_OK){
Error_Handler();
}
if (HAL_MMC_ConfigWideBusOperation(&hmmc, SDIO_BUS_WIDE_4B) != HAL_OK){
Error_Handler();
}
}
MSP_INITIALIZATION
void HAL_MMC_MspInit(MMC_HandleTypeDef* hmmc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hmmc->Instance==SDIO)
{
/* USER CODE BEGIN SDIO_MspInit 0 */
/* USER CODE END SDIO_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/**SDIO GPIO Configuration
PC8 ------> SDIO_D0
PC9 ------> SDIO_D1
PC10 ------> SDIO_D2
PC11 ------> SDIO_D3
PC12 ------> SDIO_CK
PD2 ------> SDIO_CMD
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12;
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_SDIO;
HAL_GPIO_Init(GPIOC, &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_SDIO;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* USER CODE BEGIN SDIO_MspInit 1 */
/* USER CODE END SDIO_MspInit 1 */
}
}