class SDCard – controlador de tarjetas SD / MMC

La clase SDCard controla la ranura de tarjetas SD / MMC en las cámaras OpenMV que disponen de una. El controlador implementa la interfaz vfs.AbstractBlockDev, por lo que puede pasarse directamente a vfs.mount():

import machine
import vfs

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

Nota

El firmware de OpenMV monta automáticamente la tarjeta SD durante el arranque, por lo que la mayoría de los scripts nunca construyen un objeto SDCard directamente: simplemente leen y escriben a través de la ruta montada automáticamente. Construya uno manualmente solo cuando necesite un punto de montaje no predeterminado o acceso a nivel de bloque sin procesar mediante readblocks() / writeblocks() / ioctl().

En las OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6, la ranura es controlada por el controlador SDMMC integrado del STM32 en modo SD de 4 bits. En la OpenMV Cam RT1062, la ranura es controlada por el controlador USDHC del i.MX RT, también en modo SD de 4 bits. No se necesitan argumentos de multiplexado de pines en ninguna placa OpenMV actual: el controlador conoce el cableado de la placa.

No está expuesto en la OpenMV Cam AE3 (puerto alif).

Constructores

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

Devuelve el singleton SDCard para la ranura SD identificada por id. Se acepta id por compatibilidad entre puertos, pero los puertos compatibles con OpenMV solo exponen una ranura; pase 1 u omítalo.

En STM32, el constructor no toma ningún argumento; en mimxrt, se acepta el argumento id pero solo 1 es válido.

Métodos

present() bool

Devuelve True si actualmente se detecta una tarjeta en la ranura, False en caso contrario.

En las placas que cablean una señal de detección de tarjeta, el método refleja esa señal en tiempo real, por lo que puede consultarse después de haber construido el objeto SDCard para reaccionar ante la inserción / extracción en caliente. En las placas sin señal de detección de tarjeta, el valor se fija en el momento de la construcción: informa del resultado del sondeo CMD0 inicial que el controlador realizó al crear el objeto, y una tarjeta insertada en caliente posteriormente no será visible hasta que el objeto se vuelva a construir (o se llame a init() en mimxrt).

info() tuple[int, int, int]

Devuelve una tupla de 3 elementos que describe la tarjeta actualmente insertada:

  • [0] num_blocks – capacidad total en bloques de 512 bytes. Multiplique por 512 para obtener la capacidad en bytes sin procesar.

  • [1] block_size – siempre 512 para tarjetas SD. Se incluye para que quien llame pueda hacer num_blocks * block_size de forma portable.

  • [2] card_type – el tipo de tarjeta informado por el bus SD durante el protocolo de inicialización CMD8 / OCR. Los valores típicos son 0 (SDSC – capacidad estándar), 0x40 (SDHC / SDXC – capacidad alta / extendida) y 0x80 (MMC).

Útil para comprobar que la tarjeta fue reconocida, o para mostrar cifras de espacio libre relativas a la capacidad total.

power(state: bool, /) None

Enciende o apaga la línea de alimentación de la ranura de la tarjeta. El firmware STM32 expone el método, pero ninguna OpenMV Cam actual controla la alimentación de la SD, por lo que la llamada es efectivamente una operación nula. Se mantiene por compatibilidad con código escrito originalmente para las placas de referencia STM32 originales de MicroPython. Solo puerto STM32.

read(block_num: int, /) bytes

Lee un único bloque de 512 bytes de la tarjeta y lo devuelve como un objeto bytes recién asignado.

Esta es la lectura heredada de un solo bloque incluida en el puerto STM32. El código nuevo debería usar readblocks() en su lugar: ese método funciona en todos los puertos de OpenMV, puede leer cualquier número de bloques contiguos en una sola transferencia y evita la asignación por llamada al escribir en un búfer proporcionado por quien llama. Solo puerto STM32.

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

Escribe un único bloque de 512 bytes en la tarjeta. data debe tener exactamente 512 bytes de longitud.

Esta es la escritura heredada de un solo bloque incluida en el puerto STM32; el código nuevo debería usar writeblocks() en su lugar, que funciona en todos los puertos de OpenMV y puede escribir cualquier número de bloques contiguos por llamada. Solo puerto STM32.

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

Lee datos sin procesar alineados a bloques de la tarjeta en buf. Punto de entrada estándar de dispositivo de bloques vfs.AbstractBlockDev que utiliza la capa del sistema de archivos.

Forma simple (readblocks(block_num, buf)): lee bloques completos a partir del índice de bloque block_num. len(buf) debe ser un múltiplo del tamaño de bloque SD (512 bytes).

Forma extendida (readblocks(block_num, buf, offset)): lee len(buf) bytes – no necesariamente un número entero de bloques – a partir del byte offset dentro del bloque block_num. La utilizan littlefs y otros sistemas de archivos direccionables por bytes.

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

Escribe datos sin procesar alineados a bloques desde buf en la tarjeta. Punto de entrada estándar de dispositivo de bloques vfs.AbstractBlockDev que utiliza la capa del sistema de archivos.

Forma simple (writeblocks(block_num, buf)): escribe bloques completos a partir del índice de bloque block_num. len(buf) debe ser un múltiplo del tamaño de bloque SD (512 bytes). Cada bloque afectado se sobrescribe por completo.

Forma extendida (writeblocks(block_num, buf, offset)): escribe len(buf) bytes – no necesariamente un número entero de bloques – a partir del byte offset dentro del bloque block_num. La utilizan littlefs y otros sistemas de archivos direccionables por bytes.

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

Punto de entrada de control estándar vfs.AbstractBlockDev. Lo llama la capa del sistema de archivos en el momento del montaje/desmontaje y en cada sincronización. Los valores reconocidos de cmd son:

  • 1 – inicializar. Devuelve 0 en caso de éxito.

  • 2 – desinicializar. Devuelve 0 en caso de éxito.

  • 3 – sincronizar cualquier escritura pendiente. Devuelve 0 (el controlador SDMMC escribe de forma síncrona, no hay nada que vaciar).

  • 4 – devuelve el número de bloques del dispositivo.

  • 5 – devuelve el tamaño de un solo bloque (siempre 512).

  • 6 – borra un bloque (operación nula en SD, se mantiene por el contrato vfs.AbstractBlockDev).

  • 7 – devuelve si el dispositivo admite el borrado de bloques (0 en SD).

Normalmente, quienes llaman directamente no usan este método: el controlador del sistema de archivos despacha todos los códigos estándar automáticamente una vez que la SDCard está montada.

init(*args, **kwargs) None

Reinicializa la interfaz SD desde cero. Acepta los mismos argumentos que el constructor. Útil para volver a detectar una tarjeta insertada en caliente en placas sin señal de detección de tarjeta, ya que present() queda fijado de otro modo en el momento de la construcción. Solo puerto mimxrt.

deinit() None

Desinicializa la interfaz SD, liberando el controlador SDMMC/USDHC y los pines de E/S que reclamó. El objeto SDCard queda inutilizable hasta que se vuelva a llamar a init(). Úselo antes de volver a grabar la tarjeta desde otra interfaz, o para cortar la alimentación de la ranura en una aplicación alimentada por batería. Solo puerto mimxrt.