клас 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):

Сигнал

Вивід роз’єму

Примітки

SCL

P4

SDA

P5

I2C(4) додатково доступний на OpenMV Cam M7, H7, H7 Plus та Pure Thermal із SCL на виводі роз’єму P7 та SDA на виводі роз’єму P8.

OpenMV Cam N6 не надає pyb.I2C; натомість використовуйте machine.I2C.

Методи

deinit() None

Вимикає шину 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 – адреса пристрою I2C

  • memaddr – адреса пам’яті всередині пристрою I2C

  • timeout – тайм-аут у мілісекундах для очікування читання

  • 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.

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

Надсилає дані на шині:

  • send – дані для надсилання (ціле число або буферний об’єкт).

  • addr – адреса для надсилання (необхідна лише в режимі контролера).

  • timeout – тайм-аут у мілісекундах для очікування надсилання.

scan() List[int]

Сканує всі адреси I2C від 0x01 до 0x7f та повертає список тих, що відповідають. Дійсний лише в режимі контролера.

Константи

CONTROLLER: int

Ініціалізує шину як ведучий (контролер) – керує SCL та ініціює транзакції.

PERIPHERAL: int

Ініціалізує шину як ведений (периферійний пристрій), що прослуховує адресу addr, задану в init(), та відповідає на транзакції, ініційовані контролером на тій самій шині.