通过ST的HAL库看EMMC初始化驱动

2023-12-21 15:45:19 浏览数 (2)

如果是把SD卡,emmc卡的驱动合并到一起那会有一些识别卡的步骤。看起来不太好理解。单看emmc的驱动就比较好理解。

整体分两步。第一步,初始化外设控制器获取参数 HAL_MMC_Init。第二步,根据需求配置emmc时钟速率, 总线位宽等 HAL_MMC_ConfigWideBusOperation。

整体流程图如下:

1 初始化外设控制器获取参数 HAL_MMC_Init

1.1 初始化GPIO(HAL_MMC_MspInit)

对外设控制器进行初始化,包括gpio,控制器参数,要使用的dma的配置。

1.2 初始化卡(HAL_MMC_InitCard)

  • 1.2.1 初始化总线位宽、时钟(1bit线、速度400k以下)(SDMMC_Init)
  • 1.2.2 卡时钟输出禁止(__HAL_MMC_DISABLE)
  • 1.2.3 卡控制器电源使能(SDMMC_PowerState_ON)
  • 1.2.4 卡时钟输出使能(__HAL_MMC_ENABLE)
  • 1.2.5 等3ms(HAL_Delay(2))
  • 1.2.6 初始化卡电压(MMC_PowerON)
    • 1.2.6.1 发送CMD0(SDMMC_CmdGoIdleState)
    • 1.2.6.2 发送CMD1(设置访问方式,获取电压、容量范围)(SDMMC_CmdOpCondition)
  • 1.2.7 初始化卡(MMC_InitCard)
    • 1.2.7.1 检查上电状态(SDMMC_GetPowerState)
    • 1.2.7.2 发送CMD2(获取CID寄存器)(SDMMC_CmdSendCID)
    • 1.2.7.3 发送CMD3(设置RCA)(SDMMC_CmdSetRelAddMmc)
    • 1.2.7.4 发送CMD9(获取CSD寄存器内容,容量、时钟等)(SDMMC_CmdSendCSD)
    • 1.2.7.5 发送CMD7(切换状态)(SDMMC_CmdSelDesel)
    • 1.2.7.6 解析CSD寄存器(HAL_MMC_GetCardCSD)
    • 1.2.7.7 发送CMD13(获取状态)(SDMMC_CmdSendStatus)
    • 1.2.7.8 读取EXT_CSD(HAL_MMC_GetCardExtCSD)
    • 1.2.7.9 发送CMD13(获取状态)(SDMMC_CmdSendStatus)
    • 1.2.7.10 初始化总线位宽、时钟(1bit线、速度400k以下)(SDMMC_Init)

2 配置emmc时钟速率, 总线位宽等 HAL_MMC_ConfigWideBusOperation

2.1 操作功率配置 MMC_PwrClassUpdate

  • 2.1.1 获取功率,读取EXT_CSD的187(MMC_ReadExtCSD)
  • 2.1.2 与EXT_CSD的201:203比较
  • 2.1.3 根据需要设置EXT_CSD的187位功率

2.2 配置总线位宽

  • 发送CMD6(SDMMC_CmdSwitch)

2.3 初始化总线位宽、时钟(8bit线、最大速度)(SDMMC_Init)

0 人点赞