Работа с I2c в проекте (обновлено: 15 Nov 2021, 09:56:11)


I2C - это внутрисистемная шина служит для подключения разнообразных устройств: датчиков, расширителей портов, дисплеев и прочего. На одну шину можно подключить одновременно большое количество устройств параллельно.

Максимальная длина линии по стандарту - до 2 метров. При выборе подходящего кабеля и подбора подтяжек длина линии может быть больше, но это не гарантирует стабильную работу.

Схема подключения

SCL - линия синхронизации. Работает всегда в режиме выхода.

SDA - линия данных. Работает в режиме входа и выхода.

На каждую линию требуется обязательная установка резисторов подтяжки - по стандарту 4.7кОм к +3.3в линии питания.

Обратите внимание, что резисторы должны стоять в одном экземпляре ! На готовых китайских платах-модулях датчиков резисторы могут быть уже установлены.

На подключаемое устройство необходимо подать питание 5 или 3.3в в зависимости от требований. Не забываем подключить общую землю (GND).

Настройка I2C на ESP8266/ESP32

На вкладке Hardware требуется указать свободные GPIO для подключения линии. После перенастройки GPIO рекомендуется перезагрузить устройство.

Ограничения для ESP8266: нельзя использовать GPIO 15 и 16 для данной линии.

Ограничения для ESP32: нельзя использовать GPIO 12 и выше 33.

Ограничения для ESP32S2: нельзя использовать GPIO 45.

Информация выше требует уточнения.

Нумерация GPIO используется оригинальная, если плата ESP8266 имеет нумерацию "левую" вида D1..D9... То смотрим корректную распиновку в документации на GPIO.


Настройка I2C на Linux приложении

I2C шина должна физически доступна на GPIO устройства.

Модуль ядра I2C должен быть загружен, в папке /dev/ устройство i2c должно быть видно. Загрузка модуля немедленно - командой modprobe i2c-dev , автозагрузка - echo "i2c-dev" >>/etc/modules . Команды следует выполнять от root пользователя. 

Чтобы получить список устройств достаточно ввести команду ls /dev/*i2c*  , I2C устройств может быть несколько, необходимо выбрать нужный согласно документации и распиновке данного устройства. Номер используемого I2C требуется установить на вкладке hardware.

Работать с  i2c можно через утилиту i2ctools , требуется установить утилиту согласно версии Linux. Получить список устройств можно командой i2cdetect -l.

Получаем I2C на обычном ПК

1. Можно воспользоваться USB-I2C переходником.

2. Современный ПК имеет несколько системных I2C шин доступных в ОС Linux. Большинство из них внутренние и не выведены наружу, но можно воспользоваться не часто используемым сейчас VGA , на котором на выводах 12(SDA), 15(SCL) 10(GND) имеется I2C на которые легко подключиться. Номер I2C устройства на VGA получаем через i2cdetect -l - там должно быть видно устройство. I2C есть и на HDMI , но подключение тут сложнее.

Возможность работы с VGA проверена только на некоторых чипсетах и не гарантирует, что оно везде есть и доступно(хотя в теории должно быть на 100% компьютерах не сильно древних). Так же VGA на современных компьютерах может вообще отсутствовать. Учитывайте, что уровни I2C на VGA 5 вольтовые и подключаемые устройства должны быть согласованы, если они работают на 3.3 в и не толерантны к 5в. Готовые Arduino модули чаще всего согласованы для работы с 5в. Подтяжка шины внутри компьютера уже имеется и на подключаемых устройствах она не требуется.

Возможность работы с другими системными I2C не проверялась - их на ПК может быть десяток и некоторые из их использование может привести к сбоям ОС.

Подключение к ПК вы выполняете на свой риск и при некомпетентном подключении можно что нибудь сжечь.


Проверка работоспособности шины и подключенных устройств

При верно подключенном и исправном устройстве I2C сканер (опция в конструкторе) будет находить адреса подключенных устройств, некоторые найденные адреса будет определять(прошивки новее 4.03.21). Некоторые устройства, например AM2321, сканер не видит(видит только при многократном обновлении страницы сканера).

При неверном подключении устройств будет выведена ошибка линии(прошивки новее 4.03.21) или выдаст большой список адресов(старые прошивки). Ошибка означает, что линия SDA наглухо притянута к GND и не меняет состояние при сканировании устройств - чаще всего это означает, что подключенные и выбранные GPIO линии не совпадают.

У некоторых опций имеется возможность менять адрес в шестеренке. У большинства датчиков/устройств есть возможность поменять адрес перемычками. Адреса устройств не должны быть одинаковые. Текущие требуемые i2c адреса отображаются у установленных опций на вкладке Hardware.