BPI-Leaf-S3 在MicroPython中使用 machine.SDCard(),无需额外的驱动库

BPI-Leaf-S3 板载8MB Flash ROM,安装完micropython固件后,可用容量仍有5MB左右,可以存放大量的python脚本文件,或少量的多媒体内容。

如果有超过5MB的使用需求,或想要节约Flash的读写寿命,使用一张SD卡扩展存储容量是最经济实惠的选择,而且SD卡 SPI接口模块也很廉价。

准备

以下例程需要使用一块micro SDCard 与一个Micro SD卡SPI接口模块,一个已经安装了MicroPython固件的开发板,例如BPI-Leaf-S3。

python环境,mpremote安装, VScode打开终端,mpremote连接开发板, 基本文件操作参考此帖:
BPI-Leaf-S3使用mpremote工具在VScode IDE中编程,基础应用示例。 ESP32-S3 & MicroPython

推荐也尝试一下 PyCharm Community,此为社区版,可免费使用。

接线参考

SD卡SPI接口模块 BPI-Leaf-S3开发板
GND GND
VCC 3.3V
MISO 15
MOSI 16
SCK 17
CS 18

接线对应以下例程中的代码,可按需修改GPIO。

MicroPython

class SDCard

machine.SDCard(slot=1, width=1, cd=None, wp=None, sck=None, miso=None, mosi=None, cs=None, freq=20000000)¶
  • slot 选择接口,0和1使用 内置SD/MMC硬件,而2和3使用SPI接口。
  • sck,miso,mosi,cs用于设置SPI接口所用GPIO。
  • freq 设置通信频率,默认的20Mhz不一定适配所有SD卡,如果无法正常使用,可以尝试降低频率,例如使用15Mhz。

更多信息参考 MicroPython DOCs: machine.SDCard

  1. 在PC本地新建一个文件夹,新建 boot.py 文件,代码如下。

    import os
    import machine
    
    try:
        sd = machine.SDCard(slot=2, miso=15, mosi=16, sck=17, cs=18, freq=15000000)
        vfs = os.VfsFat(sd)
        os.mount(vfs, "/sd")
    except OSError as e:
        print("OSError:", e)
        print("SDCard failed.")
    else:
        print("/sd:", os.listdir('/sd'))
    finally:
        print("/:", os.listdir('/'))
    
    
  2. 在终端中,进入此文件夹所在的路径,使用mpremote拷贝文件到开发板的flash中,命令如下。

    mpremote connect COM21 cp boot.py :
    
  3. 进入REPL,使用快捷键 ctrl+D 使开发板软复位,如果SD卡正常工作,则会看到以下内容。

    MPY: soft reboot
    /sd: []
    /: ['sd','boot.py']
    
  4. 如果提示了报错信息,则需确定接线是否正确,SD卡是否有格式化为FAT32格式。若已检查确认无接线问题和格式问题,则可尝试降低SPI通信频率,例如以下代码。

    sd = machine.SDCard(slot=2, miso=15, mosi=16, sck=17, cs=18, freq=1320000)
    
  5. 当确认SD卡正常工作后,新建一个 test.py 文件,代码如下。

    import time
    
    from machine import Pin
    from neopixel import NeoPixel
    
    pin_48 = Pin(48, Pin.OUT)
    np = NeoPixel(pin_48, 1, bpp=3, timing=1)
    
    RED = (255, 0, 0)
    ORANGE = (255, 100, 0)
    YELLOW = (255, 255, 0)
    GREEN = (0, 255, 0)
    CYAN = (0, 255, 255)
    BLUE = (0, 0, 255)
    PURPLE = (180, 0, 255)
    WHITE = (255, 255, 255)
    OFF = (0, 0, 0)
    
    color_list = [RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE, OFF]
    brightness = 0.1
    
    while True:
        for i in color_list:
            color = (round(i[0] * brightness), round(i[1] * brightness), round(i[2] * brightness))
            np[0] = color
            np.write()
            print(color)
            time.sleep(1)
    
    
  6. 将其拷贝至sd卡中,命令如下。

    mpremote connect COM21 cp test.py :sd/test.py
    
  7. 再新建一个 main.py 文件,代码如下。拷贝到开发板后,此程序将读取并执行 sd/test.py 文件中的程序代码。

    with open('sd/test.py', 'r') as file:
        exec(file.read())
    
    
  8. 将其拷贝至开发板的flash中,命令如下:

    mpremote connect COM21 cp main.py :
    
  9. 复位开发板,板载RGB LED应点亮,打开REPL,能看到输出的RGB信息。