|
|
@@ -3,6 +3,12 @@ SD/SDIO/MMC 驱动程序
|
|
|
|
|
|
:link_to_translation:`en:[English]`
|
|
|
|
|
|
+.. only:: esp32c3
|
|
|
+
|
|
|
+ .. warning::
|
|
|
+
|
|
|
+ 本文档尚未针对 ESP32-C3 进行更新。
|
|
|
+
|
|
|
概述
|
|
|
--------
|
|
|
|
|
|
@@ -35,20 +41,20 @@ ESP-IDF :example:`storage/sd_card` 目录下提供了 SDMMC 驱动与 FatFs 库
|
|
|
协议层 API
|
|
|
------------------
|
|
|
|
|
|
-协议层具备 :cpp:class:`sdmmc_host_t` 结构体,此结构体描述了 SD/MMC 主机驱动,列出了其功能,并提供指向驱动程序函数的指针。协议层将卡信息储存于 :cpp:class:`sdmmc_card_t` 结构体中。向 SD/MMC 主机发送命令时,协议层调用时需要一个 :cpp:class:`sdmmc_command_t` 结构体来描述命令、参数、预期返回值和需传输的数据(如有)。
|
|
|
+协议层具备 :cpp:class:`sdmmc_host_t` 结构体,此结构体描述了 SD/MMC 主机驱动,列出了其功能,并提供指向驱动程序函数的指针。协议层将卡信息储存于 :cpp:class:`sdmmc_card_t` 结构体中。向 SD/MMC 主机发送命令时,协议层调用时需要一个 :cpp:class:`sdmmc_command_t` 结构体来描述命令、参数、预期返回值和需传输的数据(如有)。
|
|
|
|
|
|
用于 SD 存储卡的 API
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
1. 初始化主机,请调用主机驱动函数,例如 :cpp:func:`sdmmc_host_init` 和 :cpp:func:`sdmmc_host_init_slot`;
|
|
|
2. 初始化卡,请调用 :cpp:func:`sdmmc_card_init`,并将参数 ``host`` (即主机驱动信息)和参数 ``card`` (指向 :cpp:class:`sdmmc_card_t` 结构体的指针)传递给此函数。函数运行结束后,将会向 :cpp:class:`sdmmc_card_t` 结构体填充该卡的信息;
|
|
|
-3. 读取或写入卡的扇区,请分别调用 :cpp:func:`sdmmc_read_sectors` 和 :cpp:func:`sdmmc_write_sectors`,并将参数 ``card`` (指向卡信息结构的指针)传递给函数;
|
|
|
+3. 读取或写入卡的扇区,请分别调用 :cpp:func:`sdmmc_read_sectors` 和 :cpp:func:`sdmmc_write_sectors`,并将参数 ``card`` (指向卡信息结构的指针)传递给函数;
|
|
|
4. 如果不再使用该卡,请调用主机驱动函数,例如 :cpp:func:`sdmmc_host_deinit`,以禁用主机外设,并释放驱动程序分配的资源。
|
|
|
|
|
|
用于 eMMC 芯片的 API
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
-从协议层的角度而言,eMMC 存储芯片与 SD 存储卡相同。尽管 eMMC 是芯片,不具备卡的外形,但由于协议相似 (`sdmmc_card_t`, `sdmmc_card_init`),用于 SD 卡的一些概念同样适用于 eMMC 芯片。注意,eMMC 芯片不可通过 SPI 使用,因此它与 SD API 主机驱动不兼容。
|
|
|
+从协议层的角度而言,eMMC 存储芯片与 SD 存储卡相同。尽管 eMMC 是芯片,不具备卡的外形,但由于协议相似 (`sdmmc_card_t`, `sdmmc_card_init`),用于 SD 卡的一些概念同样适用于 eMMC 芯片。注意,eMMC 芯片不可通过 SPI 使用,因此它与 SD API 主机驱动不兼容。
|
|
|
|
|
|
如需初始化 eMMC 内存并执行读/写操作,请参照上一章节 SD 卡操作步骤。
|
|
|
|
|
|
@@ -68,7 +74,7 @@ SDIO 卡初始化和检测过程与 SD 存储卡相同,唯一的区别是 SDIO
|
|
|
如需设置卡配置或传输数据,请根据您的具体情况选择下表中的函数:
|
|
|
|
|
|
========================================================================= ================================= =================================
|
|
|
-操作 读函数 写函数
|
|
|
+操作 读函数 写函数
|
|
|
========================================================================= ================================= =================================
|
|
|
使用 IO_RW_DIRECT (CMD52) 读写单个字节。 :cpp:func:`sdmmc_io_read_byte` :cpp:func:`sdmmc_io_write_byte`
|
|
|
使用 IO_RW_EXTENDED (CMD53) 的字节模式读写多个字节。 :cpp:func:`sdmmc_io_read_bytes` :cpp:func:`sdmmc_io_write_bytes`
|
|
|
@@ -76,7 +82,7 @@ SDIO 卡初始化和检测过程与 SD 存储卡相同,唯一的区别是 SDIO
|
|
|
========================================================================= ================================= =================================
|
|
|
|
|
|
使用 :cpp:func:`sdmmc_io_enable_int` 函数,应用程序可启用 SDIO 中断。
|
|
|
-
|
|
|
+
|
|
|
在单线模式下使用 SDIO 时,还需要连接 D1 线来启用 SDIO 中断。
|
|
|
|
|
|
如果您需要应用程序保持等待直至发生 SDIO 中断,请使用 :cpp:func:`sdmmc_io_wait_int` 函数。
|
|
|
@@ -84,7 +90,7 @@ SDIO 卡初始化和检测过程与 SD 存储卡相同,唯一的区别是 SDIO
|
|
|
|
|
|
复合卡(存储 + SDIO)
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
-
|
|
|
+
|
|
|
该驱动程序不支持 SDIO 复合卡,复合卡会被视为 SDIO 卡。
|
|
|
|
|
|
|