Работа с GPIO в Linux на примере Banana Pi BPI-M64. Часть 5. Device Tree overlays. Шина I2C, подключение датчиков Bosh BMx

Пришло время задействовать шину I2C, будем подключать датчики серии BMP и BME компании Bosch Sensortec, такие как: BME280, BMP085, BMP180, и BMP280. Подключение датчиков по шине I2C позволяет экономить контакты GPIO. Дополнительно, в подобных датчиках уже есть АЦП, и значение напряжения уже не проецируется на шкалу температуры, а выдается в цифровом виде. Помимо датчиков температуры, к шине I2C можно подключать и другие всевозможные датчики и модули, например расширитель контактов GPIO
MCP23017 I2C I/O Expander.

Оглавление

  1. Постановка задачи
  2. Что такое шина I2C?
  3. Шина I2C/TWI на процессоре Allwinner A64
  4. Датчик BME280
  5. Схема подключения датчика BME280 к шине I2C
  6. Файл наложения устройств DTS для включения шины I2C
  7. Поиск устройств на шине I2C
  8. Файл наложения устройств DTS для датчика BME280
  9. Подсистема Linux Industrial I/O (промышленный ввод/вывод)
  10. Чтение значений датчика BME280
  11. Решение проблем
  12. Литература

Постановка задачи

Подключить датчики BME280, BMP085, BMP180, и BMP280 компании Bosch Sensortec для замера физических величин:  температуры, влажности, атмосферного давления. Все датчики должны быть подключены к шине I2C.

  • Плата Banana Pi BPI-M64 установлена версия Armbian_21.02.1_Bananapim64_bionic_current_5.10.12_minimal.img.xz, основанная на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.10.12. uname: Linux bananapim64 5.10.12-sunxi64 #21.02.1 SMP Wed Feb 3 20:42:58 CET 2021 aarch64 aarch64 aarch64 GNU/Linux (обновление до последней версии ядра Linux, декларировали повышение производительности на ARM архитектуре, решение проблем со звуком в Armbian, но это не точно).

Что такое шина I2C?

I2C InterIC, или IIC (I2C) — двунаправленная шина передачи данных, разработанная еще в 1980 году компанией Philips для осуществления связи между разными схемами и устройствами. Очень часто на схемах указывают I2C/TWI(Two Wire Interface), это одно и тоже. Дело в том, что компания Philips, свою разработанную шину запатентовала и для ее использования необходимо было платить роялти, что конечно же разработчикам устройств не очень то хотелось. Так появился клон шины I2C — шина TWI, свободная от лицензионных отчислений. Все что применимо к шине I2C, применимо и к шине TWI, и наоборот.

К шине I2C можно подключить до 127 устройств, но есть одно «НО»: доступно для подключения всего 112 адресов, потому что 16 зарезервированы. Передача данных осуществляется по двум проводам:

  • SDA (Serial Data) — эта линия отвечает непосредственно за передаваемые данных.
  • SCL (Serial Clock) — эта линия отвечает за синхронизацию соединения.

Линии SCL и SDA шины I2C являются двунаправленными, что делает невозможным подключение устройств с разными напряжениями питания. Для выхода из такой ситуации нужно использовать конвертеры уровней напряжения!

Максимальное допустимое количество микросхем, подсоединённых к одной шине, ограничивается максимальной емкостью шины 400 пФ.

Режимы работы шины:

  • Скоростной — 400 кбит/с;
  • Обычный — 100 кбит/с;
  • С пониженной скоростью — 10 кбит/с.

Особенности подключения к шине I2C

Как было сказано выше, к шине I2C можно подключить до 127 устройств. Устройство которое будет управлять этим набором периферии является ведущим (master), а модули подключенные к нему — ведомыми (slaves).

Генерация сигнала осуществляется «прижиманием» линии к нулю (низкий уровень), высокий уровень присутствует по умолчанию за счет подключенных подтягивающих резисторов к каждой из линий (SCL, SDA) и шине питания (VCC). От сопротивления этих резисторов зависит скорость восстановления на линиях высокого уровня, а заодно и скорость работы шины I2C.

Оптимальное сопротивление подтягивающих резисторов — 10 кОм, минимальное — примерно 1,5 кОм. Как правило, на многих готовых модулях уже установлены подтягивающие резисторы сопротивлением 3,3 — 4,7 кОм.

В случае использование питания в 3.3V линии SDA и SCL можно подтянуть к питанию резисторами  сопротивлением в 4,7 кОм.

Схема подключения шины I2C с подтягивающими резисторами сопротивления 3,3 — 4,7 кОм.
Linux I2C Bosch BME280

Напряжения высокого (HIGH) и низкого (LOW) уровней на линиях I2C не фиксированы! Они напрямую зависят от напряжения питания подключаемого модуля.

В случае подключения нескольких модулей к одной шине I2C подтягивающие сопротивления окажутся включенными параллельно и результирующее сопротивление такого себе, комплексного подтягивающего резистора, окажется достаточно низким (менее 1,5 кОм), что в свою очередь может негативно сказаться на работе модулей и шины в целом.

Поэтому, при подключении нескольких готовых модулей к одной шине I2C нужно осмотреть модули и оставить подтягивающие резисторы только на одном из модулей, а остальные — отпаять!

Адресация в шине I2C

Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу. В обычном режиме используется 7-битная адресация.

Шина I2C/TWI на процессоре Allwinner A64

Ядром одноплатного компьютера Banana Pi BPI-M64 является процессор Allwinner A64. Рассмотрим спецификацию Allwinner A64:

  • Два контроллера интерфейса TWI
  • Поддержка стандартного режима (до 100 Кбит/с) и быстрого режима (до 400 Кбит/с) передачи данных
  • Роль ведущего(master)/ведомого(slaves) настраивается.
  • Доступны транзакции с 10-битной адресацией
  • Возможность работы в широком диапазоне входных тактовых частот

На самой плате разведено два интерфейса TWI:

  • TWI0 — располагается на разъеме MIPI DSI display
  • TWI1 — располагается на 40-контактном разъеме (типа Raspberry Pi 3 GPIO), к нему будем подключать датчики.

Датчик BME280

Linux I2C Bosch BME280

Модуль BME280 фирмы Bosch Sensortec предназначен для измерения атмосферного давления, температуры и влажности. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.

Технические характеристики модуля BME280:

  • Интерфейс: SPI, I2C;
  • Напряжение питания: от 3,3 до 5 В;
  • Диапазон измерений давления: 300-1100hPa;
  • Диапазон измерений температуры: -40 — +85 °C;
  • Диапазон измерений влажности: 0 — 100 %;
  • Энергопотребление: режим измерений — 3.6 нА; в спящий режим: — 0.1 нА;
  • Точность измерений:давление — 0.01 hPa ( < 10 cm). Температура — 0.01° C. Влажность – 3%.

Назначение контактов:

  • VCC — питание модуля 3.3 В или 5 В;
  • GND —  Ground;
  • SCL — линия тактирования (Serial CLock);
  • SDA — линия данных (Serial Data).

Данный модуль работает по двухпроводному интерфейсу I2C, адрес по умолчанию 0x76.

Новое поколение датчиков BOSCH обладают низким энергопотреблением. Например, для сбора показаний влажности и температуры раз в секунду потребуется всего 1,8 мкА. Если нужно анализировать еще и давление, суммарный ток составит 3,6 мкА. В режиме сна датчик потребляет и вовсе 0,1 мкА.

Такая энергоэффективность позволяет использовать датчик в мобильных устройствах умного дома, которые годами питаются от одного литиевого элемента питания, например, CR2450.

Данный датчик емкостного типа, что заведомо делает его более точным, чем резистивные датчики типа DHT11.

DataSheet на датчик BME280 можно загрузить по ссылке BST-BME280_DS001-10 [PDF 1,84 МБ]

Датчик был куплен на площадке Aliexpress позиция BME280 3.3V лот BME280 5V 3.3V Digital Sensor Temperature Humidity Barometric Pressure Sensor Module I2C SPI 1.8-5V продавец SAMIORE Store в 2020 году за $1.97. Сейчас, на 23.04.2021 цена возросла до $9.50.

Схема подключения датчика BME280 к шине I2C

Исходя из схемы (Распиновка GPIO для Banana Pi BPI-M64) шина I2C располагается на контактах № 3 и 5. Контакт №3 — TWI1-SDA — передача данных. Контакт №5 — TWI1-SCL — синхронизация, время. На линию TWI1-SDA и TWI1-SCL установим подтягивающие резисторы сопротивлением 4,7 кОм к линии питания VCC.

Схема подключения датчика BME280 к шине I2C
Linux I2C Bosch BME280

Файл наложения устройств DTS для включения шины I2C

Как формируются файлы наложения устройств (DTS) можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.

По умолчанию в основном дереве устройств sun50i-a64-bananapi-m64.dts есть узел для шины I2C, и он включен по умолчанию.

Узел i2c1-pins (из файла sun50i-a64-bananapi-m64.dts) по адресу «/soc/pinctrl@1c20800/i2c1-pins» содержит указания используемых контактов:

i2c1-pins {
	pins = "PH2", "PH3";
	function = "i2c1";
	bias-pull-up;
	phandle = <0x3b>;
};

Узел i2c@1c2b000 (из файла sun50i-a64-bananapi-m64.dts) по адресу «/soc/i2c@1c2b000» содержит само устройство I2C:

i2c@1c2b000 {
	compatible = "allwinner,sun6i-a31-i2c";
	reg = <0x1c2b000 0x400>;
	interrupts = <0x0 0x7 0x4>;
	clocks = <0x2 0x40>;
	resets = <0x2 0x2b>;
	pinctrl-names = "default";
	pinctrl-0 = <0x3b>;
	status = "okay";
	#address-cells = <0x1>;
	#size-cells = <0x0>;
	phandle = <0x88>;
};

Как видно из примера, статус устройства status = «okay», означает что шина I2C включена, и можно подключать датчики. Но если будет выключена, то потребуется создать файл dts для включения шины I2C. На этот случай приведен пример такого файла.

Создадим файл DTS с названием: sun50i-a64-i2c1-on.dts:

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun50i-a64";

	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
			i2c1 = "/soc/i2c@1c2b000";
		};
	};

	fragment@1 {
		target = <&i2c1>;
		__overlay__ {
			pinctrl-names = "default";
			pinctrl-0 = <&i2c1_pins>;
			status = "okay";					
		};
	};
};

Рассмотрим параметры:

  • pinctrl-0 = <&i2c1_pins> — ссылка на используемые контакты узла по адресу «/soc/pinctrl@1c20800/i2c1-pins».
  • status = «okay» — задействует шину I2C на плате для подключения устройств

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-i2c1-on.dtbo sun50i-a64-i2c1-on.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): sun50i-a64-i2c1-on. После перезагрузки платы, шина I2C будет включена.

Поиск устройств на шине I2C

После включения шины I2C и подключения датчика BME280 необходимо убедиться что все работает и датчик отзывается. Для этого необходимо установить утилиту  i2c-tools , которая производит поиск всех устройств подключенных к шине I2C.

Установка утилиты  i2c-tools :

sudo apt-get update
sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools

Формат команды поиска устройств на шине I2C:  sudo i2cdetect -y 0 , где 0 — номер шины I2C (1,2,3,..). На 40-контактном разъеме (типа Raspberry Pi 3 GPIO) располагается TWI1, в которому подключили датчик BME280. Поэтому вызываемая команда будет выглядеть так:  sudo i2cdetect -y 1 . Выполним поиск устройств на шине I2C порт «1»:

root@bananapim64:~# sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
root@bananapim64:~#

Шина I2C работает и датчик BME280 по адресу 0x76 найден. Теперь можно переходить к формированию файла DTS для чтения значений самого датчика.

Файл наложения устройств DTS для датчика BME280

В Armbian уже есть драйвер для датчика BME280, поэтому все что требуется, это создать файл описания устройства в формате DTS, скомпилировать его в формат DTBO, и перезагрузить одноплатный компьютер.

Драйвера для Linux, в том числе и для BME280 располагаются по пути:  /lib/modules/$(uname -r)/kernel/drivers/ . Убедимся в наличие драйвера, командой:

find /lib/modules/$(uname -r)/kernel/drivers/ -iname "*bmp280*"

Результат выполнения:

root@bananapim64:~# find /lib/modules/$(uname -r)/kernel/drivers/ -iname "*bmp280*"
/lib/modules/5.10.12-sunxi64/kernel/drivers/iio/pressure/bmp280.ko
/lib/modules/5.10.12-sunxi64/kernel/drivers/iio/pressure/bmp280-spi.ko
/lib/modules/5.10.12-sunxi64/kernel/drivers/iio/pressure/bmp280-i2c.ko
root@bananapim64:~#

Из результата видно наличие драйвера bmp280.ko для интерфейса SPI и I2C, можно продолжать настройку.

Для получения детальной информации о драйвере необходимо выполнить команду:  modinfo bmp280 .

Результат выполнения:

root@bananapim64:~# modinfo bmp280
filename:       /lib/modules/5.10.12-sunxi64/kernel/drivers/iio/pressure/bmp280.ko
license:        GPL v2
description:    Driver for Bosch Sensortec BMP180/BMP280 pressure and temperature sensor
author:         Vlad Dogaru <vlad.dogaru@intel.com>
depends:        industrialio
intree:         Y
name:           bmp280
vermagic:       5.10.12-sunxi64 SMP mod_unload aarch64
signat:         PKCS#7
signer:
sig_key:
sig_hashalgo:   md4
root@bananapim64:~#

Создадим файл DTS с названием: sun50i-a64-i2c1-bme280.dts (на основе примера bmp085.yaml):

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun50i-a64";

	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
			i2c1 = "/soc/i2c@1c2b000";
		};
	};

	fragment@1 {
		target = <&i2c1>;
		__overlay__ {
			pinctrl-names = "default";
			pinctrl-0 = <&i2c1_pins>;
			status = "okay";
			
			bme280@76 {
				compatible = "bosch,bme280";				
				reg = <0x76>;				
				status = "okay";				
			};
		};
	};
};

Рассмотрим параметры:

  • pinctrl-0 = <&i2c1_pins> — ссылка на используемые контакты узла по адресу «/soc/pinctrl@1c20800/i2c1-pins»;
  • status = «okay» — включает устройство;
  • compatible = «bosch,bme280» — подключаемый драйвер для устройства.
  • reg = <0x76> — адрес устройства на шине I2C: 0x76;

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-i2c1-bme280.dtbo sun50i-a64-i2c1-bme280.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): sun50i-a64-i2c1-bme280. После перезагрузки платы, по пути  /sys/bus/i2c/devices  появится устройство  1-0076 , которое соответствует датчику BME280.

Результат выполнения:

root@bananapim64:~# cd /sys/bus/i2c/devices
root@bananapim64:/sys/bus/i2c/devices# ls -l
total 0
lrwxrwxrwx 1 root root 0 Apr 24 13:46 1-0076 -> ../../../devices/platform/soc/1c2b000.i2c/i2c-1/1-0076
lrwxrwxrwx 1 root root 0 Apr 24 13:46 i2c-1 -> ../../../devices/platform/soc/1c2b000.i2c/i2c-1
lrwxrwxrwx 1 root root 0 Apr 24 13:46 i2c-2 -> ../../../devices/platform/soc/1ee0000.hdmi/i2c-2
root@bananapim64:/sys/bus/i2c/devices#

Подсистема Linux Industrial I/O (промышленный ввод/вывод)

Драйвер для BME280 использует подсистему Linux Industrial I/O (промышленный ввод/вывод). IIO — это подсистема ядра Linux для аналого-цифровых преобразователей (АЦП), цифро-аналоговых преобразователей (ЦАП) и различных типов датчиков. Может использоваться на высокоскоростных промышленных устройствах. Она, также, включает встроенный API для других драйверов.

Подсистема Industrial I/O Linux предлагает унифицированную среду для связи (чтения и записи) с драйверами, охватывающими различные типы встроенных датчиков и несколько исполнительных механизмов. Он также предлагает стандартный интерфейс для приложений пользовательского пространства, управляющих датчиками через sysfs и devfs.

Вот несколько примеров поддерживаемых типов датчиков в IIO:

  • АЦП/ЦАП
  • акселерометры
  • магнетометры
  • гироскопы
  • давление
  • влажность
  • температура
  • дальнометры

Поддерживаются устройства ввода данных (HID-устройства), взаимодействующие с человеком:

  • Клавиатура
  • Мышь
  • Сенсорный экран
  • Джойстик

Более подробно ознакомится с IIO можно в публикации Linux Industrial I/O Subsystem. Так же есть перевод на ресурсе Хабр — Нам нужно поговорить про Linux IIO.

Каждое устройство типа IIO регистрируется в каталоге по пути  /sys/bus/iio/devices  с именем  iio:device0 ,  iio:device1 ,  iio:device2 , и т.д.

Таким образом датчик BME280 доступен по путям:  /sys/bus/i2c/devices/1-0076/iio:device0  и  /sys/bus/iio/devices/iio:device0 .

Чтение значений датчика BME280

Читать значения датчика будем по пути  /sys/bus/i2c/devices/1-0076/iio:device0 .

Рассмотрим структуру каталога:

root@bananapim64:~# tree /sys/bus/i2c/devices/1-0076/iio:device0
/sys/bus/i2c/devices/1-0076/iio:device0
├── dev
├── in_humidityrelative_input
├── in_humidityrelative_oversampling_ratio
├── in_pressure_input
├── in_pressure_oversampling_ratio
├── in_temp_input
├── in_temp_oversampling_ratio
├── name
├── of_node -> ../../../../../../../firmware/devicetree/base/soc/i2c@1c2b000/bme280@76
├── power
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_time
│   ├── runtime_status
│   └── runtime_suspended_time
├── subsystem -> ../../../../../../../bus/iio
└── uevent

3 directories, 14 files
root@bananapim64:~#

Для нас представляет интерес файлы: in_humidityrelative_input, in_pressure_input, in_temp_input.

Файл  /name  содержит название датчика для идентификации:

Результат выполнения:

root@bananapim64:~# cat /sys/bus/i2c/devices/1-0076/iio:device0/name
bme280
root@bananapim64:~#

Рассмотрим значения доступные для чтения:

  • in_humidityrelative_input — относительная влажность в миллипроцентах (МИЛЛИ — приставка в сложных названиях единиц физ. величин, означающая уменьшение основной единицы измерения в 1000 раз);
  • in_pressure_input — атмосферное давление, первое значение до точки в килопаскалях (кПа). 1 мм. рт. ст. равен 133,32 Паскаль;
  • in_temp_input — температура в милли градусах Цельсия.

Прочитаем все доступные значения:

root@bananapim64:~# cd /sys/bus/i2c/devices/1-0076/iio:device0
root@bananapim64:/sys/bus/i2c/devices/1-0076/iio:device0# cat in_humidityrelative_input
28491
root@bananapim64:/sys/bus/i2c/devices/1-0076/iio:device0# cat in_pressure_input
100.368437500
root@bananapim64:/sys/bus/i2c/devices/1-0076/iio:device0# cat in_temp_input
25850
root@bananapim64:/sys/bus/i2c/devices/1-0076/iio:device0#

По результатам замера получается, что в комнате:

  • Относительная влажность: in_humidityrelative_input = 28491 / 1000 = 28,491 %;
  • Атмосферное давление: in_pressure_input = 100.368437500 * 1000 = 100368,437500 (Pa,Па) или 100368,437500/133,32 = 752,83 мм. рт. ст.;
  • Температура: in_temp_input = 25850 / 1000 = 25,850 градусов Цельсия.

Решение проблем

Если получить значения от датчика BME280 не удалось, то выполните следующие действия:

  1. До подключение датчика BME280 рекомендуется его подключить к Arduino или другой Arduino-совместимой плате. После успешного тестирования и получения корректных данных можно подключать к одноплатному компьютеру.
  2. После подключения датчика необходимо выполнить сканирование устройств на шине I2C командой:  sudo i2cdetect -y 0 , где 0 — номер шины I2C (1,2,3,..). Адрес датчика должен быть в таблице. Если в таблице отсутствует адрес датчика, то необходимо проверить физическое подключение датчика, возможно были перепутаны провода подключения.
  3. Если адрес датчика есть в таблице, то можно включать слой DTS с драйвером для BME280.
  4. После включения слоя DTS для BME280 и перезагрузки выполните сканирование шины I2C:
    root@bananapim64:/sys/bus/i2c/devices/1-0076/iio:device0# sudo i2cdetect -y 1
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- UU --
    root@bananapim64:/sys/bus/i2c/devices/1-0076/iio:device0#
    

    Адрес датчика должен быть заменен на UU, это говорит что датчик был задействован операционной системой. После этого, показания датчика должны быть доступны.

  5. Выполните команду:  lsmod | grep i2c Результат выполнения , должен содержать информацию о загруженном драйвере:
    root@bananapim64:~# lsmod | grep i2c
    bmp280_i2c             16384  0
    bmp280                 24576  2 bmp280_i2c,bmp280_spi
    i2c_mv64xxx            24576  0
    root@bananapim64:~#
    
  6. Если ничего из выше перечисленного не помогло, то проблема либо с подтягивающими резисторами, либо датчик просто нерабочий. Итоговое сопротивление линий SCL, SDA не должно быть менее 1,5 кОм. Необходимо отпаять лишние резисторы и снова подключить датчик.

TODO: добавить подключение датчиков BMP085, BMP180, и BMP280.

Файлы DTS для подключения датчиков компании Bosch Sensortec BMP085, BMP180, BMP280, BME280 и другие файлы наложения дерева доступны в каталоге GitHub Banana-Pi-BPI-M64/dt-overlays/

Литература

  1. I²C — Википедия
  2. Raspberry Pi. Работа с портами ввода-вывода GPIO — MicroTechnics.ru
  3. Raspberry Pi. Настройка и использование шины I2C. — MicroTechnics.ru
  4. Шина I2C. Основные понятия — Radio Prog
  5. Знакомство с шиной I2C в Raspberry Pi, работаем с ADC-DAC PCF8591 на Python — Ph0en1x.net
  6. Интерфейс I2C по-русски: особенности аппаратной и программной реализации шины, плюсы и минусы — kmpu.ru
  7. Подтяжка линии I2C — Zelectro
  8. Bosch Sensortec BME280 sensor driver — GitHub BoschSensortec/BME280_driver
  9. bmp085.yaml — GitHub torvalds/linux
  10. Linux Industrial I/O Subsystem — Wiki Analog Devices
  11. Нам нужно поговорить про Linux IIO — maquefel Хабр
  12. Building a Linux system for the STM32MP1: connecting an I2C sensor — bootlin Thomas Petazzoni Posted onMay 20, 2019
  13. Взаимодействие BME280, датчика температуры, влажности и давления, с Arduino — Radio Prog
  14. BME280, ардуино и BluePill — neirogeek hobbyprojects.home.blog
  15. Датчик атмосферного давления, влажности и температуры BME280 — 3DiY
  16. BME280 — датчик атмосферного давления, влажности и температуры — СЕРГЕЙ блог rchip

Вам также может понравиться

About the Author: Anton

Programistik