UART, SPI, I2C и GPIO: базовые интерфейсы

Тема дорожной карты · Embedded / Системный программист

Четыре интерфейса, с которых начинается любая работа с периферией. GPIO — просто ножка, которую можно установить в ноль или единицу либо прочитать. UART — последовательная шина без тактового сигнала, через которую прошивка пишет логи и общается с модемами. SPI и I2C — две синхронные шины для датчиков, дисплеев, флеш-памяти. Каждый из них устроен просто, но в деталях — тайминги, подтяжки, адресация — скрыты самые долгие часы отладки с логическим анализатором.

Как это работает

GPIO настраивается через регистры режима: вход, выход push-pull или open-drain, альтернативная функция (когда ножку забирает UART или SPI), подтяжка вверх или вниз, скорость фронта. Чтение входа — это чтение регистра IDR, запись — регистр ODR или атомарные BSRR-регистры установки и сброса, которые не требуют цикла чтение-изменение-запись.

UART передаёт байт как стартовый бит, 8 бит данных, опциональный бит чётности и стоп-бит. Обе стороны должны заранее договориться о скорости, например 115200 бод; тактового провода нет, поэтому расхождение частот более 2–3 % ломает приём. Линии TX и RX перекрещиваются, а уровни на плате — 3,3 В, тогда как RS-232 использует ±12 В и требует преобразователя.

SPI — это четыре линии: тактовый SCLK, данные MOSI и MISO и выбор устройства CS для каждого ведомого. Мастер генерирует такт, обмен всегда дуплексный: отправляя байт, вы одновременно принимаете байт. Полярность и фаза такта (CPOL, CPHA) задают один из четырёх режимов, и они должны совпадать с даташитом датчика. Скорости — десятки мегагерц.

I2C использует всего две линии SDA и SCL с открытым стоком и внешними подтяжками. Каждое устройство имеет 7-битный адрес, транзакция начинается со стартового условия, адреса и бита чтения-записи, а каждый байт подтверждается битом ACK. Скорости — 100 кГц, 400 кГц, реже 1 МГц. На одной шине могут висеть десятки устройств, и она поддерживает несколько мастеров.

Когда применять

UART незаменим для отладочной консоли и модулей связи вроде GSM, GPS, Bluetooth-мостов. SPI выбирают для быстрых потоков: дисплеи, SD-карты, внешняя флеш, АЦП с высокой частотой выборки. I2C уместен для медленных датчиков температуры, акселерометров, EEPROM и часов реального времени, когда важна экономия ножек. Прямой GPIO — для кнопок, светодиодов, реле и реализации нестандартных протоколов программно.

Типичные ошибки

На I2C забытые подтяжки или их неверный номинал дают «висящую» шину: SDA остаётся в нуле, и контроллер ждёт вечно; восстановление — 9 тактов SCL вручную. На SPI режим CPOL/CPHA перепутан с даташитом, и приходит сдвинутый на бит мусор. На UART несовпадение скорости из-за неточного тактирования от внутреннего RC-генератора проявляется как случайные символы. Общая ошибка — блокирующий опрос флагов вместо прерываний или DMA: процессор тратит всё время на ожидание. И, наконец, длинные провода без учёта ёмкости: I2C на 400 кГц через метровый шлейф работать не будет.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →