třída SDCard – ovladač SD / MMC karty#

Třída SDCard ovládá slot pro SD / MMC kartu na kamerách OpenMV, které jej mají. Ovladač implementuje rozhraní vfs.AbstractBlockDev, takže jej lze předat přímo funkci vfs.mount()

import machine
import vfs

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

Poznámka

Firmware OpenMV automaticky připojí SD kartu při startu, takže většina skriptů nikdy nevytváří objekt SDCard přímo – jednoduše čtou a zapisují přes automaticky připojenou cestu. Vytvořte jej ručně pouze tehdy, když potřebujete jiný než výchozí přípojný bod nebo přímý blokový přístup přes readblocks() / writeblocks() / ioctl().

Na OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 je slot řízen integrovaným řadičem SDMMC v čipu STM32 v 4bitovém SD režimu. Na OpenMV Cam RT1062 je slot řízen řadičem USDHC čipu i.MX RT, rovněž v 4bitovém SD režimu. Na žádné aktuální desce OpenMV nejsou potřeba žádné argumenty pro multiplexování pinů – ovladač zná zapojení desky.

Není dostupné na OpenMV Cam AE3 (port alif).

Konstruktory#

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

Vrátí singleton SDCard pro SD slot identifikovaný pomocí id. id je akceptováno kvůli kompatibilitě napříč porty, ale porty podporované OpenMV vystavují pouze jeden slot; předejte 1 nebo jej vynechte.

Na STM32 konstruktor nepřijímá vůbec žádné argumenty; na mimxrt je argument id akceptován, ale platná je pouze hodnota 1.

Metody#

present() bool#

Vrátí True, pokud je ve slotu aktuálně detekována karta, jinak False.

Na deskách, které zapojují signál detekce karty, metoda odráží tento signál v reálném čase, takže ji lze po vytvoření objektu SDCard periodicky dotazovat a reagovat na vložení / vyjmutí karty za chodu. Na deskách bez signálu detekce karty je hodnota uzamčena v okamžiku vytvoření – hlásí výsledek počáteční sondy CMD0, kterou ovladač provedl při vytvoření objektu, a karta vložená za chodu poté nebude viditelná, dokud nebude objekt znovu vytvořen (nebo na mimxrt zavolána metoda init()).

info() tuple[int, int, int]#

Vrátí trojici (3-tuple) popisující aktuálně vloženou kartu:

  • [0] num_blocks – celková kapacita v 512bajtových blocích. Vynásobte 512 pro získání kapacity v bajtech.

  • [1] block_size – pro SD karty vždy 512. Zahrnuto, aby volající mohli přenositelně provést num_blocks * block_size.

  • [2] card_type – typ karty hlášený SD sběrnicí během inicializačního handshaku CMD8 / OCR. Typické hodnoty jsou 0 (SDSC – standardní kapacita), 0x40 (SDHC / SDXC – vysoká / rozšířená kapacita) a 0x80 (MMC).

Užitečné pro ověření, že byla karta rozpoznána, nebo pro zobrazení údajů o volném místě vzhledem k celkové kapacitě.

power(state: bool, /) None#

Zapne nebo vypne napájecí větev slotu karty. Firmware STM32 metodu vystavuje, ale žádná aktuální OpenMV Cam nereguluje napájení SD karty, takže volání je fakticky bez efektu. Ponecháno kvůli kompatibilitě s kódem původně napsaným pro referenční desky STM32 z hlavního proudu MicroPython. Pouze port STM32.

read(block_num: int, /) bytes#

Přečte jeden 512bajtový blok z karty a vrátí jej jako nově alokovaný objekt bytes.

Toto je starší čtení jednoho bloku dodávané portem STM32. Nový kód by měl místo toho používat readblocks() – tato metoda funguje na každém portu OpenMV, umí přečíst libovolný počet souvislých bloků v jednom přenosu a vyhýbá se alokaci při každém volání tím, že zapisuje do bufferu dodaného volajícím. Pouze port STM32.

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

Zapíše jeden 512bajtový blok na kartu. data musí mít přesně 512 bajtů.

Toto je starší zápis jednoho bloku dodávaný portem STM32; nový kód by měl místo toho používat writeblocks(), který funguje na každém portu OpenMV a umí zapsat libovolný počet souvislých bloků na jedno volání. Pouze port STM32.

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

Přečte z karty surová data zarovnaná na bloky do buf. Standardní vstupní bod blokového zařízení vfs.AbstractBlockDev používaný vrstvou souborového systému.

Jednoduchá forma (readblocks(block_num, buf)): přečte celé bloky počínaje indexem bloku block_num. len(buf) musí být násobkem velikosti SD bloku (512 bajtů).

Rozšířená forma (readblocks(block_num, buf, offset)): přečte len(buf) bajtů – ne nutně celý počet bloků – počínaje bajtem offset v rámci bloku block_num. Používá se v littlefs a dalších bajtově adresovatelných souborových systémech.

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

Zapíše surová data zarovnaná na bloky z buf na kartu. Standardní vstupní bod blokového zařízení vfs.AbstractBlockDev používaný vrstvou souborového systému.

Jednoduchá forma (writeblocks(block_num, buf)): zapíše celé bloky počínaje indexem bloku block_num. len(buf) musí být násobkem velikosti SD bloku (512 bajtů). Každý dotčený blok je přepsán celý.

Rozšířená forma (writeblocks(block_num, buf, offset)): zapíše len(buf) bajtů – ne nutně celý počet bloků – počínaje bajtem offset v rámci bloku block_num. Používá se v littlefs a dalších bajtově adresovatelných souborových systémech.

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

Standardní řídicí vstupní bod vfs.AbstractBlockDev. Volán vrstvou souborového systému při připojení/odpojení a při každé synchronizaci. Rozpoznané hodnoty cmd jsou:

  • 1 – inicializace. Při úspěchu vrátí 0.

  • 2 – deinicializace. Při úspěchu vrátí 0.

  • 3 – synchronizace všech čekajících zápisů. Vrací 0 (ovladač SDMMC zapisuje synchronně, není co vyprázdnit).

  • 4 – vrátí počet bloků na zařízení.

  • 5 – vrátí velikost jednoho bloku (vždy 512).

  • 6 – vymaže blok (na SD bez efektu, ponecháno kvůli kontraktu vfs.AbstractBlockDev).

  • 7 – vrátí, zda zařízení podporuje mazání bloků (na SD 0).

Přímí volající tuto metodu obvykle nepoužívají – ovladač souborového systému automaticky odbavuje všechny standardní kódy, jakmile je SDCard připojena.

init(*args, **kwargs) None#

Znovu inicializuje SD rozhraní od základu. Přijímá stejné argumenty jako konstruktor. Užitečné pro opětovnou detekci karty vložené za chodu na deskách bez signálu detekce karty, protože present() je jinak uzamčeno v okamžiku vytvoření. Pouze port mimxrt.

deinit() None#

Deinicializuje SD rozhraní, uvolní řadič SDMMC/USDHC a IO piny, které si nárokoval. Objekt SDCard se stane nepoužitelným, dokud nebude znovu zavolána metoda init(). Použijte jej před opětovným naplněním karty z jiného rozhraní nebo pro odpojení napájení slotu v aplikaci napájené z baterie. Pouze port mimxrt.