SPI и I2C на Raspberry Pi: включение, проверка и примеры

Raspberry Pi — универсальная платформа: от медиаплееров до промышленных IoT‑решений. При подключении внешних компонентов часто используются протоколы SPI и I2C. Они экономят контакты GPIO и упрощают работу с датчиками, дисплеями и считывателями карт.
В этой статье вы найдёте понятные определения, пошаговое включение, команды проверки, примеры проектов, диагностику неполадок и практические чек‑листы.
Краткие определения
- SPI — последовательный интерфейс с отдельными линиями для тактового сигнала (SCLK), передачи (MOSI) и приёма (MISO) плюс выбор ведомого (CE/SS). Хорош для высокоскоростной передачи и одно‑мастерных топологий.
- I2C — двухпроводная шина (SDA и SCL), где каждый устройство имеет 7‑битный адрес. Удобна, когда нужно подключить много устройств при ограниченном числе выводов.
Почему выбирать SPI или I2C: быстрая сводка
- Выберите SPI, если нужна скорость и простое по‑пиновому выделение для каждого устройства (или поддержка цепочки «daisy chain»).
- Выберите I2C, если важна экономия проводов и у вас много устройств с уникальными адресами.
Что такое SPI на Raspberry Pi?
SPI (Serial Peripheral Interface) — синхронизированный последовательный протокол. Raspberry Pi обычно выступает в роли мастера, а внешние модули — ведомыми. Передача управляется линией SCLK, MOSI и MISO обмениваются битами одновременно, а CE0/CE1 (или SS) выбирают конкретное ведомое.

SCLK задаёт частоту передачи. На каждом фронте такта мастер и ведомый отправляют и получают по одному биту. MOSI — от мастера к ведомому, MISO — обратно. CE0/CE1 активируют нужное устройство. Многие устройства поддерживают «daisy chain», что снижает количество необходимых линий выбора.
Примеры использования: флеш‑память, ADC (аналогово‑цифровые преобразователи), сдвиговые регистры, дисплеи и RFID‑ридеры.
Как включить SPI на Raspberry Pi
- Откройте терминал и запустите raspi-config:
sudo raspi-config- Перейдите в Interfacing Options → P4 SPI (Enable/Disable automatic loading of SPI kernel module) и ответьте Yes.
- Перезагрузите плату:
sudo rebootАльтернативный способ — редактировать /boot/config.txt:
sudo nano /boot/config.txtНайдите строку
#dtparam=spi=onи удалите ведущий #, чтобы получилось
dtparam=spi=onПосле перезагрузки должен появиться драйвер spidev и устройство /dev/spidev0.0 (или /dev/spidev0.1).
Проверка, что SPI загружен
lsmod | grep spiОжидаемые модули: spidev, spi_bcm2835 (название модуля может отличаться в зависимости от ядра), а также наличие устройств /dev/spidev*.
Что можно сделать со SPI: проекты и идеи
- RFID‑ридер (например, MFRC‑522). Подходит для замков и учёта доступа.
- Быстрые дисплеи или LED‑матрицы, где важна скорость обновления.
- Подключение внешних АЦП/ЦАП для сбора данных.
- Сдвиговые регистры для расширения выходов.
Примерная последовательность проекта: аппаратная проводка → включение SPI → установка библиотек python3‑spidev → тест с примерным скриптом.
Что такое I2C на Raspberry Pi?
I2C (Inter‑Integrated Circuit) — шина с двумя линиями: SCL (тактовая) и SDA (данные). Устройства имеют адреса (обычно 7‑битные). Мастер начинает передачу старт‑битом и адресом, затем указывает режим чтения/записи (R/W). Каждый ведомый отправляет ACK или NACK.
I2C медленнее SPI, но очень экономичен по контактам и широко поддерживается библиотеками.
Как включить I2C на Raspberry Pi
- В терминале:
sudo raspi-config- Interfacing Options → P5 I2C (Enable/Disable automatic loading of I2C kernel module). Подтвердите Yes и перезагрузите.
Или правьте /boot/config.txt:
sudo nano /boot/config.txtНайдите и раскомментируйте строку
#dtparam=i2c_arm=onчтобы получить
dtparam=i2c_arm=onПерезагрузите плату.
Установка инструментов и проверка
Для работы с I2C установите утилиты и библиотеки:
sudo apt update
sudo apt install -y i2c-tools python3-smbusПроверка шины (на современных платах обычно используется i2c‑1):
i2cdetect -y 1Команда покажет карту адресов: если устройство подключено и работает, вы увидите его адрес в таблице.
Что можно сделать с I2C: проекты и идеи
- Жидкокристаллические дисплеи (LCD) с I2C‑распределителем (I2C backpack) — экономия выводов.
- Множество датчиков (температуры, давления, акселерометры) на одной шине.
- Расширение GPIO через I2C‑модули (PCF8574, MCP23017 и т. п.).
Типичные номера контактов (Raspberry Pi 40‑pin header)
| Название | GPIO | Номер контакта | Описание |
|---|---|---|---|
| SDA | GPIO2 | 3 | I2C‑данные |
| SCL | GPIO3 | 5 | I2C‑тактовая |
| MOSI | GPIO10 | 19 | SPI Master Out Slave In |
| MISO | GPIO9 | 21 | SPI Master In Slave Out |
| SCLK | GPIO11 | 23 | SPI Clock |
| CE0 | GPIO8 | 24 | SPI Chip Enable 0 (SS) |
| CE1 | GPIO7 | 26 | SPI Chip Enable 1 (SS) |
Важно: нумерация контактов (pin numbers) отличается от нумерации GPIO. При проводке сверяйтесь с распиновкой вашей модели Pi.
Быстрая проверка и примеры команд
Проверка модулей:
lsmod | egrep "spi|i2c"Просмотр устройств в /dev:
ls -l /dev/spidev* /dev/i2c-*Сканирование I2C:
i2cdetect -y 1Установка Python‑пакетов для работы со шинами:
sudo apt install -y python3-pip python3-spidev python3-smbus
pip3 install RPI.GPIOПример простого Python‑скрипта для SPI (с использованием spidev):
import spidev
spi = spidev.SpiDev()
spi.open(0, 0) # шина 0, устройство CE0
spi.max_speed_hz = 500000
resp = spi.xfer2([0x01, 0x02, 0x03])
print('Ответ устройства:', resp)
spi.close()Простой пример проверки I2C (чтение регистров) можно реализовать через smbus:
import smbus
bus = smbus.SMBus(1) # i2c-1
addr = 0x3c # пример адреса
try:
data = bus.read_byte(addr)
print('Чтение успешно, байт:', data)
except Exception as e:
print('Ошибка доступа к I2C:', e)Отладка: типичные проблемы и решения
Устройство не обнаруживается в i2cdetect:
- Проверьте питание (VCC и GND).
- Проверьте правильность адреса и pull‑up резисторов (I2C требует подтяжки SDA/SCL).
- Убедитесь, что в /boot/config.txt раскомментирована строка dtparam=i2c_arm=on.
- Проверьте, добавлен ли пользователь в группу i2c:
sudo adduser.i2c
/dev/spidev0.0 отсутствует:
- Проверьте dtparam=spi=on в /boot/config.txt или включение через raspi-config.
- Убедитесь, что модуль spidev загружен (lsmod).
- Проверьте, не занят ли CE вывод другим устройством.
Права доступа к устройствам:
- Обычно устройства принадлежат группам spi и i2c. Добавьте пользователя в соответствующие группы:
sudo adduserиspi sudo adduser.i2c
- Обычно устройства принадлежат группам spi и i2c. Добавьте пользователя в соответствующие группы:
Конфликты выводов:
- Некоторые аппаратные функции (например, HAT‑шляпы) используют одни и те же GPIO. Сверьте документацию устройств.
Важно: всегда отключайте питание перед переподключением проводов.
Чек‑лист по внедрению (роль‑ориентированный)
Для хоббиста:
- Включить интерфейс через raspi-config.
- Установить i2c-tools или spidev.
- Подключить устройство и запустить i2cdetect / пример spidev.
Для разработчика ПО:
- Добавить автоматическую загрузку в /boot/config.txt.
- Настроить сервис systemd для запуска тестов/демонов.
- Настроить права доступа и test‑suite для CI.
Для интегратора/инженера систем:
- Спроектировать физические уровни (уровни напряжения, фильтрацию).
- Проверить помехи и длину проводов для I2C.
- Провести стресс‑тесты и запланировать мониторинг ошибок.
Методика быстрой валидации (mini‑methodology)
- Аппаратная проверка: питание, земля, правильная нумерация контактов.
- Включение интерфейса (raspi-config или /boot/config.txt).
- Установка инструментов (i2c-tools, python3‑spidev).
- Проверка видимости устройств (/dev, i2cdetect).
- Простая передача/чтение данных.
- Автоматизация и мониторинг.
Когда не использовать SPI/I2C — контрпримеры
- Если у вас много устройств с высокими требованиями к пропускной способности и сложной топологией — иногда выгоднее применять UART/USB или специализированные интерфейсы.
- Для дистанционного соединения на большие расстояния I2C и SPI не подходят без согласования уровней и экранирования.
Диаграмма выбора: SPI или I2C
flowchart TD
A[Нужно подключить периферию?] --> B{Сколько проводов можно выделить?}
B -->|2 провода| C[I2C]
B -->|4+ провода| D{Нужна ли высокая скорость?}
D -->|Да| E[SPI]
D -->|Нет| F[I2C или GPIO расширитель]
C --> G[Проверить адресацию и подтяжки]
E --> H[Проверить CE, MOSI, MISO, SCLK]Критерии приёмки
- Для I2C: i2cdetect показывает адрес подключённого устройства; чтение/запись регистров проходит без ошибок.
- Для SPI: /dev/spidev0.* присутствует; примерный обмен через spidev возвращает ожидаемый ответ.
- Аппаратно: нет скачков питания; провода надёжно закреплены.
Советы по совместимости и миграции
- Внимательно проверьте уровни напряжения: Pi работает на 3.3V, многие модулі 5V — требуется преобразователь уровней.
- При переходе с других плат уточняйте номера GPIO и нумерацию контактов (board vs BCM).
- Для промышленных применений рассмотрите изоляцию и защиту линий от помех.
Резюме
SPI и I2C — ключевые интерфейсы для расширения возможностей Raspberry Pi. Простое включение через raspi-config или /boot/config.txt, базовые инструменты (i2c-tools, spidev) и последовательная методика проверки позволят быстро подключить датчики, дисплеи и считыватели. Начните с простых примеров и постепенно переходите к интеграции в проекты.
Итоговые рекомендации: включите интерфейс, установите инструменты, выполните аппаратную проверку, запустите i2cdetect/spidev и автоматизируйте тесты в процессе разработки.
Подсказка для публикации: используйте краткое изображение распиновки в качестве og:image и поместите на странице ссылку на официальную распиновку Raspberry Pi.
Похожие материалы
Free lensing — мечтательные фотографии
Trello для фрилансера — управление проектами и клиентами
Идеальная фотосессия беременных: 6 ключевых советов
Слои в фотографии: добавить глубину и выразительность
Как делать лучшие headshot-портреты