sdmmc_host.rst 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. SDMMC 主机驱动
  2. =================
  3. :link_to_translation:`en:[English]`
  4. 概述
  5. --------
  6. {IDF_TARGET_NAME} 的 SDMMC 主机外设共有两个卡槽,用于插入 SD 卡、连接 SDIO 设备或连接 eMMC 芯片,每个卡槽均可单独使用。
  7. .. only:: esp32
  8. - 卡槽 0 (:c:macro:`SDMMC_HOST_SLOT_0`) 为 8 位卡槽,使用 PIN MUX 中的 ``HS1_*`` 信号。
  9. - 卡槽 1 (:c:macro:`SDMMC_HOST_SLOT_1`) 为 4 位卡槽,使用 PIN MUX 中的 ``HS2_*`` 信号。
  10. 这些卡槽通过 IO MUX 连接到 {IDF_TARGET_NAME} 的 GPIO,其管脚映射如下表所示。
  11. .. list-table::
  12. :header-rows: 1
  13. :widths: 20 40 40
  14. :align: center
  15. * - 信号
  16. - 卡槽 0
  17. - 卡槽 1
  18. * - CMD
  19. - GPIO11
  20. - GPIO15
  21. * - CLK
  22. - GPIO6
  23. - GPIO14
  24. * - D0
  25. - GPIO7
  26. - GPIO2
  27. * - D1
  28. - GPIO8
  29. - GPIO4
  30. * - D2
  31. - GPIO9
  32. - GPIO12
  33. * - D3
  34. - GPIO10
  35. - GPIO13
  36. * - D4
  37. - GPIO16
  38. -
  39. * - D5
  40. - GPIO17
  41. -
  42. * - D6
  43. - GPIO5
  44. -
  45. * - D7
  46. - GPIO18
  47. -
  48. * - CD
  49. - 来自 GPIO 交换矩阵的任意输入
  50. - 来自 GPIO 交换矩阵的任意输入
  51. * - WP
  52. - 来自 GPIO 交换矩阵的任意输入
  53. - 来自 GPIO 交换矩阵的任意输入
  54. 可以通过 GPIO 交换矩阵将卡检测 (CD) 和写保护 (WP) 信号路由到任意管脚。为了保留这些管脚,需要先配置 :cpp:class:`sdmmc_slot_config_t` 结构体的 ``cd`` 和 ``wp``,再调用 :cpp:func:`sdmmc_host_init_slot`。注意,使用 SDIO 卡时,不建议指定 CD 管脚,因为 ESP32 中的 CD 信号也可能触发 SDIO 从机设备中断。
  55. .. warning::
  56. 卡槽 0 使用的管脚 (``HS1_*``) 既用于连接主机上的 SD 卡插槽,也用于连接 ESP32-WROOM 和 ESP32-WROVER 模组中的 SPI flash 芯片,但这些管脚不能同时用于 SD 卡与 SPI flash。如需使用卡槽 0,请将 SPI flash 连接到其他管脚,并根据需要配置 eFuse。
  57. .. only:: SOC_SDMMC_USE_GPIO_MATRIX
  58. 卡槽 :c:macro:`SDMMC_HOST_SLOT_0` 和 :c:macro:`SDMMC_HOST_SLOT_1` 都支持 1、4、8 线的 SD 接口,这些卡槽通过 GPIO 交换矩阵连接到 {IDF_TARGET_NAME} 的 GPIO,即每个 SD 卡信号都可以使用任意 GPIO 连接。
  59. 支持的速率模式
  60. ---------------------
  61. SDMMC 主机驱动支持以下速率模式:
  62. - 默认速率 (20 MHz):对于 SD 卡,支持 1 线或 4 线传输;对于 3.3 V eMMC,支持 1 线、4 线或 8 线传输。
  63. - 高速模式 (40 MHz):对于 SD 卡,支持 1 线或 4 线传输;对于 3.3 V eMMC,支持 1 线、4 线或 8 线传输。
  64. - 高速 DDR 模式 (40 MHz):对于 3.3 V eMMC,支持 4 线传输。
  65. 当前尚不支持的速率模式:
  66. - 高速 DDR 模式:不支持 8 线 eMMC 传输
  67. - UHS-I 1.8 V 模式:不支持 4 线 SD 卡传输
  68. 使用 SDMMC 主机驱动
  69. ---------------------------
  70. 在大多数应用程序中,只有下列函数会被直接调用:
  71. - :cpp:func:`sdmmc_host_init`
  72. - :cpp:func:`sdmmc_host_init_slot`
  73. - :cpp:func:`sdmmc_host_deinit`
  74. 其他函数将通过 :cpp:class:`sdmmc_host_t` 结构体中的函数指针由 SD/MMC 协议层调用,例如:
  75. - :cpp:func:`sdmmc_host_set_bus_width`
  76. - :cpp:func:`sdmmc_host_set_card_clk`
  77. - :cpp:func:`sdmmc_host_do_transaction`
  78. 配置总线宽度和频率
  79. -----------------------------------
  80. 使用 :cpp:class:`sdmmc_host_t` 和 :cpp:class:`sdmmc_slot_config_t` 的默认初始化配置,即 :c:macro:`SDMMC_HOST_DEFAULT` 和 :c:macro:`SDMMC_SLOT_CONFIG_DEFAULT` 时,SDMMC 主机驱动会尝试以当前卡所支持的最大总线宽度进行通信(SD 卡为 4 线,eMMC 为 8 线),并使用 20 MHz 的通信频率。
  81. 在支持 40 MHz 频率通信的设计中,可以调整 :cpp:class:`sdmmc_host_t` 结构体中的 ``max_freq_khz`` 字段,提升总线频率:
  82. .. code-block::
  83. sdmmc_host_t host = SDMMC_HOST_DEFAULT();
  84. host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;
  85. 如需选择标准速率以外的特定频率,请根据所使用的 SD 接口(SDMMC 或 SDSPI)确定适当频率范围,并选择其中的任意值。然而,实际的时钟频率会由底层驱动程序计算,可能与你所需的值不同。
  86. 使用 SDMMC 接口时,``max_freq_khz`` 即频率上限,因此最终的频率值应始终低于该上限。而使用 SDSPI 接口时,驱动程序会提供最接近的适配频率,因此该值可以大于、等于或小于 ``max_freq_khz``。
  87. 请配置 :cpp:class:`sdmmc_slot_config_t` 的 ``width`` 字段,配置总线宽度。例如,配置 1 线模式的代码如下:
  88. .. code-block::
  89. sdmmc_slot_config_t slot = SDMMC_SLOT_CONFIG_DEFAULT();
  90. slot.width = 1;
  91. .. only:: SOC_SDMMC_USE_GPIO_MATRIX
  92. 配置 GPIO
  93. -----------------
  94. 通过配置结构体 :cpp:class:`sdmmc_slot_config_t`,{IDF_TARGET_NAME} 的 SDMMC 主机可以根据需要,为每个信号配置任意的 GPIO 管脚。
  95. 例如,使用以下代码,可以将 GPIO 1-6 分别用于 CLK、CMD、D0-D3 信号:
  96. .. code-block::
  97. sdmmc_slot_config_t slot = SDMMC_SLOT_CONFIG_DEFAULT();
  98. slot.clk = GPIO_NUM_1;
  99. slot.cmd = GPIO_NUM_2;
  100. slot.d0 = GPIO_NUM_3;
  101. slot.d1 = GPIO_NUM_4;
  102. slot.d2 = GPIO_NUM_5;
  103. slot.d3 = GPIO_NUM_6;
  104. 也可以配置 CD 和 WP 管脚。与配置其他信号的方法类似,你只需配置相同结构体的 ``cd`` 和 ``wp`` 参数:
  105. .. code-block::
  106. slot.cd = GPIO_NUM_7;
  107. slot.wp = GPIO_NUM_8;
  108. ``SDMMC_SLOT_CONFIG_DEFAULT`` 将 CD 和 WP 管脚都配置为 ``GPIO_NUM_NC``,表明默认情况下不会使用这两个管脚。
  109. 通过上述方式初始化 :cpp:class:`sdmmc_slot_config_t` 结构体后,即可在调用 :cpp:func:`sdmmc_host_init_slot` 或其他任意高层函数(如 :cpp:func:`esp_vfs_fat_sdmmc_mount`)时使用该结构体。
  110. eMMC 芯片的 DDR 模式
  111. -----------------------
  112. 默认情况下,如果满足以下条件,将使用 DDR 模式:
  113. - 在 :cpp:class:`sdmmc_host_t` 结构体中将 SDMMC 主机频率配置为 :c:macro:`SDMMC_FREQ_HIGHSPEED`,且
  114. - eMMC 芯片在其 CSD 寄存器中报告支持 DDR 模式
  115. DDR 模式对信号完整性要求更高。如果要在保持 :c:macro:`SDMMC_FREQ_HIGHSPEED` 频率的同时禁用 DDR 模式,请在 :cpp:class:`sdmmc_host_t` 结构体的 :cpp:member:`sdmmc_host_t::flags` 字段中清除 :c:macro:`SDMMC_HOST_FLAG_DDR` 位:
  116. .. code-block::
  117. sdmmc_host_t host = SDMMC_HOST_DEFAULT();
  118. host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;
  119. host.flags &= ~SDMMC_HOST_FLAG_DDR;
  120. 相关文档
  121. --------
  122. - :doc:`../storage/sdmmc`:介绍了实现协议层的高层驱动程序。
  123. - :doc:`sdspi_host`:介绍了一种类似驱动,该驱动使用 SPI 控制器且受限于 SD 协议的 SPI 模式。
  124. - :doc:`sd_pullup_requirements` 介绍了模组和开发套件上的上拉支持和兼容信息。
  125. API 参考
  126. -------------
  127. .. include-build-file:: inc/sdmmc_host.inc