class SDCard – SD-/MMC-Kartentreiber

Die Klasse SDCard steuert den SD-/MMC-Kartenslot auf OpenMV-Kameras, die über einen solchen verfügen. Der Treiber implementiert die Schnittstelle vfs.AbstractBlockDev, sodass er direkt an vfs.mount() übergeben werden kann:

import machine
import vfs

sd = machine.SDCard()
vfs.mount(sd, "/sd")

Bemerkung

Die OpenMV-Firmware bindet die SD-Karte beim Booten automatisch ein, sodass die meisten Skripte niemals direkt ein SDCard-Objekt erzeugen – sie lesen und schreiben einfach über den automatisch eingebundenen Pfad. Erzeugen Sie eines nur dann manuell, wenn Sie einen vom Standard abweichenden Einhängepunkt oder rohen blockbasierten Zugriff über readblocks() / writeblocks() / ioctl() benötigen.

Auf der OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 wird der Slot vom On-Chip-SDMMC-Controller des STM32 im 4-Bit-SD-Modus angesteuert. Auf der OpenMV Cam RT1062 wird der Slot vom USDHC-Controller des i.MX RT angesteuert, ebenfalls im 4-Bit-SD-Modus. Auf keiner aktuellen OpenMV-Platine sind Pin-Mux-Argumente erforderlich – der Treiber kennt die Verdrahtung der Platine.

Nicht verfügbar auf der OpenMV Cam AE3 (alif-Port).

Konstruktoren

class machine.SDCard(id: int = 1) SDCard

Gibt das SDCard-Singleton für den durch id identifizierten SD-Slot zurück. id wird zur portübergreifenden Kompatibilität akzeptiert, aber die von OpenMV unterstützten Ports stellen nur einen Slot bereit; übergeben Sie 1 oder lassen Sie das Argument weg.

Auf STM32 nimmt der Konstruktor überhaupt keine Argumente entgegen; auf mimxrt wird das Argument id akzeptiert, aber nur 1 ist gültig.

Methoden

present() bool

Gibt True zurück, wenn aktuell eine Karte im Slot erkannt wird, andernfalls False.

Auf Platinen mit verdrahtetem Karten-Erkennungssignal spiegelt die Methode dieses Signal in Echtzeit wider, sodass sie nach dem Erstellen des SDCard-Objekts abgefragt werden kann, um auf Einstecken/Entfernen im laufenden Betrieb zu reagieren. Auf Platinen ohne Karten-Erkennungssignal wird der Wert zur Konstruktionszeit zwischengespeichert – er meldet das Ergebnis der initialen CMD0-Abfrage, die der Treiber beim Erstellen des Objekts durchgeführt hat, und eine danach im laufenden Betrieb eingesteckte Karte wird erst sichtbar, wenn das Objekt neu erstellt wird (oder init() auf mimxrt aufgerufen wird).

info() tuple[int, int, int]

Gibt ein 3-Tupel zurück, das die aktuell eingesteckte Karte beschreibt:

  • [0] num_blocks – Gesamtkapazität in 512-Byte-Blöcken. Multiplizieren Sie mit 512, um die rohe Byte-Kapazität zu erhalten.

  • [1] block_size – für SD-Karten immer 512. Enthalten, damit Aufrufer portabel num_blocks * block_size berechnen können.

  • [2] card_type – der vom SD-Bus während des CMD8-/OCR-Initialisierungs-Handshakes gemeldete Kartentyp. Typische Werte sind 0 (SDSC – Standardkapazität), 0x40 (SDHC / SDXC – hohe / erweiterte Kapazität) und 0x80 (MMC).

Nützlich, um zu prüfen, ob die Karte erkannt wurde, oder um Angaben zum freien Speicherplatz im Verhältnis zur Gesamtkapazität anzuzeigen.

power(state: bool, /) None

Schaltet die Stromversorgung des Kartenslots ein oder aus. Die STM32-Firmware stellt die Methode bereit, aber keine aktuelle OpenMV Cam schaltet die SD-Stromversorgung, sodass der Aufruf faktisch wirkungslos ist. Beibehalten zur Kompatibilität mit Code, der ursprünglich für die Upstream-MicroPython-STM32-Referenzplatinen geschrieben wurde. Nur STM32-Port.

read(block_num: int, /) bytes

Liest einen einzelnen 512-Byte-Block von der Karte und gibt ihn als neu zugewiesenes bytes-Objekt zurück.

Dies ist die vom STM32-Port ausgelieferte ältere Einzelblock-Lesefunktion. Neuer Code sollte stattdessen readblocks() verwenden – diese Methode funktioniert auf jedem OpenMV-Port, kann beliebig viele zusammenhängende Blöcke in einer einzigen Übertragung lesen und vermeidet die Zuweisung pro Aufruf, indem sie in einen vom Aufrufer bereitgestellten Puffer schreibt. Nur STM32-Port.

write(block_num: int, data: bytes, /) None

Schreibt einen einzelnen 512-Byte-Block auf die Karte. data muss genau 512 Byte lang sein.

Dies ist die vom STM32-Port ausgelieferte ältere Einzelblock-Schreibfunktion; neuer Code sollte stattdessen writeblocks() verwenden, das auf jedem OpenMV-Port funktioniert und beliebig viele zusammenhängende Blöcke pro Aufruf schreiben kann. Nur STM32-Port.

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Liest rohe blockorientierte Daten von der Karte in buf. Standard-Einstiegspunkt für Blockgeräte gemäß vfs.AbstractBlockDev, der von der Dateisystemschicht verwendet wird.

Einfache Form (readblocks(block_num, buf)): liest ganze Blöcke ab dem Blockindex block_num. len(buf) muss ein Vielfaches der SD-Blockgröße (512 Byte) sein.

Erweiterte Form (readblocks(block_num, buf, offset)): liest len(buf) Byte – nicht notwendigerweise eine ganze Anzahl von Blöcken – ab Byte offset innerhalb von Block block_num. Wird von littlefs und anderen byteadressierbaren Dateisystemen verwendet.

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

Schreibt rohe blockorientierte Daten aus buf auf die Karte. Standard-Einstiegspunkt für Blockgeräte gemäß vfs.AbstractBlockDev, der von der Dateisystemschicht verwendet wird.

Einfache Form (writeblocks(block_num, buf)): schreibt ganze Blöcke ab dem Blockindex block_num. len(buf) muss ein Vielfaches der SD-Blockgröße (512 Byte) sein. Jeder betroffene Block wird vollständig überschrieben.

Erweiterte Form (writeblocks(block_num, buf, offset)): schreibt len(buf) Byte – nicht notwendigerweise eine ganze Anzahl von Blöcken – ab Byte offset innerhalb von Block block_num. Wird von littlefs und anderen byteadressierbaren Dateisystemen verwendet.

ioctl(cmd: int, arg: int) int | None

Standard-Steuerungs-Einstiegspunkt gemäß vfs.AbstractBlockDev. Wird von der Dateisystemschicht beim Ein-/Aushängen und bei jeder Synchronisierung aufgerufen. Die erkannten cmd-Werte sind:

  • 1 – initialisieren. Gibt bei Erfolg 0 zurück.

  • 2 – deinitialisieren. Gibt bei Erfolg 0 zurück.

  • 3 – ausstehende Schreibvorgänge synchronisieren. Gibt 0 zurück (der SDMMC-Treiber schreibt synchron, es gibt nichts zu leeren).

  • 4 – die Anzahl der Blöcke auf dem Gerät zurückgeben.

  • 5 – die Größe eines einzelnen Blocks zurückgeben (immer 512).

  • 6 – einen Block löschen (bei SD wirkungslos, beibehalten zur Einhaltung des vfs.AbstractBlockDev-Vertrags).

  • 7 – zurückgeben, ob das Gerät Blocklöschung unterstützt (0 bei SD).

Direkte Aufrufer verwenden diese Methode normalerweise nicht – der Dateisystemtreiber leitet alle Standardcodes automatisch weiter, sobald die SDCard eingehängt ist.

init(*args, **kwargs) None

Initialisiert die SD-Schnittstelle von Grund auf neu. Akzeptiert dieselben Argumente wie der Konstruktor. Nützlich, um eine im laufenden Betrieb eingesteckte Karte auf Platinen ohne Karten-Erkennungssignal neu zu erkennen, da present() andernfalls zur Konstruktionszeit zwischengespeichert ist. Nur mimxrt-Port.

deinit() None

Deinitialisiert die SD-Schnittstelle und gibt den SDMMC-/USDHC-Controller sowie die von ihm belegten IO-Pins frei. Das SDCard-Objekt wird unbrauchbar, bis init() erneut aufgerufen wird. Verwenden Sie dies, bevor Sie die Karte über eine andere Schnittstelle neu beschreiben, oder um in einer batteriebetriebenen Anwendung die Stromversorgung des Slots abzuschalten. Nur mimxrt-Port.