SMBus: Работа с шиной I2C на Python в Raspberry Pi/Orange Pi/Banana Pi

SMBus (англ. System Management Bus) — последовательный протокол обмена данными для устройств питания. Основан на шине I²C, но использует более низкое сигнальное напряжение (3,3 В), предложен Intel в 1995 году. Используется, например, для получения информации о состоянии аккумуляторной батареи ноутбука (оставшаяся ёмкость аккумуляторной батареи, температура, количество использованных циклов разряда, и т. д.). С версии SMBus 2.0 (2000 год) используется не только для настройки батареи, но и для иных внутренних устройств компьютера.

SMBus является двухпроводным интерфейсом, по которому простые устройства могут обмениваться информацией с остальной системой. Сообщения идут к устройствам и от них, вместо прохождения по отдельным управляющим линиям.

python-smbus — этот модуль Python обеспечивает доступ к SMBus через интерфейс I2C /dev на хостах Linux. Ядро хоста должно иметь поддержку I2C, поддержку интерфейса устройства I2C и драйвер адаптера шины.

Установка и обновление Python

Python 2 и Python 3 поставляются предварительно установленными в операционных системах Raspbian, но чтобы установить Python в другой ОС Linux или обновить его, просто выполните одну из следующих команд в командной строке:

Установка или обновление Python 3.

sudo apt-get install python3

Установка или обновление Python 2.

sudo apt-get install python

Открытие Python REPL

Чтобы получить доступ к Python REPL (где вы можете вводить команды Python точно так же, как в командной строке), введите python или python3 в зависимости от того, какую версию вы хотите использовать:

SMBus Работа с I2C на Python в Raspberry Pi - Открытие Python REPL

Введите Ctrl-D, чтобы выйти из REPL.

Установка I2C Tools

I2C Tools — это пакет с полезными консольными инструментами для I2C. После установки нам будут доступны несколько полезных утилит: i2cdetect, i2cdump, i2cget, i2cset.

sudo apt-get install i2c-tools

i2cdetect — это пользовательская программа, которая сканирует шину I2C на наличие устройств.

Отображать список доступных в системе шин I²C:

i2cdetect -l

Установка I2C Tools (список доступных в системе шин I²C) - i2cdetect -l

Отображать таблицу обнаруженных устройств на указанной шине:

i2cdetect -y 0

Установка I2C Tools - i2cdetect -y 0

Установка SMBus

sudo apt-get install python-smbus

Описание методов (функций)

SMBus функции

write_quick()

Быстрая транзакция.

write_quick(addr)

Параметры
int addr — I2C адрес устройства.
Возвращает
long — Отрицательный errno или ноль в случае успеха.

read_byte()

Чтение байта.

read_byte(addr)

Параметры
int addr — I2C адрес устройства.
Возвращает
long — Отрицательный errno или байт данных в случае успеха.

write_byte()

Запись байта.

write_byte(addr,val)

Параметры
int addr — I2C адрес устройства.
char val — Байт данных.
Возвращает
long — Отрицательный errno или ноль в случае успеха.

read_byte_data()

Чтение байта данных.

read_byte_data(addr,cmd)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
Возвращает
long — Отрицательный errno или байт данных в случае успеха.

write_byte_data()

Запись байта данных.

write_byte_data(addr,cmd,val)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
char val — Байт данных.
Возвращает
long — Отрицательный errno или ноль в случае успеха.

read_word_data()

Чтение двух байт данных.

read_word_data(addr,cmd)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
Возвращает
long — Отрицательный errno или два байта данных в случае успеха.

process_call()

Process Call (вызов процесса) .

process_call(addr,cmd,val)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
int val — Два байта данных.
Возвращает
long — Отрицательное значение errno или 16-разрядное беззнаковое «слово», полученное от устройства.

read_block_data()

Чтение массива данных.

read_block_data(addr,cmd)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
Возвращает
long[] — Отрицательный errno или массив данных в случае успеха.

write_block_data()

Запись массива данных.

write_block_data(addr,cmd,vals)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
long[] vals — Массив данных.

block_process_call()

Block Process Call.

block_process_call(addr,cmd,vals)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
long[] vals — Массив данных.
Возвращает
long[] — Массив данных.

I2C функции

read_i2c_block_data()

Чтение массива данных.

read_i2c_block_data(addr,cmd,length)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
int length — Желаемая длина блока.
Возвращает
long[] — Массив данных в случае успеха.

write_i2c_block_data()

Запись массива данных.

write_i2c_block_data(addr,cmd,vals)

Параметры
int addr — I2C адрес устройства.
char cmd — Адрес регистра (команда).
long[] vals — Массив данных.

Примеры программ

Пример 1: чтение байта

Открыть шину I2C «0» и прочитать один байт от адреса 0x39, со смещением 0x0C (адрес регистра).

import smbus

bus = smbus.SMBus(0)
data = bus.read_byte_data(0x39, 0x0C)
print(data)
bus.close()

Пример 2: чтение массива данных

Открыть шину I2C «0» и прочитать 4 байта от адреса 0x39, со смещением 0x0C (адрес регистра). Вы можете прочитать до 32 байтов за раз.

import smbus

bus = smbus.SMBus(0)
data = bus.read_i2c_block_data(0x39, 0x0C, 4)
print(data)
bus.close()

Пример 3: запись байта

Открыть шину I2C «0» и записать один байт по адресу 0x39, со смещением 0x0C (адрес регистра).

import smbus

bus = smbus.SMBus(0)
data = 45
bus.write_byte_data(0x39, 0x0C, data)
bus.close()

Пример 4: запись массива

Открыть шину I2C «0» и записать масив байтов по адресу 0x39, со смещением 0x0C (адрес регистра). Вы можете записать до 32 байтов за раз.

import smbus

bus = smbus.SMBus(0)
data = [1, 2, 3, 4, 5, 6, 7, 8]
bus.write_i2c_block_data(0x39, 0x0C, data)
bus.close()

Материалы

How to Write and Run a Python Program on the Raspberry Pi
I2C Tools — Linux i2c Wiki
Using I2C with SM-Bus and Raspbian Linux on the Raspberry Pi
wiki:linux:python:sm-bus:doc [wiki.erazor-zone.de]
smbus2 Documentation
smbus2 · PyPI
i2cdetect(8) — i2c-tools — Debian unstable — Debian Manpages
SMBus — Википедия

Похожие записи

Комментарии 7

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *