клас I2C – двопровідний послідовний протокол¶
I2C – це двопровідний протокол для зв’язку між пристроями. На фізичному рівні він складається з двох ліній: SCL (тактування) та SDA (дані). OpenMV Cam не надає вбудованих підтягуючих резисторів на жодній з ліній – зовнішні підтягуючі резистори необхідні як на SCL, так і на SDA для роботи шини.
Об’єкти I2C прив’язані до конкретної шини і можуть бути ініціалізовані при створенні або пізніше через init().
Приклад:
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
Виведення об’єкта I2C показує його конфігурацію.
Основні методи – 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
Для отримання даних на місці спочатку створіть bytearray
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
Можна вказати тайм-аут (у мс):
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
Контролер повинен вказати адресу одержувача:
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
Контролер також має такі методи:
# 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)
Конструктори¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
Створює об’єкт I2C на заданій
bus(цілочисельний індекс периферійного пристрою, наприклад2дляI2C2). Без додаткових параметрів об’єкт створюється, але не ініціалізується (зберігаються попередні налаштування шини, якщо такі є); якщо задані додаткові аргументи, шина ініціалізується. Доступні параметри описано уinit().I2C(2)підключений до тих самих виводів роз’єму на кожній OpenMV Cam, що надаєpyb.I2C(M4 / M7 / H7 / H7 Plus / Pure Thermal):Сигнал
Вивід роз’єму
Примітки
SCLP4SDAP5I2C(4)додатково доступний на OpenMV Cam M7, H7, H7 Plus та Pure Thermal ізSCLна виводі роз’ємуP7таSDAна виводі роз’ємуP8.OpenMV Cam N6 не надає
pyb.I2C; натомість використовуйтеmachine.I2C.Методи¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Ініціалізує шину I2C із заданими параметрами:
modeмає бутиI2C.CONTROLLERабоI2C.PERIPHERAL.addr– 7-бітна адреса (актуально лише для периферійного пристрою).baudrate– швидкість тактового сигналу SCL (актуально лише для контролера).gencall– чи підтримувати режим загального виклику.dma– чи дозволяти використання DMA для передачі по I2C (зауважте, що передача через DMA має більш точні тайминги, але наразі не обробляє помилки шини належним чином).
Фактична тактова частота може бути нижчою за запитувану. Це залежить від апаратного забезпечення платформи. Фактична частота може бути визначена виведенням об’єкта I2C.
- is_ready(addr: int) bool¶
Перевіряє, чи відповідає пристрій I2C на задану адресу. Дійсний лише в режимі контролера.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
Читає з пам’яті пристрою I2C:
dataможе бути цілим числом (кількість байтів для читання) або буфером для читанняaddr– адреса пристрою I2Cmemaddr– адреса пам’яті всередині пристрою I2Ctimeout– тайм-аут у мілісекундах для очікування читанняaddr_size– ширина memaddr: 8 або 16 біт
Повертає прочитані дані. Дійсний лише в режимі контролера.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
Записує до пам’яті пристрою I2C:
dataможе бути цілим числом або буфером для запису.addr– адреса пристрою I2C.memaddr– адреса пам’яті всередині пристрою I2C.timeout– тайм-аут у мілісекундах для очікування запису.addr_size– ширинаmemaddr: 8 або 16 біт.
Дійсний лише в режимі контролера.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Отримує дані на шині:
recvможе бути цілим числом – кількістю байтів для отримання, або змінним буфером, який буде заповнений отриманими байтамиaddr– адреса для отримання (необхідна лише в режимі контролера)timeout– тайм-аут у мілісекундах для очікування отримання
Значення, що повертається: якщо
recvє цілим числом – новий буфер із отриманими байтами; інакше – той самий буфер, що був переданий уrecv.
Константи¶