lớp I2C -- giao thức nối tiếp hai dây

I2C là giao thức hai dây để giao tiếp giữa các thiết bị. Ở cấp độ vật lý, nó bao gồm hai đường, SCL (xung nhịp) và SDA (dữ liệu). OpenMV Cam không cung cấp điện trở kéo tích hợp trên cả hai đường -- cần có điện trở kéo bên ngoài trên cả SCLSDA để bus hoạt động.

Các đối tượng I2C được gắn với một bus cụ thể và có thể được khởi tạo khi tạo hoặc sau đó thông qua init().

Ví dụ:

from pyb import I2C

i2c = I2C(2)                              # create on bus 2 (uninitialised)
i2c = I2C(2, I2C.CONTROLLER)              # create and init as a controller
i2c.init(I2C.CONTROLLER, baudrate=20000)  # init as a controller
i2c.init(I2C.PERIPHERAL, addr=0x42)       # init as a peripheral with the given address
i2c.deinit()                              # turn off the peripheral

In đối tượng I2C sẽ hiển thị cấu hình của nó.

Các phương thức cơ bản là send()recv()

i2c.send("abc")      # send 3 bytes
i2c.send(0x42)       # send a single byte, given by the number
data = i2c.recv(3)   # receive 3 bytes

Để nhận tại chỗ, trước tiên tạo một bytearray

data = bytearray(3)  # create a buffer
i2c.recv(data)       # receive 3 bytes, writing them into data

Bạn có thể chỉ định thời gian chờ (tính bằng ms):

i2c.send(b"123", timeout=2000)   # timeout after 2 seconds

Bộ điều khiển phải chỉ định địa chỉ của bên nhận:

i2c.init(I2C.CONTROLLER)
i2c.send("123", 0x42)        # send 3 bytes to peripheral with address 0x42
i2c.send(b"456", addr=0x42)  # keyword for address

Bộ điều khiển cũng có các phương thức sau:

# Check if peripheral 0x42 is ready.
i2c.is_ready(0x42)

# Scan the bus and return a list of responding addresses.
i2c.scan()

# Read 3 bytes from peripheral 0x42 starting at memaddr 2.
i2c.mem_read(3, 0x42, 2)

# Write 3 bytes to peripheral 0x42 at memaddr 2.
i2c.mem_write("abc", 0x42, 2, timeout=1000)

Hàm khởi tạo

class pyb.I2C(bus: int | str, *args, **kwargs)

Tạo một đối tượng I2C trên bus đã cho (chỉ số ngoại vi số nguyên, ví dụ 2 cho I2C2). Không có thêm tham số nào, đối tượng được tạo nhưng chưa khởi tạo (nó giữ lại các cài đặt bus trước đó, nếu có); nếu có các đối số thêm, bus sẽ được khởi tạo. Xem init() để biết các tham số có thể dùng.

I2C(2) được nối với cùng các chân header trên mọi OpenMV Cam có pyb.I2C (M4 / M7 / H7 / H7 Plus / Pure Thermal):

Tín hiệu

Chân header

Ghi chú

SCL

P4

SDA

P5

I2C(4) cũng có thêm trên OpenMV Cam M7, H7, H7 Plus và Pure Thermal với SCL trên chân header P7SDA trên chân header P8.

OpenMV Cam N6 không có pyb.I2C; hãy sử dụng machine.I2C thay thế.

Phương thức

deinit() None

Tắt bus I2C.

init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None

Khởi tạo bus I2C với các tham số đã cho:

  • mode phải là I2C.CONTROLLER hoặc I2C.PERIPHERAL.

  • addr là địa chỉ 7-bit (chỉ có ý nghĩa cho ngoại vi).

  • baudrate là tốc độ xung nhịp SCL (chỉ có ý nghĩa cho bộ điều khiển).

  • gencall cho biết có hỗ trợ chế độ general-call không.

  • dma cho biết có cho phép sử dụng DMA cho các truyền I2C không (lưu ý rằng truyền DMA có thời gian chính xác hơn nhưng hiện tại không xử lý đúng các lỗi bus).

Tần số xung nhịp thực tế có thể thấp hơn tần số yêu cầu. Điều này phụ thuộc vào phần cứng của nền tảng. Tốc độ thực tế có thể xác định bằng cách in đối tượng I2C.

is_ready(addr: int) bool

Kiểm tra xem thiết bị I2C có phản hồi địa chỉ đã cho không. Chỉ hợp lệ khi ở chế độ bộ điều khiển.

mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes

Đọc từ bộ nhớ của thiết bị I2C:

  • data có thể là số nguyên (số byte cần đọc) hoặc bộ đệm để đọc vào

  • addr là địa chỉ thiết bị I2C

  • memaddr là vị trí bộ nhớ trong thiết bị I2C

  • timeout là thời gian chờ tính bằng mili giây để chờ đọc

  • addr_size chọn chiều rộng của memaddr: 8 hoặc 16 bit

Trả về dữ liệu đã đọc. Chỉ hợp lệ ở chế độ bộ điều khiển.

mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None

Ghi vào bộ nhớ của thiết bị I2C:

  • data có thể là số nguyên hoặc bộ đệm để ghi từ đó.

  • addr là địa chỉ thiết bị I2C.

  • memaddr là vị trí bộ nhớ trong thiết bị I2C.

  • timeout là thời gian chờ tính bằng mili giây để chờ ghi.

  • addr_size chọn chiều rộng của memaddr: 8 hoặc 16 bit.

Chỉ hợp lệ ở chế độ bộ điều khiển.

recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes

Nhận dữ liệu trên bus:

  • recv có thể là số nguyên, tức là số byte cần nhận, hoặc một bộ đệm có thể thay đổi, sẽ được điền bằng các byte đã nhận

  • addr là địa chỉ để nhận từ đó (chỉ bắt buộc ở chế độ bộ điều khiển)

  • timeout là thời gian chờ tính bằng mili giây để chờ nhận

Giá trị trả về: nếu recv là số nguyên thì trả về bộ đệm mới chứa các byte đã nhận, nếu không thì trả về chính bộ đệm đã được truyền vào recv.

send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None

Gửi dữ liệu trên bus:

  • send là dữ liệu cần gửi (số nguyên để gửi, hoặc đối tượng bộ đệm).

  • addr là địa chỉ để gửi tới (chỉ bắt buộc ở chế độ bộ điều khiển).

  • timeout là thời gian chờ tính bằng mili giây để chờ gửi.

scan() List[int]

Quét tất cả địa chỉ I2C từ 0x01 đến 0x7f và trả về danh sách những địa chỉ phản hồi. Chỉ hợp lệ khi ở chế độ bộ điều khiển.

Hằng số

CONTROLLER: int

Khởi tạo bus như master (bộ điều khiển) -- nó dẫn SCL và khởi tạo các giao dịch.

PERIPHERAL: int

Khởi tạo bus như slave (ngoại vi) lắng nghe trên addr được đặt trong init() và phản hồi các giao dịch được khởi tạo bởi bộ điều khiển trên cùng bus.