Когда смартфон беседует сам с собой: знакомство с UART, I2C и SPI
Плата смартфона. Источник.
Возьмите в руки смартфон и мысленно разберите его. Внутри обитает целая колония крошечных микросхем, и большинство из них даже не подозревает о существовании соседей. Контроллер батареи ничего не слышал о сканере отпечатков, а датчик приближения не догадывается, зачем рядом жужжит вибромотор.
Чтобы эти безмолвные чужаки заработали как единый организм, их нужно было научить понимать друг друга. С этим справились протоколы связи, о них мы и поговорим. Внутри телефона их немало, но мы разберем три самых простых и распространенных: UART, I2C и SPI. Материал пригодится и новичкам, которые только знакомятся с темой, и тем, кто хочет освежить базовые знания.
Правила хорошего тона
Хотя в качестве примера выбран смартфон, устройства общаются между собой буквально везде. В компьютерах, ноутбуках и даже в аэрогриле происходит примерно то же самое.
Слово «протокол» звучит устрашающе, но суть у него простая: это набор заранее согласованных правил. Сразу уточню терминологию. UART, I2C и SPI называют то интерфейсами, то протоколами, и в повседневной речи эти слова взаимозаменяемы. Строго говоря, UART — это название самого блока-приемопередатчика, однако и способ связи называют так же, поэтому я буду придерживаться этой привычки.
Многим протоколам присущ общий элемент — шина.

Шина — это набор проводников, к которым одновременно подключены все нужные микросхемы. Представьте общий коридор, в который выходят двери сразу нескольких кабинетов. На плате такие проводники выглядят как тонкие медные дорожки. Далее слова «провод» и «линия» используются как синонимы.
Когда устройство что-то передает, оно меняет напряжение на линии, переключая его между двумя уровнями — низким и высоким. Так формируется последовательность нулей и единиц.
У этой последовательности есть свой ритм, и задает его тактовый сигнал, который вырабатывает ведущее устройство (об иерархии мы поговорим чуть ниже). Правда, в I2C ведомый может ненадолго притормозить такт, если не успевает. В синхронных протоколах вроде I2C и SPI для тактирования отведен отдельный провод: так обе стороны точно знают, в какой момент считывать значение с линии данных, не опасаясь, что оно еще не успело установиться.

В асинхронном протоколе UART отдельного тактового провода нет: у каждой стороны собственные внутренние часы, которые заранее настроены на одну и ту же скорость передачи.

Снижаем цены на выделенные серверы в реальном времени
Успейте арендовать со скидкой до 35%, пока лот не ушел другому.
Кто здесь главный
Прежде чем переходить к конкретным протоколам, разберемся, как выстроена иерархия между микросхемами. Она существует в I2C и SPI, а вот в UART ее нет. Представьте совещание: один человек ведет беседу и поочередно предоставляет слово каждому участнику, а остальные молчат, пока не услышат обращение к себе.
В телефоне роль ведущего чаще всего достается главному процессору. Ведущие устройства традиционно называются master. А датчик приближения, гироскоп и прочие компоненты выступают ведомыми, или slave-устройствами. Они просто ждут, когда к ним обратятся (максимум, что им доступно, — подать сигнал по отдельному проводу прерывания). В новых редакциях документации терминология изменилась: в I2C используются controller и target, в SPI — чаще всего controller и peripheral, но в большинстве даташитов по-прежнему встречаются master и slave.
UART
Начнем с одного из самых простых и древних способов договориться в нашей тройке. Этот протокол называется UART — Universal Asynchronous Receiver-Transmitter, то есть универсальный асинхронный приемопередатчик. Так зовется сам блок внутри чипа, который принимает и отправляет биты, но в обиходе тем же словом обозначают и сам способ связи.
Именно по UART главный процессор нередко общается с модулем Bluetooth, если тот выполнен отдельной микросхемой. Кроме того, в некоторых телефонах по нему идет обмен с приемником спутниковой навигации, который по привычке называют GPS. Это классический пример разговора один на один, без посторонних на линии.
Особенность UART в том, что он напрямую соединяет только два устройства и шиной в привычном понимании не является. Ведущего и ведомого здесь тоже нет: стороны равноправны, и каждая может заговорить в любой момент.

Сигнальных проводов два: один для передачи (TX), другой для приема (RX), причем TX одного чипа подключается к RX другого. Нужна еще общая земля, но она требуется всем трем интерфейсам, а на одной плате она и так есть.
Если приемник может не успевать разбирать поток, добавляют еще два провода: RTS и CTS. Выход RTS показывает, что сторона готова принимать данные, и этот провод подключается ко входу CTS собеседника; стоит снять сигнал — и отправитель ждет. Названия достались в наследство от старых модемов, где смысл сигналов был несколько иным. Для Bluetooth в самом распространенном варианте обмена, HCI H4, эта пара обязательна. Потеряв хотя бы один байт, H4 сбивается и восстанавливается только сбросом. Есть и вариант H5, который сам переспрашивает утраченное и способен обойтись без RTS и CTS.
Чтобы разговор состоялся, обе стороны должны быть заранее настроены на одинаковую скорость передачи — baud rate. Значение задает разработчик, обычно из привычного ряда вроде 9600 или 115200 бод (в UART один бод равен одному биту в секунду). Если модуль Bluetooth говорит на одной скорости, а процессор слушает на другой, на выходе получится мусор.
Данные передаются по одному байту, и каждый из них дополнительно обрамляется стартовым и стоповым битами. Их главная роль — синхронизация: по фронту стартового бита приемник подстраивает свои часы под каждый байт.

Биты данных следуют начиная с младшего, после них может идти бит четности для простой проверки, а стоповых битов бывает один или два. Все эти параметры, как и скорость, должны совпадать у обеих сторон; самую распространенную конфигурацию записывают как I2C
Поэтому множество сенсоров внутри телефона, как правило, подключено к общей шине I2C (Inter-Integrated Circuit, буквально «между интегральными схемами»). Это похоже на рабочий чат, где в каждый момент пишет кто-то один, а остальные молча читают. Таких шин в телефоне может быть несколько, но устроены они одинаково. У I2C всего два провода на всех: один для самих данных (SDA), второй — для общего тактового сигнала (SCL), по которому все участники определяют, когда настало время считывать очередной бит. Микросхема не умеет сама поднимать линию до высокого уровня: она может лишь прижать ее к нулю или отпустить. Отпущенную линию возвращает наверх подтягивающий резистор, расположенный между линией и питанием. Если два чипа займут линию одновременно, ни один из них не тянет ее вверх, поэтому короткого замыкания не случается. Главное отличие от UART — адресация. Поскольку к одной шине подключено сразу несколько микросхем, у каждой есть персональный адрес, обычно заданный еще на заводе. Адрес семибитный, так что теоретически на шине поместится чуть больше сотни устройств. На практике количество микросхем раньше упирается в емкость линии: для режимов 100 и 400 Кбит/с стандарт допускает не более 400 Иногда два датчика приходят с одинаковым заводским адресом по умолчанию. Выручить может либо специальный вывод на самой микросхеме, позволяющий сменить адрес на соседний, например с 0x68 на 0x69, либо отдельный чип-мультиплексор, который на время скрывает одного из тезок от общей шины, пока процессор общается с другим. Шина I2C хорошо подходит компонентам, которым нужно передавать небольшие объемы данных, но при этом критично беречь место на плате. Ею пользуются многие из упомянутых ранее устройств. Удобство очевидно: вместо отдельной пары проводов на каждый чип достаточно одной общей пары на десяток устройств. Правда, расплачиваться за это приходится скоростью. Резистор поднимает линию неспешно, и чем длиннее дорожки и чем больше на них микросхем, тем медленнее все происходит. Поэтому I2C обычно работает на 100 или 400 Кбит/с. Стандарт описывает и более быстрые режимы — 1 и 3,4 Мбит/с, — но встречаются они реже. В новых мобильных платформах и датчиках уже появляется I3C — более быстрый наследник I2C, использующий те же два провода. Некоторым участникам телефонной «команды» общий чат в виде I2C тесноват. Например, сканеру отпечатков: ему нужно передавать целые изображения, по десятки килобайт за раз. Иногда на SPI сажают и контроллер тачскрина, особенно в моделях, которые опрашивают касания сотни раз в секунду (хотя многие тачскрины до сих пор работают по I2C). SPI, или Serial Peripheral Interface, применяют, когда нужно как можно быстрее переправить увесистый массив данных. В случае SPI аналогия меняется: вместо общего чата — селектор, на котором у руководителя есть отдельная кнопка вызова для каждого сотрудника. У процессора есть общий провод для тактового сигнала и две общие линии для данных: одна идет от процессора к чипам, другая — обратно. Благодаря этому говорить и слушать можно одновременно. Но помимо этого к каждому участнику, например к сканеру отпечатков, тянется собственный провод выбора устройства, обычно обозначаемый CS или SS. Процессор активирует провод нужного чипа, и отвечает только он, а остальные молчат. Активным на этом проводе, как правило, считается низкий уровень, а невыбранные микросхемы отключают свой выход от общей линии, чтобы не создавать помех. Единого официального стандарта у SPI, в отличие от I2C, никогда не было, поэтому в даташитах одни и те же провода называют по-разному: где-то MOSI (master output slave input) и MISO, где-то SDO и SDI, а где-то DIN и DOUT. Подвох в том, что MOSI соединяют с MISO, а SDO одного чипа идет на SDI другого, если оба названия даны с точки зрения самой микросхемы. В новых документах встречаются и другие варианты, например PICO и POCI. Кроме того, у SPI есть четыре режима (в документации их задают параметрами CPOL и CPHA). CPOL (Clock Polarity) определяет исходное состояние линии тактирования: ноль в покое или единица. CPHA (Clock Phase) указывает, по какому фронту такта считывать бит — по первому или по второму. Будет ли этот фронт нарастающим или спадающим, зависит уже от CPOL, и вместе два параметра образуют те самые четыре режима. На фоне I2C протокол SPI без труда развивает десятки мегабит. Главная причина в том, что выходы чипов сами тянут линию и вверх, и вниз, не дожидаясь резистора. К тому же здесь нет ни адресов, ни подтверждений, поэтому на служебные биты ничего не тратится. За скорость приходится платить количеством проводов: нужны три общих и еще по одному на каждый чип, тогда как у I2C на всех всего два. Поэтому SPI используют там, где требуется быстро гонять большие объемы данных. Пора мысленно закрыть крышку телефона, которую мы открыли в самом начале, и подвести итоги. Для каждого безмолвного черного квадратика инженер подбирает либо личную прямую линию, либо место в общем чате, либо скоростную магистраль — в зависимости от того, что именно чипу нужно сообщить процессору и как быстро.
UART I2C SPI Сигнальных проводов 2 (4 с управлением потоком) 2 3 общих и по одному на чип Устройств 2 десятки, у каждого адрес сколько хватит выводов процессора Тактовый провод нет есть есть Кто начинает разговор любая сторона ведущий ведущий Ходовая скорость 9600–115200 бит/с, бывает до нескольких Мбит/с 100 или 400 кбит/с, (реже 1 и 3,4 Мбит/c) десятки Мбит/с В телефоне Bluetooth, отладочная консоль датчик приближения, контроллер батареи сканер отпечатка, защищённый чип Ни один из этих трех способов передачи данных не лучше и не хуже остальных сам по себе. У каждого своя цена — в количестве проводов и сложности разводки платы. В следующий раз, когда телефон погасит экран у уха или невозмутимо сообщит уровень заряда, вспомните: за этим спокойствием стоит десяток крошечных договоренностей.
SPI

Когда крышка закрывается

Удобная утилита, но есть риск сжечь видеокарту: вышла программа VBIOS Vix для изменения BIOS GeForce без полной перепрошивки
Nvidia безвозмездно заменила б/у RTX 5090 с оплавившимся разъёмом питания, хотя у владельца не было чека
Optimus и Cybercab станут ключевыми драйверами капитализации Tesla
SanDisk и Цукерберг объединяются для выпуска карт памяти и флешек
Xiaomi заботится о вашей спине: вышел умный массажер с гибкой направляющей и функцией подогрева
Как Nvidia превратила видеокарты в золото и принесла ИИ во все сферы жизни
«МегаФон» зафиксировал рост мощности DDoS-атак на 46% за год
Нидерланды тестируют необычный атомный реактор со сменными картриджами