MicroPython:Библиотеки/pyb/Класс I2C: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[]</ref>= <syntaxhighlight lang="python"...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[]</ref>= | =Класс I2C – класс для работы с протоколом I2C<ref>[http://docs.micropython.org/en/latest/library/pyb.I2C.html docs.micropython.org - class I2C – a two-wire serial protocol]</ref>= | ||
[[I2C]] – это 2-проводной протокол для коммуникации между устройствами. На физическом уровне он состоит из 2 проводов: [[SCL]] и [[SDA]] (это линии для тактовой частоты и данных соответственно). | |||
Объекты [[I2C]] создаются привязанными к заданной шине. Их можно инициализировать при создании или позже. | |||
Пример: | |||
<syntaxhighlight lang="python" enclose="div"> | |||
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-коммуникацию | |||
</syntaxhighlight> | |||
Если распечатать объект [[I2C]], это покажет информацию о его настройках. | |||
Базовые методы класса I2C – это send() и recv(): | |||
<syntaxhighlight lang="python" enclose="div"> | |||
i2c.send('abc') # отправляем 3 байта | |||
i2c.send(0x42) # отправляем 1 байт, задав его номер | |||
data = i2c.recv(3) # получаем 3 байта | |||
</syntaxhighlight> | |||
Чтобы получить данные, сначала создаем массив данных: | |||
<syntaxhighlight lang="python" enclose="div"> | |||
data = bytearray(3) # создаем буфер | |||
i2c.recv(data) # получаем 3 байта, записываем их в «data» | |||
</syntaxhighlight> | |||
Вы также можете задать таймаут (в миллисекундах): | |||
<syntaxhighlight lang="python" enclose="div"> | |||
i2c.send(b'123', timeout=2000) # таймаут через 2 секунды | |||
</syntaxhighlight> | |||
Чтобы ведущее устройство могло отправить данные, ему надо знать адрес получателя: | |||
<syntaxhighlight lang="python" enclose="div"> | |||
i2c.init(I2C.MASTER) | |||
i2c.send('123', 0x42) # отправляем 3 байта ведомому устройству | |||
# с адресом «0x42» | |||
i2c.send(b'456', addr=0x42) # адрес задан как именованный аргумент | |||
</syntaxhighlight> | |||
У ведущего устройства также есть другие методы: | |||
<syntaxhighlight lang="python" enclose="div"> | |||
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) | |||
</syntaxhighlight> | |||
==Конструкторы== | |||
* Класс 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 – для инициализации шины в режиме ведомого устройства. | |||
Версия от 10:03, 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">