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.