# SD 上拉需求

[English]

乐鑫硬件产品适用于多种场景，这些场景可能需要不同的管脚上拉状态。因此，要调整某些产品的特定管脚上拉状态，为 SD 总线提供所需的上拉电阻。

ESP32 使用 SPI 或 SDMMC 控制器与 SD 卡通信时，需要满足 SD 卡的上拉需求。当 SD 卡在 SPI 模式或 1 位 SD 模式下运行时，SD 总线的 CMD 和 DATA (DAT0 - DAT3) 线必须通过 10 kΩ 电阻上拉。SD 卡和 SDIO 设备也应在上述所有管脚（无论是否连接到主机）上有上拉电阻，以防设备进入错误状态。

默认情况下，如果 flash 电压为 3.3 V，则 MTDI strapping 管脚与 DAT2 线的上拉电阻不兼容。详情请参阅 MTDI strapping 管脚。

本文档涵盖以下章节内容：

- 兼容性概述 - 简要介绍乐鑫产品管脚的默认上拉状态与 SD 总线所需状态之间的兼容性

- 解决方案 - 解决兼容性问题的方案

- 相关信息 - 其他相关信息

## 兼容性概述

本节概述了在使用安全数字输入输出 (SDIO) 时可能出现的兼容性问题。SD 总线需要连接上拉电阻，因此要妥善解决与主机设备及从机设备有关的兼容性问题。下面每个问题都有相应解决方案的链接，主机设备和从机设备的解决方案可能有所不同。

### 片上系统 (SoCs)

- ESP32（除 D2WD 版本外，请参阅 ESP32 技术规格书）：

  > - 无上拉电阻

  > - 带有 3.3 V flash 芯片的模组，请参阅 Bootstrap 与 SDIO 在 DAT2 上的冲突

- ESP32-D2WD：

  > - 无上拉电阻

  > - GPIO12 无上拉电阻

### 系统级封装 (SIP)

- ESP32-PICO-D4：

  > - 无上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

### 模组

- ESP32-WROOM-32 系列模组，包括 ESP32-WROOM-32、ESP32-WROOM-32D、ESP32-WROOM-32U 和 ESP32-SOLO-1

  > - 无上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

- ESP32-WROVER 系列模组，包括 ESP32-WROVER 和 ESP32-WROVER-I

  > - 无上拉电阻

- ESP32-WROVER-B 系列模组，包括 ESP32-WROVER-B 和 ESP32-WROVER-IB

  > - 无上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

- ESP32-WROVER-E 系列模组，包括 ESP32-WROVER-E 和 ESP32-WROVER-IE

  > - 无上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

### 开发板

- ESP32-PICO-KIT，包括 PICO-KIT v4.1、v4.0 和 v3

  > - 无上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

  > - 下载模式不起效（次要问题）

- ESP32-DevKitC，包括 ESP32-DevKitC v4 和 v2

  > - 无上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

  > - 下载模式不起效（次要问题）

- ESP-WROVER-KIT

  > - 提供所需的上拉电阻

  > - GPIO13 上拉冲突 （v4.1、v3、v2 和 v1）

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突 （v4.1、v2 和 v1）

  > - 下载模式不起效（次要问题） （v2 和 v1）

  > 通过查看安装在开发板上的模组，可以确定所使用的 ESP32-WROVER-KIT 的版本：

  > - ESP32-WROVER-B 对应 v4.1 版本

  > - ESP32-WROVER 对应 v3 版本

  > - ESP32-WROOM-32 对应 v1 和 v2 版本

- ESP32-LyraTD-MSC

  > - 提供所需的上拉电阻

  > - Bootstrap 与 SDIO 在 DAT2 上的冲突

- ESP32-LyraT

  > - 提供所需的上拉电阻

  > - GPIO13 上拉冲突

### 非乐鑫主机

请确保 SDIO 主机为所有 SD 总线信号提供必要的上拉电阻。

## 解决方案

### 无上拉电阻

如果所使用的开发板没有上拉电阻，可以执行以下操作：

- 如果主机设备和从机设备在不同的开发板上，将其中一块开发板换为带有上拉电阻的开发板。如需了解哪些乐鑫开发板带有上拉电阻，请参阅 开发板。

- 用一个 10 kΩ 的电阻将每个需要上拉的管脚连接到 VDD，从而附加外部上拉电阻。

### GPIO13 上拉冲突

如果所用设备的 DAT3 没有正确上拉，可以参考下列操作：

- 使用 1 位 SD 模式并将设备的 DAT3 连接到 VDD

- 使用 SPI 模式

- 对 GPIO13 管脚执行以下操作之一：

    - 移除下拉电阻

    - 附加小于 5 kΩ 的上拉电阻（建议使用 2 kΩ 的电阻）

    - 在 1 位 SD 模式下，通过主机、或是通过 VDD 上的 3.3 V 电压，将管脚拉高或驱动到高电平。

### Bootstrap 与 SDIO 在 DAT2 上的冲突

ESP32 的启动 strapping 需求与 SDIO 协议之间存在冲突。详情请参阅 MTDI strapping 管脚。

要解决此冲突，可参考以下选项：

1.（推荐）烧录选择 flash 电压的 eFuse。该操作会将内部调节器的输出电压永久配置为 3.3 V，并且 GPIO12 将不再用作 strapping 管脚。烧录完成后，将上拉电阻连接到 GPIO12。

警告

烧录 eFuse 是不可逆的！上述问题清单可能已经过时，因此请确保要烧录的模组内嵌 3.3 V flash 芯片，可前往 https://www.espressif.com/ 进行确认。如果在带有 1.8 V flash 芯片的模组上烧录 3.3 V eFuse，模组将停止工作。

如果确定要烧录 eFuse，请转到 ESP-IDF 目录下，通过 `espefuse` 工具运行以下命令：

    espefuse set-flash-voltage 3.3V

此命令将烧录 `XPD_SDIO_TIEH`、`XPD_SDIO_FORCE` 和 `XPD_SDIO_REG` eFuse。当以上三个 eFuse 被烧录为 1 时，内部 VDD_SDIO flash 电压调节器将被永久设置为 3.3 V。如果烧录成功，将看到以下日志：

    espefuse v5.0.2
    Connecting....

    === Run "set-flash-voltage" command ===
    Enable internal flash voltage regulator (VDD_SDIO) to 3.3V.
    The following eFuses are burned: XPD_SDIO_FORCE, XPD_SDIO_REG, XPD_SDIO_TIEH.
    VDD_SDIO setting complete.

    Check all blocks for burn...
    idx, BLOCK_NAME,          Conclusion
    [00] BLOCK0               is not empty
            (written ): 0x0000000400182226000004320000a8b0002bc8f09e47e69800000000
            (to write): 0x00000000000000000001c00000000000000000000000000000000000
            (coding scheme = NONE)
    .
    This is an irreversible operation!
    Type 'BURN' (all capitals) to continue.
    BURN
    BURN BLOCK0  - OK (write block == read block)
    Reading updated eFuses...
    Successful.

要检查 eFuse 的状态，请运行：

    idf.py efuse-summary

如果运行自动烧录脚本，最好使用独立的 eFuse 工具 `espefuse`。此工具还具有 `--do-not-confirm` 选项，可在无需确认的情况下烧录 eFuse。

有关烧录 eFuse 的更多信息，请参阅 ESP32 技术参考手册 [PDF]。

2. 如果使用 1 位 SD 模式或 SPI 模式，请断开 DAT2 管脚并确保其被拉高。可以采取下列两个选项之一：

- 使主机的 DAT2 管脚悬空，并将从机设备的 DAT2 直接连接到 VDD。

- 对于从机设备，构建具有 `SDIO_SLAVE_FLAG_DAT2_DISABLED` 选项的固件并重新烧录设备，此选项可避免从机设备检测 DAT2 线。请注意，CCCR 寄存器将不再支持 4 位 SD 模式，但主机并不知晓这一点，因此必须在主机端禁用 4 位 SD 模式。

### GPIO12 无上拉电阻

所用模组与 SDIO 协议兼容，只需通过 10 kΩ 电阻将 GPIO12 连接到 VDD 即可。

### 下载模式不起效（次要问题）

当 GPIO2 管脚根据 SD 上拉需求被拉高时，将无法进入下载模式，因为 GPIO2 是一个 strapping 管脚，下载模式下必须被拉低。

可参考以下解决方案：

- 对于需要用跳线短接 GPIO0 和 GPIO2 管脚的开发板，跳线连接完成后，自动复位电路会在进入下载模式前将 GPIO2 与 GPIO0 一起拉低。

- 对于 GPIO2 管脚上连有组件（例如下拉电阻和/或 LED）的开发板，请查看开发板的原理图，确认连接到 GPIO2 上组件的具体情况。

  > - LED 大多数情况下不会影响操作。

  > - 下拉电阻 可能会干扰 DAT0 信号，必须移除。

如果上述解决方案无效，请检查主机或从机设备是否带有会影响 GPIO2 的上拉电阻，如有，将其移除。

## 相关信息

### MTDI strapping 管脚

MTDI (GPIO12) 为 strapping 管脚，用于选择内部调节器 (VDD_SDIO) 的输出电压，为 flash 芯片供电。该管脚带有内部下拉电阻，因此若处于未连接状态，MTDI 管脚将在启动时读取低电平，选择默认的 3.3 V 操作。

使用 1.8 V flash 的 ESP32 模组（如 ESP32-WROVER 和 ESP32-WROVER-I），在 GPIO12 上有上拉电阻。使用 3.3 V flash 的其他 ESP32 模组，在 GPIO12 上无上拉电阻，该管脚在芯片内部为弱下拉。

为 GPIO12 添加上拉电阻以进行 SD 卡操作时，请考虑以下事项：

- 在不使用内部调节器 (VDD_SDIO) 为 flash 供电的开发板上，GPIO12 可以被拉高。

- 在使用 1.8 V flash 芯片的开发板上，复位时 GPIO12 需要被拉高，这与 SD 卡操作完全兼容。

- 在使用内部调节器和 3.3 V flash 芯片的开发板上，复位时 GPIO12 必须被拉低，这与 SD 卡操作不兼容。有关乐鑫开发板与 SD 卡操作之间的兼容性问题，详情请参阅 兼容性概述。

### 内部上拉和 strapping 需求

使用外部电阻始终是更优选择。乐鑫产品中的内部弱上拉和下拉电阻启用后可以代替外部电阻，但此解决方案并不能保证可靠的 SDIO 通信。

话虽如此，有关内部上拉和 strapping 需求的信息仍有一些参考价值。乐鑫硬件产品不同管脚（CMD 和 DATA 等）的内部弱上拉和弱下拉电阻的默认连接情况不同。下表展示了 CMD 和 DATA 管脚的默认上拉和下拉状态。

表中使用了以下缩写：

- WPU：SoC 内部的弱上拉电阻

- WPD：SoC 内部的弱下拉电阻

- PU：位于乐鑫模组内部、SoC 外部的上拉电阻

CMD 和 DATA 管脚的默认上拉和下拉状态
GPIO 编号 | 管脚名 | 启动状态 | strapping 需求
--- | --- | --- | ---
15 | CMD | WPU |
2 | DAT0 | WPD | 下载模式要求低电平
4 | DAT1 | WPD |
12 | DAT2 | 使用 1.8 V flash 时为 PU；3.3 V flash 时为 WPD | 使用 1.8 V flash 时要求高电平；3.3 V flash 时要求低电平
13 | DAT3 | WPU |

此文档对您有帮助吗？

- 反馈已收到，谢谢！
- 如果您有其他意见，欢迎填写乐鑫文档反馈表。

- 我们重视您的反馈。
- 您可以填写乐鑫文档反馈表告诉我们如何改进该文档。