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.