MicroPython:Библиотеки/pyb/Класс I2C: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 7 промежуточных версий 1 участника)
Строка 11: Строка 11:
Пример:
Пример:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
from pyb import I2C
from pyb import I2C


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


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
i2c.send('abc')      # отправляем 3 байта
i2c.send('abc')      # отправляем 3 байта
i2c.send(0x42)      # отправляем 1 байт, задав его номер
i2c.send(0x42)      # отправляем 1 байт, задав его номер
Строка 38: Строка 38:
Чтобы получить данные, сначала создаем массив данных:
Чтобы получить данные, сначала создаем массив данных:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
data = bytearray(3)  # создаем буфер
data = bytearray(3)  # создаем буфер
i2c.recv(data)      # получаем 3 байта, записываем их в «data»
i2c.recv(data)      # получаем 3 байта, записываем их в «data»
Строка 45: Строка 45:
Вы также можете задать таймаут (в миллисекундах):
Вы также можете задать таймаут (в миллисекундах):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
i2c.send(b'123', timeout=2000)  # таймаут через 2 секунды  
i2c.send(b'123', timeout=2000)  # таймаут через 2 секунды  
</syntaxhighlight>
</syntaxhighlight>
Строка 51: Строка 51:
Чтобы ведущее устройство могло отправить данные, ему надо знать адрес получателя:
Чтобы ведущее устройство могло отправить данные, ему надо знать адрес получателя:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
i2c.init(I2C.MASTER)
i2c.init(I2C.MASTER)
i2c.send('123', 0x42)        # отправляем 3 байта ведомому устройству
i2c.send('123', 0x42)        # отправляем 3 байта ведомому устройству
Строка 60: Строка 60:
У ведущего устройства также есть другие методы:
У ведущего устройства также есть другие методы:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
i2c.is_ready(0x42)      # проверяем, готово ли ведомое устройство
i2c.is_ready(0x42)      # проверяем, готово ли ведомое устройство
                         # с адресом «0x42»
                         # с адресом «0x42»
Строка 88: Строка 88:
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.send()|I2C.send(send, addr=0, *, timeout=5000)]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.send()|I2C.send(send, addr=0, *, timeout=5000)]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.scan()|I2C.scan()]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.scan()|I2C.scan()]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/
* 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» и возвращает список тех, кто ответил. Этот метод можно использовать только в режиме ведущего устройства.


==Константы==
==Константы==
Строка 131: Строка 93:
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.MASTER|I2C.MASTER]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.MASTER|I2C.MASTER]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.SLAVE|I2C.SLAVE]]
* [[MicroPython:Библиотеки/pyb/Класс I2C/I2C.SLAVE|I2C.SLAVE]]
* I2C.MASTER – для инициализации шины в режиме ведущего устройства (мастера).
* I2C.SLAVE – для инициализации шины в режиме ведомого устройства.
<syntaxhighlight lang="python" enclose="div">


=См.также=
=См.также=

Текущая версия от 18:16, 14 мая 2023

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


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

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

Методы

Константы

См.также

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