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 durchididentifizierten SD-Slot zurück.idwird zur portübergreifenden Kompatibilität akzeptiert, aber die von OpenMV unterstützten Ports stellen nur einen Slot bereit; übergeben Sie1oder lassen Sie das Argument weg.Auf STM32 nimmt der Konstruktor überhaupt keine Argumente entgegen; auf mimxrt wird das Argument
idakzeptiert, aber nur1ist gültig.Methoden¶
- present() bool¶
Gibt
Truezurück, wenn aktuell eine Karte im Slot erkannt wird, andernfallsFalse.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 (oderinit()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 immer512. Enthalten, damit Aufrufer portabelnum_blocks * block_sizeberechnen können.[2]card_type– der vom SD-Bus während des CMD8-/OCR-Initialisierungs-Handshakes gemeldete Kartentyp. Typische Werte sind0(SDSC – Standardkapazität),0x40(SDHC / SDXC – hohe / erweiterte Kapazität) und0x80(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.
datamuss 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 Blockindexblock_num.len(buf)muss ein Vielfaches der SD-Blockgröße (512 Byte) sein.Erweiterte Form (
readblocks(block_num, buf, offset)): liestlen(buf)Byte – nicht notwendigerweise eine ganze Anzahl von Blöcken – ab Byteoffsetinnerhalb von Blockblock_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
bufauf 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 Blockindexblock_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)): schreibtlen(buf)Byte – nicht notwendigerweise eine ganze Anzahl von Blöcken – ab Byteoffsetinnerhalb von Blockblock_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 erkanntencmd-Werte sind:1– initialisieren. Gibt bei Erfolg0zurück.2– deinitialisieren. Gibt bei Erfolg0zurück.3– ausstehende Schreibvorgänge synchronisieren. Gibt0zurü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 desvfs.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
SDCardeingehä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, bisinit()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.