一般板子容量有限,8M都算很大了,如果想扩容咋办,那就自己加sd卡,其实micropython固件自带了machine.SDCard,但是我没测出来,于是直接在GAY站上搜了一个,测试成功,一个sd卡扩展模块才1.6元,问题在于一般其实没有那么大的内存需求,加了扩展模块需要占用一个spi口,外加CS,一共用掉4个pin
sd.py

"""
MicroPython driver for SD cards using SPI bus.
Requires an SPI bus and a CS pin.  Provides readblocks and writeblocks
methods so the device can be mounted as a filesystem.
Example usage on pyboard:import pyb, sdcard, ossd = sdcard.SDCard(pyb.SPI(1), pyb.Pin.board.X5)pyb.mount(sd, '/sd2')os.listdir('/')
Example usage on ESP8266:import machine, sdcard, ossd = sdcard.SDCard(machine.SPI(1), machine.Pin(15))os.mount(sd, '/sd')os.listdir('/')
"""from micropython import const
import time_CMD_TIMEOUT = const(100)_R1_IDLE_STATE = const(1 << 0)
# R1_ERASE_RESET = const(1 << 1)
_R1_ILLEGAL_COMMAND = const(1 << 2)
# R1_COM_CRC_ERROR = const(1 << 3)
# R1_ERASE_SEQUENCE_ERROR = const(1 << 4)
# R1_ADDRESS_ERROR = const(1 << 5)
# R1_PARAMETER_ERROR = const(1 << 6)
_TOKEN_CMD25 = const(0xFC)
_TOKEN_STOP_TRAN = const(0xFD)
_TOKEN_DATA = const(0xFE)class SDCard:def __init__(self, spi, cs, baudrate=1320000):self.spi = spiself.cs = csself.cmdbuf = bytearray(6)self.dummybuf = bytearray(512)self.tokenbuf = bytearray(1)for i in range(512):self.dummybuf[i] = 0xFFself.dummybuf_memoryview = memoryview(self.dummybuf)# initialise the cardself.init_card(baudrate)def init_spi(self, baudrate):try:master = self.spi.MASTERexcept AttributeError:# on ESP8266self.spi.init(baudrate=baudrate, phase=0, polarity=0)else:# on pyboardself.spi.init(master, baudrate=baudrate, phase=0, polarity=0)def init_card(self, baudrate):# init CS pinself.cs.init(self.cs.OUT, value=1)# init SPI bus; use low data rate for initialisationself.init_spi(100000)# clock card at least 100 cycles with cs highfor i in range(16):self.spi.write(b"\xff")# CMD0: init card; should return _R1_IDLE_STATE (allow 5 attempts)for _ in range(5):if self.cmd(0, 0, 0x95) == _R1_IDLE_STATE:breakelse:raise OSError("no SD card")# CMD8: determine card versionr = self.cmd(8, 0x01AA, 0x87, 4)if r == _R1_IDLE_STATE:self.init_card_v2()elif r == (_R1_IDLE_STATE | _R1_ILLEGAL_COMMAND):self.init_card_v1()else:raise OSError("couldn't determine SD card version")# get the number of sectors# CMD9: response R2 (R1 byte + 16-byte block read)if self.cmd(9, 0, 0, 0, False) != 0:raise OSError("no response from SD card")csd = bytearray(16)self.readinto(csd)if csd[0] & 0xC0 == 0x40:  # CSD version 2.0self.sectors = ((csd[8] << 8 | csd[9]) + 1) * 1024elif csd[0] & 0xC0 == 0x00:  # CSD version 1.0 (old, <=2GB)c_size = csd[6] & 0b11 | csd[7] << 2 | (csd[8] & 0b11000000) << 4c_size_mult = ((csd[9] & 0b11) << 1) | csd[10] >> 7self.sectors = (c_size + 1) * (2 ** (c_size_mult + 2))else:raise OSError("SD card CSD format not supported")# print('sectors', self.sectors)# CMD16: set block length to 512 bytesif self.cmd(16, 512, 0) != 0:raise OSError("can't set 512 block size")# set to high data rate now that it's initialisedself.init_spi(baudrate)def init_card_v1(self):for i in range(_CMD_TIMEOUT):self.cmd(55, 0, 0)if self.cmd(41, 0, 0) == 0:self.cdv = 512# print("[SDCard] v1 card")returnraise OSError("timeout waiting for v1 card")def init_card_v2(self):for i in range(_CMD_TIMEOUT):time.sleep_ms(50)self.cmd(58, 0, 0, 4)self.cmd(55, 0, 0)if self.cmd(41, 0x40000000, 0) == 0:self.cmd(58, 0, 0, 4)self.cdv = 1# print("[SDCard] v2 card")returnraise OSError("timeout waiting for v2 card")def cmd(self, cmd, arg, crc, final=0, release=True, skip1=False):self.cs(0)# create and send the commandbuf = self.cmdbufbuf[0] = 0x40 | cmdbuf[1] = arg >> 24buf[2] = arg >> 16buf[3] = arg >> 8buf[4] = argbuf[5] = crcself.spi.write(buf)if skip1:self.spi.readinto(self.tokenbuf, 0xFF)# wait for the response (response[7] == 0)for i in range(_CMD_TIMEOUT):self.spi.readinto(self.tokenbuf, 0xFF)response = self.tokenbuf[0]if not (response & 0x80):# this could be a big-endian integer that we are getting herefor j in range(final):self.spi.write(b"\xff")if release:self.cs(1)self.spi.write(b"\xff")return response# timeoutself.cs(1)self.spi.write(b"\xff")return -1def readinto(self, buf):self.cs(0)# read until start byte (0xff)for i in range(_CMD_TIMEOUT):self.spi.readinto(self.tokenbuf, 0xFF)if self.tokenbuf[0] == _TOKEN_DATA:breaktime.sleep_ms(1)else:self.cs(1)raise OSError("timeout waiting for response")# read datamv = self.dummybuf_memoryviewif len(buf) != len(mv):mv = mv[: len(buf)]self.spi.write_readinto(mv, buf)# read checksumself.spi.write(b"\xff")self.spi.write(b"\xff")self.cs(1)self.spi.write(b"\xff")def write(self, token, buf):self.cs(0)# send: start of block, data, checksumself.spi.read(1, token)self.spi.write(buf)self.spi.write(b"\xff")self.spi.write(b"\xff")# check the responseif (self.spi.read(1, 0xFF)[0] & 0x1F) != 0x05:self.cs(1)self.spi.write(b"\xff")return# wait for write to finishwhile self.spi.read(1, 0xFF)[0] == 0:passself.cs(1)self.spi.write(b"\xff")def write_token(self, token):self.cs(0)self.spi.read(1, token)self.spi.write(b"\xff")# wait for write to finishwhile self.spi.read(1, 0xFF)[0] == 0x00:passself.cs(1)self.spi.write(b"\xff")def readblocks(self, block_num, buf):nblocks = len(buf) // 512assert nblocks and not len(buf) % 512, "Buffer length is invalid"if nblocks == 1:# CMD17: set read address for single blockif self.cmd(17, block_num * self.cdv, 0, release=False) != 0:# release the cardself.cs(1)raise OSError(5)  # EIO# receive the data and release cardself.readinto(buf)else:# CMD18: set read address for multiple blocksif self.cmd(18, block_num * self.cdv, 0, release=False) != 0:# release the cardself.cs(1)raise OSError(5)  # EIOoffset = 0mv = memoryview(buf)while nblocks:# receive the data and release cardself.readinto(mv[offset : offset + 512])offset += 512nblocks -= 1if self.cmd(12, 0, 0xFF, skip1=True):raise OSError(5)  # EIOdef writeblocks(self, block_num, buf):nblocks, err = divmod(len(buf), 512)assert nblocks and not err, "Buffer length is invalid"if nblocks == 1:# CMD24: set write address for single blockif self.cmd(24, block_num * self.cdv, 0) != 0:raise OSError(5)  # EIO# send the dataself.write(_TOKEN_DATA, buf)else:# CMD25: set write address for first blockif self.cmd(25, block_num * self.cdv, 0) != 0:raise OSError(5)  # EIO# send the dataoffset = 0mv = memoryview(buf)while nblocks:self.write(_TOKEN_CMD25, mv[offset : offset + 512])offset += 512nblocks -= 1self.write_token(_TOKEN_STOP_TRAN)def ioctl(self, op, arg):if op == 4:  # get number of blocksreturn self.sectors

test.py

import machine, sd, os
from machine import SPI,Pin
spitf=SPI(baudrate=2000000, sck=Pin(18), mosi=Pin(19),miso=Pin(23))
tf = sd.SDCard(spitf,Pin(5))
os.mount(tf, '/sd')
os.listdir('/')

然后直接在thonny里面发现目录里多了一个sd文件夹,他就是我们亲爱的sd卡了,亲测上传下载文件都正常。

micropython里面外接tf(sd)卡读取模块相关推荐

  1. 【紫光同创国产FPGA教程】【第十四章】SD卡读取BMP图片显示例程

    本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.alinx.com). 1. 实验简介 在前面的实验中我们练习了SD卡读 ...

  2. ESP32 ESP-IDF使用TF(SD)卡

    陈拓 2022/01/12-2022/01/13 1. 概述 官方文档 https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/a ...

  3. java生成点阵图_Android从SD卡读取图片并显示为点阵图

    之前做一个项目的时候需要1.从SD卡读取图片转为预览图(点阵图,类似马赛克),2.保存当前预览图到特定文件夹,保存为一个txt,txt里存的是像素矩阵.3.从那个特定文件夹里读取像素矩阵,显示为预览图 ...

  4. SD,TF,SD卡檢測腳

    SD,TF,SD卡檢測腳 SD卡腳位 TF卡腳位 SD侦测脚 RK代码 SD卡腳位 針腳 名称 描述 1 CD/DAT3 卡监测/数据位3 2 CMD 命令/回复 3 VSS1 GND 4 VCC 电 ...

  5. ESP32基于Arduino框架,SD卡+MAX98357模块+MP3播放器

    ESP32基于Arduino框架,SD卡+MAX98357模块+MP3播放器

  6. Arduino UNO驱动micro SD卡读写模块

    目录 一.简介 二.使用前准备 三.测试方法 四.实验现象 一.简介 Micro SD卡模块TF卡读写卡器板载电平转换电路,即接口电平可为5V或3.3V,支持支持Micro SD卡(≤2G).Micr ...

  7. lwip-2.1.3自带的httpd网页服务器使用教程(一)从SD卡读取网页文件并显示

    概述 本教程使用的单片机是STM32F103ZE,有线网口芯片为ENC28J60. 本教程里面的网页由于需要兼容Windows XP系统的IE8浏览器,所以采用HTML 4.01编写,不使用任何前端框 ...

  8. k210 C语言开发-4 从sd卡读取播放烟花视频

    k210 C语言开发-4 先上成果图吧,祝大伙新年快乐! B站原视频.完整代码在文末. 前天无意中看到CSDN有个活动,我一看只要是和烟花相关的都可以,然后我就准备用k210播放个烟花视频.结果我哼哧 ...

  9. K210 SD卡读取不到

    记录一下:最近入手K210,插上SD卡后连电脑忽然发现SD读取不到,找了半天也没找出问题所在,格式化和分区都试了,后来在一个人的评论那里看到K210是没有虚拟内存的,只能先存在SD卡里面然后再用,当然 ...

最新文章

  1. Linux环境PHP7.0安装
  2. C语言const专题
  3. 点击打印出现IE已经阻止此站点用不安全方式使用 ActiveX 控件解决方
  4. python函数模块讲解_课堂练习讲解_模块化函数封装
  5. mysql忘记命令后半部分_Mysql 5 易忘的命令
  6. 【转】Magento 2数据库EAV模型结构
  7. java 如何判断操作系统是Linux还是Windows
  8. 大数据杀熟行为10月1日起明令禁止;阿里一号工程“犀牛制造”正式亮相;iOS 14 正式版发布 | 极客头条...
  9. iOS GBK转换为Utf8
  10. asp.net中使用mschart控件
  11. Java程序员 面试如何介绍项目经验?
  12. SQL语句中对时间字段进行区间查询
  13. 内推 | 这可能是2019年最难得的机会之一啦~
  14. jzoj6495 死星 (竞赛图五元环)
  15. SkyLine——3DGIS三维地理信息系统软件产品介绍
  16. 《九日集训》第五天打卡
  17. 【大数据技术分享】数据清理的终极指南
  18. 第一周校内OI模拟赛总结(day1day2)
  19. 使用php读取大量列的excel数据
  20. 逆战班---《JS操作汉字时钟详解》

热门文章

  1. 2020.9.30 PYTHON 自复习笔记
  2. [附源码]java毕业设计学生互评的在线作业管理系统
  3. 推出更安静的通知权限界面
  4. 关于Win10应用商店打不开一直转圈圈的问题
  5. storyboard 苹果启动图_使用Xcode storyboard 来提供 app 的启动屏幕
  6. signature=6846357f033a668e61dd424f68d4d1c2,Wybrane aspekty zwinności organizacyjnej
  7. 题注自动带章节编号 and怎样删除Word题注标签和编号间的空格?
  8. 大搜车与永达二手车合作,大型汽车经销商加快数字化进程
  9. linux 扫描 hba卡磁盘,Linux下更换HBA卡重新扫盘
  10. 关于互联网时代的自助旅游