一般板子容量有限,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. 欧几里德算法与扩展欧几里德算法
  2. 设计模式笔记二:抽象工厂模式
  3. java语言程序设计基础篇课后答案_《Java语言程序设计:基础篇》课后复习题答案-第十五章.pdf...
  4. python2 字符串函数_笔记六:python2字符串运算与函数
  5. 将图像中的某种颜色设为透明
  6. 传智播客毕向东java基础全套视频教程_传智播客毕向东JAVA基础教程全套视频教程(324课)...
  7. javascript写的一个练习打字的小程序
  8. 列车停站方案_城市轨道交通列车停站方案
  9. 與情分析系统,包括爬虫、文本摘要、主题分类、情感倾向性识别以及可视化...
  10. Windows操作系统截屏快捷键
  11. 你的华为手机还会卡?那是这3个功能没设置吧,越早关掉越好
  12. 深入探索 Android 网络优化(一、网络筑基篇,为什么Flutter能最好地改变移动开发
  13. PLC需要有什么样的基础才能学?
  14. 因 N-API 发音对黑人的头发不友好,Node.js 官方将其改名为 Node-API
  15. 区块链公链生态-赛道分类
  16. 微信小程序 之 原生开发
  17. 简单解释 P2P 技术之 UDP 打洞
  18. win7计算机文件夹折叠,win7系统折叠组窗口设置不折叠的操作方法
  19. VHDL语言基本单元及其构成——EDA学习笔记(一)
  20. 将excel数据导入数据库的表中的方法

热门文章

  1. Genbank的gbff格式转gff3格式
  2. ddtv.space index.php,图解MongoDB原理(二)
  3. Python中字典的应用及相关操作!
  4. javafx 实现绘图板
  5. 空间统计--空间关系建模工具集,Modeling Spatial Relationships
  6. 老夫金钟罩铁布衫纵横江湖数十年
  7. 铁路巡检及指挥调度系统
  8. linux系统安装hba驱动,RedHat Linux下的HBA驱动安装
  9. 【解纠缠表示:图像增强】
  10. 正交矩阵的定义及证明和性质