lớp SDCard -- trình điều khiển thẻ SD / MMC

Lớp SDCard điều khiển khe cắm thẻ SD / MMC trên các camera OpenMV có khe cắm đó. Trình điều khiển triển khai giao diện vfs.AbstractBlockDev để có thể truyền trực tiếp vào vfs.mount()

import machine
import vfs

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

Ghi chú

Firmware OpenMV tự động gắn kết thẻ SD khi khởi động, vì vậy hầu hết các tập lệnh không bao giờ tạo SDCard trực tiếp -- chúng chỉ đọc và ghi qua đường dẫn được gắn kết tự động. Chỉ tạo thủ công khi bạn cần điểm gắn kết không mặc định hoặc truy cập cấp khối thô qua readblocks() / writeblocks() / ioctl().

Trên OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6, khe cắm được điều khiển bởi bộ điều khiển SDMMC tích hợp của STM32 ở chế độ SD 4 bit. Trên OpenMV Cam RT1062, khe cắm được điều khiển bởi bộ điều khiển USDHC của i.MX RT, cũng ở chế độ SD 4 bit. Không cần đối số pin-mux trên bất kỳ bo mạch OpenMV hiện tại nào -- trình điều khiển biết cách nối dây của bo mạch.

Không được hiển thị trên OpenMV Cam AE3 (cổng alif).

Constructors

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

Trả về singleton SDCard cho khe cắm SD được xác định bởi id. id được chấp nhận để tương thích đa cổng nhưng các cổng được OpenMV hỗ trợ chỉ hiển thị một khe cắm; truyền 1 hoặc bỏ qua.

Trên STM32, constructor không nhận đối số nào; trên mimxrt, đối số id được chấp nhận nhưng chỉ 1 là hợp lệ.

Methods

present() bool

Trả về True nếu thẻ hiện đang được phát hiện trong khe cắm, False nếu không.

Trên các bo mạch nối dây tín hiệu phát hiện thẻ, phương thức này phản ánh tín hiệu đó theo thời gian thực, vì vậy nó có thể được thăm dò sau khi đối tượng SDCard đã được tạo để phản ứng với việc cắm vào / rút ra nóng. Trên các bo mạch không có tín hiệu phát hiện thẻ, giá trị được chốt tại thời điểm tạo -- nó báo cáo kết quả của lần thăm dò CMD0 ban đầu mà trình điều khiển đã thực hiện khi đối tượng được tạo, và một thẻ cắm nóng sau đó sẽ không hiển thị cho đến khi đối tượng được tạo lại (hoặc init() được gọi trên mimxrt).

info() tuple[int, int, int]

Trả về một 3-tuple mô tả thẻ đang được cắm:

  • [0] num_blocks -- tổng dung lượng tính bằng khối 512 byte. Nhân với 512 để có dung lượng byte thô.

  • [1] block_size -- luôn là 512 cho thẻ SD. Được bao gồm để người gọi có thể thực hiện num_blocks * block_size một cách di động.

  • [2] card_type -- loại thẻ được báo cáo bởi bus SD trong quá trình bắt tay khởi tạo CMD8 / OCR. Các giá trị điển hình là 0 (SDSC -- dung lượng tiêu chuẩn), 0x40 (SDHC / SDXC -- dung lượng cao / mở rộng) và 0x80 (MMC).

Hữu ích để kiểm tra sơ bộ rằng thẻ đã được nhận dạng, hoặc để hiển thị số liệu dung lượng trống so với tổng dung lượng.

power(state: bool, /) None

Bật hoặc tắt nguồn điện của khe cắm thẻ. Firmware STM32 hiển thị phương thức nhưng không có OpenMV Cam hiện tại nào kiểm soát nguồn cung cấp SD, vì vậy lệnh gọi thực tế là không có tác dụng. Được giữ để tương thích với mã ban đầu được viết cho các bo mạch tham chiếu MicroPython STM32 thượng nguồn. Chỉ dành cho cổng STM32.

read(block_num: int, /) bytes

Đọc một khối 512 byte đơn từ thẻ và trả về nó dưới dạng đối tượng bytes mới được cấp phát.

Đây là thao tác đọc khối đơn kế thừa được vận chuyển bởi cổng STM32. Mã mới nên sử dụng readblocks() thay thế -- phương thức đó hoạt động trên mọi cổng OpenMV, có thể đọc bất kỳ số lượng khối liên tiếp nào trong một lần truyền, và tránh phân bổ trên mỗi lần gọi bằng cách ghi vào bộ đệm do người gọi cung cấp. Chỉ dành cho cổng STM32.

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

Ghi một khối 512 byte đơn vào thẻ. data phải có đúng 512 byte.

Đây là thao tác ghi khối đơn kế thừa được vận chuyển bởi cổng STM32; mã mới nên sử dụng writeblocks() thay thế, hoạt động trên mọi cổng OpenMV và có thể ghi bất kỳ số lượng khối liên tiếp nào mỗi lần gọi. Chỉ dành cho cổng STM32.

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

Đọc dữ liệu thô căn chỉnh theo khối từ thẻ vào buf. Điểm vào thiết bị khối vfs.AbstractBlockDev tiêu chuẩn được sử dụng bởi lớp hệ thống tập tin.

Dạng đơn giản (readblocks(block_num, buf)): đọc toàn bộ các khối bắt đầu từ chỉ số khối block_num. len(buf) phải là bội số của kích thước khối SD (512 byte).

Dạng mở rộng (readblocks(block_num, buf, offset)): đọc len(buf) byte -- không nhất thiết phải là số nguyên lần của các khối -- bắt đầu từ byte offset trong khối block_num. Được sử dụng bởi littlefs và các hệ thống tập tin có thể địa chỉ theo byte khác.

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

Ghi dữ liệu thô căn chỉnh theo khối từ buf vào thẻ. Điểm vào thiết bị khối vfs.AbstractBlockDev tiêu chuẩn được sử dụng bởi lớp hệ thống tập tin.

Dạng đơn giản (writeblocks(block_num, buf)): ghi toàn bộ các khối bắt đầu từ chỉ số khối block_num. len(buf) phải là bội số của kích thước khối SD (512 byte). Mỗi khối bị ảnh hưởng được ghi đè hoàn toàn.

Dạng mở rộng (writeblocks(block_num, buf, offset)): ghi len(buf) byte -- không nhất thiết phải là số nguyên lần của các khối -- bắt đầu từ byte offset trong khối block_num. Được sử dụng bởi littlefs và các hệ thống tập tin có thể địa chỉ theo byte khác.

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

Điểm vào điều khiển vfs.AbstractBlockDev tiêu chuẩn. Được gọi bởi lớp hệ thống tập tin tại thời điểm gắn kết/tháo kết và mỗi lần đồng bộ hóa. Các giá trị cmd được nhận dạng là:

  • 1 -- khởi tạo. Trả về 0 nếu thành công.

  • 2 -- hủy khởi tạo. Trả về 0 nếu thành công.

  • 3 -- đồng bộ hóa bất kỳ lần ghi đang chờ nào. Trả về 0 (trình điều khiển SDMMC ghi đồng bộ, không có gì để xả).

  • 4 -- trả về số lượng khối trên thiết bị.

  • 5 -- trả về kích thước của một khối đơn (luôn là 512).

  • 6 -- xóa một khối (không có tác dụng trên SD, được giữ cho hợp đồng vfs.AbstractBlockDev).

  • 7 -- trả về liệu thiết bị có hỗ trợ xóa khối không (0 trên SD).

Người gọi trực tiếp thường không sử dụng phương thức này -- trình điều khiển hệ thống tập tin tự động gửi tất cả các mã tiêu chuẩn một khi SDCard được gắn kết.

init(*args, **kwargs) None

Khởi tạo lại giao diện SD từ đầu. Chấp nhận các đối số giống như constructor. Hữu ích để phát hiện lại thẻ cắm nóng trên các bo mạch không có tín hiệu phát hiện thẻ, vì present() nếu không sẽ bị chốt tại thời điểm tạo. Chỉ dành cho cổng mimxrt.

deinit() None

Hủy khởi tạo giao diện SD, giải phóng bộ điều khiển SDMMC/USDHC và các chân IO mà nó đã yêu cầu. Đối tượng SDCard trở nên không sử dụng được cho đến khi init() được gọi lại. Sử dụng nó trước khi nạp lại thẻ từ giao diện khác, hoặc để ngắt nguồn cho khe cắm trong ứng dụng chạy bằng pin. Chỉ dành cho cổng mimxrt.