此处讨论的是使用 SD 卡接口的使用,相对速度较快,不讨论以 SPI 方式的使用。
上下拉要求
直接使用会出现 CRC 校验错误的问题,报 0x107 或者 0x109 错误。见此Issues。
开启芯片的内置上拉也工作不稳定,偶尔会工作正常,但大部分还是出现了错误。
官方建议采取 10K 的外置上拉,但是会在 GPIO2 和 GPIO12 上会出现冲突。
GPIO2 在启动时下拉以进入 Flash 下载模式,但是采取外置上拉后会无法进入下载模式,不更新固件的话是没有问题的,可以正常使用,启动后直接开始运行程序。需要下载程序的话就需要去除外部上拉了,自行设计 pcb 的话需要用一个开关来选择是否连接上拉电阻。
GPIO12 需要在启动时下拉来选择 Flash 的工作电压为 3.3V。大部分模组的 Flash 工作电压都是 3.3V。所以这个选择是没有意义的,大部分的应用中应该都不会去更更换模组上的 Flash 吧。所以我们可以通过设置 efuse 来直接设置 Flash 工作电压,忽略 GPIO12,这样 GPIO12 直接上拉就可以了,不会干扰正常使用。
首先要安装 esptool,直接 pip 安装就可以了。之后进入安装路径,运行如下的 cmd 命令,COMX 替换为你的端口号。
注意!烧录 eFuses 是不可逆的,务必提前确定你的模组使用的 3.3V Flash。官方文档链接
esptool_py/esptool/espefuse.py --port COMX set_flash_voltage 3.3V
会输出如下日志:
espefuse.py v2.6
Connecting....
Enable internal flash voltage regulator (VDD_SDIO) to 3.3 V.
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.
完成后你可以使用如下命令检查 efuse 的状态:
components/esptool_py/esptool/espefuse.py --port COMX summary
设置完成后将 GPIO2 和 GPIO12 上拉到 3.3V,我使用的是 5.1K的电阻,因为手头没找到 10K 的,阻值大小数量级差不多即可。
然后就可以操作 sd 卡上的文件了
import os
os.mount(machine.SDCard(), "/sd") # 挂载 SD 卡
# your code here
os.umount("/sd") # 卸载 SD 卡
注意拔出卡前要关闭文件, 卸载 SD 卡,否则有可能损坏文件系统。
写入测速
读取测试文件
读取测速
写入:0.86 Mbyte/S
读取:1.26 Mbyte/S
注意,在使用 SD 卡,OLED 等有较大电流消耗的情况下启动 Wifi 可能会遇到 Brownout detector was triggered 错误,触发了电压保护,此时更换短一点,质量好一点的usb线,使用供电更充足的usb3.0口可以解决。