ESP32 下 micropython 使用 SD卡

此处讨论的是使用 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口可以解决。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。