Интерфейсы: аналоговый, I2C, SPI

Урок-обзор: какими способами датчик отдаёт показания контроллеру.

Интерфейс датчика — способ передачи показаний: либо аналоговым напряжением (через АЦП), либо цифровым кодом по шине (I2C, SPI).

Датчик мало измерить — результат нужно доставить контроллеру. Старые и простые датчики отдают аналоговое напряжение, которое вы сами оцифровываете. Современные содержат АЦП внутри и отдают готовые числа по цифровой шине. Разберём три самых ходовых варианта без кода — это про архитектуру.

Аналоговый выход

Датчик выдаёт напряжение, пропорциональное величине; вы заводите его на вход АЦП микроконтроллера и пересчитываете код в величину (разделы 3–4). Просто и дёшево, но провод ловит наводки, а точность ограничена вашим АЦП и опорным напряжением. Подходит для одного-двух близких датчиков.

I2C: две линии, много устройств

I2C — последовательная шина из двух проводов: SDA (данные) и SCL (тактирование). На одной паре проводов висят десятки устройств, каждое со своим адресом. Контроллер (master) обращается по адресу, устройство (slave) отвечает.

СвойствоI2C
Проводов данных2 (SDA + SCL)
Адресацияпо адресу устройства
Скоростьобычно 100–400 кбит/с
Плюсмного датчиков на двух проводах
Минусмедленнее SPI, нужны подтягивающие резисторы

SPI: быстрее, но больше проводов

SPI — тоже последовательная шина, но с отдельными линиями: MOSI и MISO (данные в обе стороны), SCLK (такт) и отдельный сигнал выбора CS на каждое устройство. Нет адресации — вместо неё выбор устройства ножкой CS.

СвойствоSPI
Проводов3 общих + по CS на устройство
Скоростьединицы–десятки Мбит/с
Выбор устройстваотдельной линией CS
Плюсбыстро, полнодуплексно
Минусмного проводов при многих устройствах

Как работает под капотом

Цифровые шины переносят уже оцифрованное число, поэтому невосприимчивы к наводкам так, как аналоговый провод: помеха либо исказит бит (и это заметит контрольная сумма), либо нет. I2C экономит проводá ценой скорости и удобен, когда датчиков много, а данных мало (температура, давление). SPI выбирают, когда нужен поток данных побыстрее (дисплеи, быстрые АЦП, IMU с высокой частотой). Выбор интерфейса — это компромисс между числом проводов, скоростью и количеством устройств на шине.

Частые ошибки

  • Вешать два устройства с одинаковым адресом на одну шину I2C — конфликт.
  • Забыть подтягивающие резисторы на линиях I2C — шина не заработает.
  • Гонять длинный аналоговый провод рядом с силовыми линиями — наводки испортят показания.

Итог

  • Аналоговый выход прост, но чувствителен к наводкам и ограничен вашим АЦП.
  • I2C — две линии и адресация, много датчиков на одной шине, но небыстро.
  • SPI — быстрее и полнодуплексно, но требует отдельной линии выбора на каждое устройство.
Проверьте себя
1. Сколько линий данных и тактирования у шины I2C?
AОдна
BДве (SDA и SCL)
CЧетыре
DЗависит от числа устройств
2. Чем SPI выбирает конкретное устройство на шине?
AПо адресу
BОтдельной линией CS (chip select)
CПо скорости
DСлучайно