如果是把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)