class SDCard – драйвер карт SD / MMC

Класс SDCard управляет слотом для карт SD / MMC на тех камерах OpenMV, где он есть. Драйвер реализует интерфейс vfs.AbstractBlockDev, поэтому его можно передать напрямую в vfs.mount():

import machine
import vfs

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

Примечание

Прошивка OpenMV автоматически монтирует SD-карту при загрузке, поэтому большинство скриптов никогда не создают SDCard напрямую – они просто читают и пишут через автоматически смонтированный путь. Создавайте объект вручную только тогда, когда вам нужна нестандартная точка монтирования или прямой блочный доступ через readblocks() / writeblocks() / ioctl().

На OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 слот управляется встроенным контроллером SDMMC процессора STM32 в 4-битном режиме SD. На OpenMV Cam RT1062 слот управляется контроллером USDHC процессора i.MX RT, также в 4-битном режиме SD. Ни одна из текущих плат OpenMV не требует аргументов для мультиплексирования выводов – драйвер знает разводку платы.

Не доступен на OpenMV Cam AE3 (порт alif).

Конструкторы

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

Возвращает синглтон SDCard для слота SD, идентифицируемого по id. Аргумент id принимается для совместимости между портами, но поддерживаемые OpenMV порты предоставляют только один слот; передайте 1 или опустите его.

На STM32 конструктор вообще не принимает аргументов; на mimxrt аргумент id принимается, но допустимо только значение 1.

Методы

present() bool

Возвращает True, если карта в данный момент обнаружена в слоте, иначе False.

На платах, где сигнал обнаружения карты подключён, метод отражает этот сигнал в реальном времени, поэтому его можно опрашивать после создания объекта SDCard, чтобы реагировать на горячую вставку / извлечение. На платах без сигнала обнаружения карты значение фиксируется в момент создания – оно сообщает результат начальной проверки CMD0, выполненной драйвером при создании объекта, и карта, вставленная позже на горячую, не будет видна, пока объект не будет создан заново (или пока на mimxrt не будет вызван init()).

info() tuple[int, int, int]

Возвращает кортеж из 3 элементов, описывающий вставленную в данный момент карту:

  • [0] num_blocks – общая ёмкость в блоках по 512 байт. Умножьте на 512, чтобы получить ёмкость в байтах.

  • [1] block_size – всегда 512 для карт SD. Включено, чтобы вызывающий код мог переносимо вычислять num_blocks * block_size.

  • [2] card_type – тип карты, сообщённый шиной SD во время инициализирующего обмена CMD8 / OCR. Типичные значения: 0 (SDSC – стандартная ёмкость), 0x40 (SDHC / SDXC – высокая / расширенная ёмкость) и 0x80 (MMC).

Полезно для проверки того, что карта была распознана, или для отображения объёма свободного места относительно общей ёмкости.

power(state: bool, /) None

Включает или выключает линию питания слота карты. Прошивка STM32 предоставляет этот метод, но ни одна из текущих OpenMV Cam не управляет питанием SD, поэтому вызов фактически ничего не делает. Сохранён для совместимости с кодом, изначально написанным для эталонных плат STM32 из основного MicroPython. Только порт STM32.

read(block_num: int, /) bytes

Читает один блок размером 512 байт с карты и возвращает его как вновь выделенный объект bytes.

Это устаревшее чтение одного блока, поставляемое портом STM32. В новом коде следует использовать readblocks() – этот метод работает на всех портах OpenMV, может читать любое количество смежных блоков за одну передачу и избегает выделения памяти при каждом вызове, записывая данные в предоставленный вызывающим кодом буфер. Только порт STM32.

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

Записывает один блок размером 512 байт на карту. data должен быть длиной ровно 512 байт.

Это устаревшая запись одного блока, поставляемая портом STM32; в новом коде следует использовать writeblocks(), который работает на всех портах OpenMV и может записывать любое количество смежных блоков за вызов. Только порт STM32.

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

Читает блочно-выровненные сырые данные с карты в buf. Стандартная точка входа блочного устройства vfs.AbstractBlockDev, используемая уровнем файловой системы.

Простая форма (readblocks(block_num, buf)): читает целые блоки начиная с индекса блока block_num. len(buf) должен быть кратен размеру блока SD (512 байт).

Расширенная форма (readblocks(block_num, buf, offset)): читает len(buf) байт – не обязательно целое число блоков – начиная со смещения в байтах offset внутри блока block_num. Используется littlefs и другими байт-адресуемыми файловыми системами.

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

Записывает блочно-выровненные сырые данные из buf на карту. Стандартная точка входа блочного устройства vfs.AbstractBlockDev, используемая уровнем файловой системы.

Простая форма (writeblocks(block_num, buf)): записывает целые блоки начиная с индекса блока block_num. len(buf) должен быть кратен размеру блока SD (512 байт). Каждый затронутый блок перезаписывается целиком.

Расширенная форма (writeblocks(block_num, buf, offset)): записывает len(buf) байт – не обязательно целое число блоков – начиная со смещения в байтах offset внутри блока block_num. Используется littlefs и другими байт-адресуемыми файловыми системами.

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

Стандартная точка входа управления vfs.AbstractBlockDev. Вызывается уровнем файловой системы при монтировании/размонтировании и при каждой синхронизации. Распознаваемые значения cmd:

  • 1 – инициализировать. Возвращает 0 при успехе.

  • 2 – деинициализировать. Возвращает 0 при успехе.

  • 3 – синхронизировать все отложенные записи. Возвращает 0 (драйвер SDMMC пишет синхронно, сбрасывать нечего).

  • 4 – вернуть количество блоков на устройстве.

  • 5 – вернуть размер одного блока (всегда 512).

  • 6 – стереть блок (для SD ничего не делает, сохранено для соблюдения контракта vfs.AbstractBlockDev).

  • 7 – вернуть, поддерживает ли устройство стирание блоков (0 для SD).

Прямые вызывающие обычно не используют этот метод – драйвер файловой системы автоматически отправляет все стандартные коды, как только SDCard смонтирована.

init(*args, **kwargs) None

Заново инициализирует интерфейс SD с нуля. Принимает те же аргументы, что и конструктор. Полезно для повторного обнаружения карты, вставленной на горячую, на платах без сигнала обнаружения карты, поскольку present() иначе фиксируется в момент создания. Только порт mimxrt.

deinit() None

Деинициализирует интерфейс SD, освобождая контроллер SDMMC/USDHC и захваченные им выводы IO. Объект SDCard становится непригодным к использованию, пока не будет снова вызван init(). Используйте перед перезаписью карты с другого интерфейса или для отключения питания слота в приложении с батарейным питанием. Только порт mimxrt.