You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3上MicroPython调用readblocks()读SD卡原始数据返回全零

问题:ESP32-S3-CAM MicroPython下SD卡原始读写返回全零数据

我正在使用ESP32-S3-CAM WROOM FREENOVE开发板和MicroPython v1.24.1做项目,需要不通过文件系统直接读写SD卡原始数据,以充分利用256GB SD卡的全部空间。但调用readblocks()时,始终返回填充0x00的bytearray。

使用的代码如下:

from machine import SDCard

sd = SDCard(sck=39, mosi=38, miso=40) 

data = bytearray(512) 

sd.readblocks(1, data)

print(data)

已尝试操作

  • 通过PC在SD卡中写入带内容的文本文件,确认卡上存在数据;
  • 确认readblocks()调用符合SD卡块大小和块地址规范;
  • 尝试用writeblocks()修改SD卡原始数据,但无可见效果。

观察结果

  • 无论SD卡中写入什么内容,readblocks()始终返回全0的bytearray;
  • 预期应读取到PC写入的对应数据。

疑问

  1. 为何readblocks()仅返回全零?
  2. MicroPython中对SD卡做原始读写是否需要额外配置步骤?
  3. 是否存在硬件或machine.SDCard实现的问题?

补充信息

  • 开发板:ESP32-S3-CAM WROOM FREENOVE
  • SD卡:256GB容量,通过PC格式化
  • MicroPython版本:v1.24.1

可能的原因及解决建议

1. 缺失CS引脚配置

ESP32-S3-CAM的SD卡片选(CS)引脚未在代码中指定,FREENOVE这款开发板的SD卡CS引脚通常为41(需以实际原理图为准)。未指定CS引脚会导致无法正确选中SD卡,修改代码补充CS参数:

from machine import SDCard

# 根据板卡实际引脚调整CS值
sd = SDCard(sck=39, mosi=38, miso=40, cs=41) 
data = bytearray(512) 
sd.readblocks(1, data)
print(data)

2. SD卡块大小不匹配

256GB大容量SD卡可能被格式化为4096字节的块大小,而非默认的512字节。先获取SD卡实际块大小再调整读写的bytearray:

# 获取SD卡块大小
block_size = sd.ioctl(1, 0)
print(f"SD卡块大小: {block_size}")
# 用正确的块大小创建bytearray
data = bytearray(block_size)
sd.readblocks(1, data)
print(data)

3. 读取的块本身无数据

你读取的块1可能是MBR分区表或未使用区域,PC写入的文件数据并不在该块。可以先写入测试块再读取验证:

# 构造测试数据并填充到块大小
test_data = bytearray(b"TEST RAW SD DATA")
test_data.extend(b"\x00" * (512 - len(test_data)))
# 写入块100
sd.writeblocks(100, test_data)
# 读取验证
sd.readblocks(100, data)
print(data)

如果能读取到测试数据,说明之前读取的块本身为空。

4. 初始化状态或供电问题

检查SD卡是否初始化成功,大容量SD卡对供电要求更高,供电不足会导致读写失败:

print("SD卡就绪状态:", sd.is_ready())

若返回False,检查SD卡引脚连接是否松动、开发板供电是否稳定,或更换SD卡测试。

5. MicroPython版本兼容性

MicroPython v1.24.1可能存在ESP32-S3 SPI驱动的小bug,尝试更新到最新稳定版MicroPython,修复已知的SD卡读写问题。


内容的提问来源于stack exchange,提问作者IkonoDim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:53:26