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
SDCardpara la ranura SD identificada porid. Se aceptaidpor compatibilidad entre puertos, pero los puertos compatibles con OpenMV solo exponen una ranura; pase1u omítalo.En STM32, el constructor no toma ningún argumento; en mimxrt, se acepta el argumento
idpero solo1es válido.Métodos¶
- present() bool¶
Devuelve
Truesi actualmente se detecta una tarjeta en la ranura,Falseen 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
SDCardpara 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 ainit()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– siempre512para tarjetas SD. Se incluye para que quien llame pueda hacernum_blocks * block_sizede 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 son0(SDSC – capacidad estándar),0x40(SDHC / SDXC – capacidad alta / extendida) y0x80(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
bytesrecié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.
datadebe 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 bloquesvfs.AbstractBlockDevque utiliza la capa del sistema de archivos.Forma simple (
readblocks(block_num, buf)): lee bloques completos a partir del índice de bloqueblock_num.len(buf)debe ser un múltiplo del tamaño de bloque SD (512 bytes).Forma extendida (
readblocks(block_num, buf, offset)): leelen(buf)bytes – no necesariamente un número entero de bloques – a partir del byteoffsetdentro del bloqueblock_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
bufen la tarjeta. Punto de entrada estándar de dispositivo de bloquesvfs.AbstractBlockDevque utiliza la capa del sistema de archivos.Forma simple (
writeblocks(block_num, buf)): escribe bloques completos a partir del índice de bloqueblock_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)): escribelen(buf)bytes – no necesariamente un número entero de bloques – a partir del byteoffsetdentro del bloqueblock_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 decmdson:1– inicializar. Devuelve0en caso de éxito.2– desinicializar. Devuelve0en caso de éxito.3– sincronizar cualquier escritura pendiente. Devuelve0(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 contratovfs.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
SDCardestá 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
SDCardqueda inutilizable hasta que se vuelva a llamar ainit(). Ú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.