STM32H7 SDMMC1 卡在初始化阶段

问题描述 投票:0回答:1

我正在尝试使 HAL 的 SDMMC1 工作,但在寄存器中没有得到任何响应(在 KEIL 的调试模式下查看它,寄存器甚至不切换任何位),也看不到在示波器中初始化 MMC 的任何尝试(时钟、cmd 和数据线也不会切换)。

我正在初始化 MMC:

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SDMMC1_MMC_Init(void)
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  while (1)
  {
    if (UserRxBufferFS[0] == 0x97)   // GOT command for emmc
     {  
      UserRxBufferFS[0] = 0;
      SDMMC1->POWER = 1; //check the power register( doesnt change in debug mode, why?)
      MX_SDMMC1_MMC_Init();
      SDMMC_PowerState_ON(&hmmc2); // check the power register with HAL( doesnt change aswell)
      SDMMC_SendCommand(&hmmc2, 0); // checking cmd line, nothing happens in oscillo
      }
  }
static void MX_SDMMC1_MMC_Init(void)
{
  hmmc1.Instance = SDMMC1;
  hmmc1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
  hmmc1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  hmmc1.Init.BusWide = SDMMC_BUS_WIDE_1B;
  hmmc1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  hmmc1.Init.ClockDiv = 0;
}
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 1;
  RCC_OscInitStruct.PLL.PLLN = 80;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

我知道要使mmc/sd卡(它们的协议几乎相同)工作,我们需要发送大量的cmd序列,我之前已经通过软mmc(sdio)实现完成了它,现在我需要读取mmc的速度,并且硬件可以帮我解决这个问题,但我从一开始就陷入困境,HAL 实现和直接寄存器访问根本对任何事情都没有反应

更新。我的 RCC 配置:

更新2。 stm32h7xx_hal_rcc.h HAL 生成(__HAL_RCC_C1_SDMMC1_CLK_ENABLE() 未激活):

c stm32 hal
1个回答
0
投票

我认为可能导致初始化问题的三件事。

  1. 应该有某种 RCC 宏调用来启用外设时钟。 @Ilya 在评论中看到了这一点
  2. 我认为缺少 SDMMC_Init() 调用。
  3. 代码片段在使用
    hmmc1
    hmmc2
    之间切换。我认为它一次只尝试使用一个 SDMMC 实例,对吗?

之后,我认为你的SDMMC初始化代码应该看起来像这样。

// Enable the clock to the peripheral. I'm not sure if this is the right RCC macro though
__HAL_RCC_SDMMC1_CLK_ENABLE();
// initializes hmmc1 structure with configuration from STM32Cube
MX_SDMMC1_MMC_Init();
// initializes the SMMC1 hardware peripheral with the config set above
SDMMC_Init(&hmmc1.Instance, &hmmc1.Init);
// Try the rest of your code here that works with the SDMMC registers
SDMMC_PowerState_ON(&hmmc1)
//.... 

我主要从 HAL 驱动程序中的文档获取此信息:https://github.com/STMicroelectronics/stm32h7xx_hal_driver/blob/6dd7f0e35c80b6e46ab7b77c972d2e785054d7c6/Src/stm32h7xx_ll_sdmmc.c#L59-L71。我没有硬件所以不知道能不能用。祝你好运

© www.soinside.com 2019 - 2024. All rights reserved.