MicroPython:Библиотеки/pyb/Класс I2C

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Класс I2C – класс для работы с протоколом I2C[1]

I2C – это 2-проводной протокол для коммуникации между устройствами. На физическом уровне он состоит из 2 проводов: SCL и SDA (это линии для тактовой частоты и данных соответственно).

Объекты I2C создаются привязанными к заданной шине. Их можно инициализировать при создании или позже.

Пример:

from pyb import I2C

i2c = I2C(1)                         # создаем объект «i2c» на шине 1
i2c = I2C(1, I2C.MASTER)             # создаем объект «i2c»
                                     # и инициализируем его
                                     # как ведущее устройство (мастер)
i2c.init(I2C.MASTER, baudrate=20000) # инициализируем объект «i2c»
                                     # как ведущее устройство (мастер) 
i2c.init(I2C.SLAVE, addr=0x42)       # инициализируем объект «i2c»
                                     # как ведомое устройство
                                     # с заданным адресом
i2c.deinit()                         # выключаем I2C-коммуникацию

Если распечатать объект I2C, это покажет информацию о его настройках.

Базовые методы класса I2C – это send() и recv():

i2c.send('abc')      # отправляем 3 байта
i2c.send(0x42)       # отправляем 1 байт, задав его номер
data = i2c.recv(3)   # получаем 3 байта

Чтобы получить данные, сначала создаем массив данных:

data = bytearray(3)  # создаем буфер
i2c.recv(data)       # получаем 3 байта, записываем их в «data»

Вы также можете задать таймаут (в миллисекундах):

i2c.send(b'123', timeout=2000)   # таймаут через 2 секунды

Чтобы ведущее устройство могло отправить данные, ему надо знать адрес получателя:

i2c.init(I2C.MASTER)
i2c.send('123', 0x42)        # отправляем 3 байта ведомому устройству
                             # с адресом «0x42»
i2c.send(b'456', addr=0x42)  # адрес задан как именованный аргумент

У ведущего устройства также есть другие методы:

i2c.is_ready(0x42)       # проверяем, готово ли ведомое устройство
                         # с адресом «0x42»
i2c.scan()               # сканируем ведомые устройства на шине, 
                         # возвращая список корректных адресов
i2c.mem_read(3, 0x42, 2) # считываем 3 байта из памяти
                         # ведомого устройства с адресом «0x42»,
                         # начиная с адреса «2» на ведомом устройстве 
# записываем 'abc' (3 байта) в память ведомого устройства
# с адресом «0x42», начиная с адреса «2» на ведомом устройстве,
# таймаут спустя 1 секунду:
i2c.mem_write('abc', 0x42, 2, timeout=1000)

Конструкторы

Методы

  • I2C.deinit() – выключает I2C-шину.
  • I2C.init(mode, *, addr=18, baudrate=400000, gencall=False, dma=False) – инициализирует I2C-шину при помощи следующих аргументов:
    • mode – здесь должно быть I2C.MASTER или I2C.SLAVE.
    • addr – это 7-битный адрес (используется только ведомым устройством).
    • baudrate – это тактовая частота SCL (используется только ведущим устройством).
    • gencall – здесь задается, поддерживается ли режим широковещательных запросов или нет.
    • dma – здесь задается, поддерживается ли DMA для I2C-передачи данных (то, сколько длятся DMA-операции, определено более точно, но они в данный момент недостаточно хорошо обрабатывают ошибки).
  • I2C.is_ready(addr) – проверяет, отвечает ли I2C-устройство по заданному адресу. Можно использовать только в режиме ведущего устройства.
  • I2C.mem_read(data, addr, memaddr, *, timeout=5000, addr_size=8) – считывает данные из памяти I2C-устройства:
    • data – здесь может быть целое число (количество байтов для считывания) или буфер (в который нужно прочесть данные).
    • addr – это адрес I2C-устройства.
    • memaddr – адрес в памяти I2C-устройства.
    • timeout – таймаут в миллисекундах для ожидания считывания.
    • addr_size – здесь задается разрядность memaddr: 8 или 16 бит.

Возвращает считанные данные. Этот метод можно использовать только в режиме ведущего устройства.

  • I2C.mem_write(data, addr, memaddr, *, timeout=5000, addr_size=8) – записывает данные в память I2C-устройства:
    • data – здесь может быть целое число или буфер, в который нужно записать данные.
    • addr – это адрес I2C-устройства.
    • memaddr – это адрес в памяти I2C-устройства.
    • timeout – таймаут в миллисекундах для ожидания считывания.
    • addr_size – здесь задается разрядность memaddr: 8 или 16 бит.

Возвращает None. Этот метод можно использовать только в режиме ведущего устройства.

  • I2C.recv(recv, addr=0, *, timeout=5000) – принимает данные на шину:
    • recv – здесь может быть целое число (количество принимаемых байтов) или изменяемый буфер (который будет заполнен принимаемыми байтами).
    • addr – адрес, с которого будут приняты данные (требуется только в режиме ведущего устройства).
    • timeout – таймаут в миллисекундах для ожидания приема данных.

Возвращаемое значение: если recv – это целое число, возвращаемым значением будет новый буфер с байтами. В противном случае это будет тот же буфер, который был задан в аргументе recv.

  • I2C.send(send, addr=0, *, timeout=5000) – отправляет данные на шину:
    • send – данные, которые нужно отправить (целое число или буферный объект).
    • addr – адрес, на который нужно отправить данные (требуется только в режиме ведущего устройства).
    • timeout – это таймаут в миллисекундах для ожидания отправки данных.

Возвращаемое значение: None.

  • I2C.scan() – сканирует все I2C-адреса в диапазоне от «0x01» до «0x7f» и возвращает список тех, кто ответил. Этот метод можно использовать только в режиме ведущего устройства.

Константы

  • I2C.MASTER – для инициализации шины в режиме ведущего устройства (мастера).
  • I2C.SLAVE – для инициализации шины в режиме ведомого устройства.


<syntaxhighlight lang="python" enclose="div">

См.также

Внешние ссылки