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写入的对应数据。
疑问
- 为何
readblocks()仅返回全零? - MicroPython中对SD卡做原始读写是否需要额外配置步骤?
- 是否存在硬件或
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
相关产品推荐
相关产品推荐

