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ả SCL và SDA để 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() và 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ụ2choI2C2). 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. Xeminit()để 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ú
SCLP4SDAP5I2C(4)cũng có thêm trên OpenMV Cam M7, H7, H7 Plus và Pure Thermal vớiSCLtrên chân headerP7vàSDAtrên chân headerP8.OpenMV Cam N6 không có
pyb.I2C; hãy sử dụngmachine.I2Cthay thế.Phương thức¶
- 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:
modephải làI2C.CONTROLLERhoặcI2C.PERIPHERAL.addrlà địa chỉ 7-bit (chỉ có ý nghĩa cho ngoại vi).baudratelà tốc độ xung nhịp SCL (chỉ có ý nghĩa cho bộ điều khiển).gencallcho biết có hỗ trợ chế độ general-call không.dmacho 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:
datacó thể là số nguyên (số byte cần đọc) hoặc bộ đệm để đọc vàoaddrlà địa chỉ thiết bị I2Cmemaddrlà vị trí bộ nhớ trong thiết bị I2Ctimeoutlà thời gian chờ tính bằng mili giây để chờ đọcaddr_sizechọ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:
datacó thể là số nguyên hoặc bộ đệm để ghi từ đó.addrlà địa chỉ thiết bị I2C.memaddrlà vị trí bộ nhớ trong thiết bị I2C.timeoutlà thời gian chờ tính bằng mili giây để chờ ghi.addr_sizechọn chiều rộng củamemaddr: 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:
recvcó 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ậnaddrlà địa chỉ để nhận từ đó (chỉ bắt buộc ở chế độ bộ điều khiển)timeoutlà thời gian chờ tính bằng mili giây để chờ nhận
Giá trị trả về: nếu
recvlà 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àorecv.
Hằng số¶