MicroPython:Библиотеки/pyb/Класс I2C: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 75: | Строка 75: | ||
==Конструкторы== | ==Конструкторы== | ||
* [[MicroPython:Библиотеки/pyb/Класс I2C/pyb.I2C()|pyb.I2C(bus, ...)]] | |||
* Класс pyb.I2C(bus, ...) – конструирует объект I2C на шине bus. В аргументе bus может быть задано «1» или «2» (‘X’ или ‘Y’). Если не задать дополнительных аргументов, объект I2C будет создан, но не инициализирован (у него будут настройки с прошлой инициализации шины, если таковые были). Если дополнительные аргументы будут заданы, шина будет инициализирована. Об параметрах инициализации читайте в описании метода init(). | * Класс pyb.I2C(bus, ...) – конструирует объект I2C на шине bus. В аргументе bus может быть задано «1» или «2» (‘X’ или ‘Y’). Если не задать дополнительных аргументов, объект I2C будет создан, но не инициализирован (у него будут настройки с прошлой инициализации шины, если таковые были). Если дополнительные аргументы будут заданы, шина будет инициализирована. Об параметрах инициализации читайте в описании метода init(). |
Версия от 10:04, 7 октября 2020
Класс 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)
Конструкторы
- Класс pyb.I2C(bus, ...) – конструирует объект I2C на шине bus. В аргументе bus может быть задано «1» или «2» (‘X’ или ‘Y’). Если не задать дополнительных аргументов, объект I2C будет создан, но не инициализирован (у него будут настройки с прошлой инициализации шины, если таковые были). Если дополнительные аргументы будут заданы, шина будет инициализирована. Об параметрах инициализации читайте в описании метода init().
Вот физические контакты I2C-шин на PyBoard V1.0 и V1.1:
- I2C(1) – на позиции X: (SCL, SDA) = (X9, X10) = (PB6, PB7)
- I2C(2) – на позиции Y: (SCL, SDA) = (Y9, Y10) = (PB10, PB11)
На PyBoard Lite:
- I2C(1) – на позиции X: (SCL, SDA) = (X9, X10) = (PB6, PB7)
- I2C(3) – на позиции Y: (SCL, SDA) = (Y9, Y10) = (PA8, PB8)
Использование ‘X’ и ‘Y’ обеспечивает совместимость кода на разных PyBoard-платах.
Методы
- 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">