ESP32 SDIO 使用教程
本文旨在说明如何使用标准的 ESP32-WROOM-32D 开发板进行 SDIO 的通信。
本文档适用于所有需要与 ESP32 SDIO slave 通信的方案和应用,目前主要应用为 ESP-AT 使用 SDIO 进行通信,以及 esp-hosted 的 SDIO 通信。
另外 MCU 侧使用 SPI ,而 ESP32 使用 SDIO slave ,即采用 SDIO SPI 模式通信的场景也适用于本文档,如 ESP32-AT 的 SDSPI 方案。
本文主要参考乐鑫官方文档中的 SD Pull-up Requirements 章节,如果使用的不是 ESP32-WROOM-32D 开发板, 可根据章节中的说明进行修改。
硬件准备
- 20K 欧姆电阻 6 根
- ESP32-WROOM-32D 开发板
- 杜邦线若干
- 面包板
连接方法
将 IO13,IO14, IO15, IO2, IO4, IO12 这 6 个管脚使用 20K 欧姆电阻进行上拉,可以将 20K 欧姆一端接到 3V3,另一端接到对应的管脚,如下图所示:
改写 EFUSE 数据
SDIO 管脚 IO12 本身还是一个 boot strapping 管脚,这个管脚上电时的电平状态与 SDIO 传输相冲突, 为了解决这种冲突,一般推荐在 efuse 中将供给 flash 的电压固定为 3.3V,这样 GPIO12 将不会再作为 strapping 管脚。
改写 EFUSE 数据的方法是使 ESP32 进入下载模式(IO0 接地),然后在 IDF 目录下执行如下命令
$ ./components/esptool_py/esptool/espefuse.py -p <serial_port> set_flash_voltage 3.3V
其中: <serial_port> 在 ubuntu 中为 /dev/ttyUSBX, 在 Windows 上为 COMX
打开串口后会出现如下 log,需要手动输入BURN
才会真正执行擦除 efuse 电压的操作
espefuse.py v2.8
Connecting....
Enable internal flash voltage regulator (VDD_SDIO) to 3.3V.
The following efuses are burned: XPD_SDIO_FORCE, XPD_SDIO_REG, XPD_SDIO_TIEH.
This is an irreversible operation.
Type 'BURN' (all capitals) to continue.
BURN
VDD_SDIO setting complete.
注意: 目前乐鑫绝大多数都是 3.3V flash,但仍有少量产品使用的是 1.8V flash, 改写 efuse 电压数据可能导致 1.8V 的 flash 损坏,因此,使用之前,请详细阅读使用产品的手册说明。
测试
目前 ESP32 SDIO slave 使用场景主要是 AT 项目和 esp-hosted 项目,以下测试基于这两种方案。
SDIO AT 通信
slave 侧
ESP-AT 的下载和编译方法可以参考这里。
需要注意的是,默认的 ESP-AT 使用 UART 进行通信,想要 SDIO 进行通信,需要做如下修改:
- 先将默认使用 UART 的 AT 根据 esp-at 中的说明编译成功
- 在配置项中更改使用 SDIO 进行通信。
./build.py menuconfig
-