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

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

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

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 в зависимости от того, какую версию вы хотите использовать:



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

Установка I2C Tools


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


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

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




Отображать таблицу обнаруженных устройств на указанной шине:
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(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()


28.02.2024 в 14:04, Просмотров: 2116
Опубликовал: ak167

i2c, smbus






Предложить пост

Поиск



По всему сайту
По тэгам
По тэгам и заголовкам

Боковое меню

  • Карта сайта
  • RSS-каналы
  • Обратная связь
  • Пользователи



    Рейтинг@Mail.ru