Когда смартфон беседует сам с собой: знакомство с UART, I2C и SPI

Прокомментировать Просмотры: 0

Плата смартфона. Источник.

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

Чтобы эти безмолвные чужаки заработали как единый организм, их нужно было научить понимать друг друга. С этим справились протоколы связи, о них мы и поговорим. Внутри телефона их немало, но мы разберем три самых простых и распространенных: UART, I2C и SPI. Материал пригодится и новичкам, которые только знакомятся с темой, и тем, кто хочет освежить базовые знания.

Правила хорошего тона

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

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

Многим протоколам присущ общий элемент — шина.

Пример подключения устройств по шине I2C. ВНИМАНИЕ: в реальной физической схеме подтягивающие резисторы могут быть установлены производителем в самом датчике. Иллюстрировано в PAINT
Пример подключения устройств по шине I2C. Внимание: в реальной физической схеме подтягивающие резисторы могут быть установлены производителем в самом датчике. Иллюстрировано в Paint.

Шина — это набор проводников, к которым одновременно подключены все нужные микросхемы. Представьте общий коридор, в который выходят двери сразу нескольких кабинетов. На плате такие проводники выглядят как тонкие медные дорожки. Далее слова «провод» и «линия» используются как синонимы.

Когда устройство что-то передает, оно меняет напряжение на линии, переключая его между двумя уровнями — низким и высоким. Так формируется последовательность нулей и единиц.

У этой последовательности есть свой ритм, и задает его тактовый сигнал, который вырабатывает ведущее устройство (об иерархии мы поговорим чуть ниже). Правда, в I2C ведомый может ненадолго притормозить такт, если не успевает. В синхронных протоколах вроде I2C и SPI для тактирования отведен отдельный провод: так обе стороны точно знают, в какой момент считывать значение с линии данных, не опасаясь, что оно еще не успело установиться.

Приёмник читает линию данных в моменты, которые задаёт тактовый сигнал. Иллюстрировано в PAINT
Приемник читает линию данных в моменты, которые задаёт тактовый сигнал. Иллюстрировано в Paint.

В асинхронном протоколе 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 в том, что он напрямую соединяет только два устройства и шиной в привычном понимании не является. Ведущего и ведомого здесь тоже нет: стороны равноправны, и каждая может заговорить в любой момент.

Соединение процессора и модуля Bluetooth по UART. Иллюстрировано в PAINT
Соединение процессора и модуля Bluetooth по UART. Иллюстрировано в Paint.

Сигнальных проводов два: один для передачи (TX), другой для приема (RX), причем TX одного чипа подключается к RX другого. Нужна еще общая земля, но она требуется всем трем интерфейсам, а на одной плате она и так есть.

Если приемник может не успевать разбирать поток, добавляют еще два провода: RTS и CTS. Выход RTS показывает, что сторона готова принимать данные, и этот провод подключается ко входу CTS собеседника; стоит снять сигнал — и отправитель ждет. Названия достались в наследство от старых модемов, где смысл сигналов был несколько иным. Для Bluetooth в самом распространенном варианте обмена, HCI H4, эта пара обязательна. Потеряв хотя бы один байт, H4 сбивается и восстанавливается только сбросом. Есть и вариант H5, который сам переспрашивает утраченное и способен обойтись без RTS и CTS.

Чтобы разговор состоялся, обе стороны должны быть заранее настроены на одинаковую скорость передачи — baud rate. Значение задает разработчик, обычно из привычного ряда вроде 9600 или 115200 бод (в UART один бод равен одному биту в секунду). Если модуль Bluetooth говорит на одной скорости, а процессор слушает на другой, на выходе получится мусор.

Данные передаются по одному байту, и каждый из них дополнительно обрамляется стартовым и стоповым битами. Их главная роль — синхронизация: по фронту стартового бита приемник подстраивает свои часы под каждый байт.

Буква A на проводе UART со стартовым и стоповым битом. Иллюстрировано в PAINT
Буква A на проводе UART со стартовым и стоповым битом. Иллюстрировано в Paint.

Биты данных следуют начиная с младшего, после них может идти бит четности для простой проверки, а стоповых битов бывает один или два. Все эти параметры, как и скорость, должны совпадать у обеих сторон; самую распространенную конфигурацию записывают как I2C

Поэтому множество сенсоров внутри телефона, как правило, подключено к общей шине I2C (Inter-Integrated Circuit, буквально «между интегральными схемами»). Это похоже на рабочий чат, где в каждый момент пишет кто-то один, а остальные молча читают.

Таких шин в телефоне может быть несколько, но устроены они одинаково. У I2C всего два провода на всех: один для самих данных (SDA), второй — для общего тактового сигнала (SCL), по которому все участники определяют, когда настало время считывать очередной бит.

Микросхема не умеет сама поднимать линию до высокого уровня: она может лишь прижать ее к нулю или отпустить. Отпущенную линию возвращает наверх подтягивающий резистор, расположенный между линией и питанием. Если два чипа займут линию одновременно, ни один из них не тянет ее вверх, поэтому короткого замыкания не случается.

Главное отличие от UART — адресация. Поскольку к одной шине подключено сразу несколько микросхем, у каждой есть персональный адрес, обычно заданный еще на заводе. Адрес семибитный, так что теоретически на шине поместится чуть больше сотни устройств. На практике количество микросхем раньше упирается в емкость линии: для режимов 100 и 400 Кбит/с стандарт допускает не более 400 Конфликт адресов на шине I2C, у двух гироскопов совпал заводской адрес. Иллюстрировано в PAINT

Конфликт адресов на шине I2C, у двух гироскопов совпал заводской адрес. Иллюстрировано в Paint.

Иногда два датчика приходят с одинаковым заводским адресом по умолчанию. Выручить может либо специальный вывод на самой микросхеме, позволяющий сменить адрес на соседний, например с 0x68 на 0x69, либо отдельный чип-мультиплексор, который на время скрывает одного из тезок от общей шины, пока процессор общается с другим.

Шина I2C хорошо подходит компонентам, которым нужно передавать небольшие объемы данных, но при этом критично беречь место на плате. Ею пользуются многие из упомянутых ранее устройств. Удобство очевидно: вместо отдельной пары проводов на каждый чип достаточно одной общей пары на десяток устройств. Правда, расплачиваться за это приходится скоростью. Резистор поднимает линию неспешно, и чем длиннее дорожки и чем больше на них микросхем, тем медленнее все происходит.

Поэтому I2C обычно работает на 100 или 400 Кбит/с. Стандарт описывает и более быстрые режимы — 1 и 3,4 Мбит/с, — но встречаются они реже. В новых мобильных платформах и датчиках уже появляется I3C — более быстрый наследник I2C, использующий те же два провода.

SPI

Некоторым участникам телефонной «команды» общий чат в виде I2C тесноват. Например, сканеру отпечатков: ему нужно передавать целые изображения, по десятки килобайт за раз. Иногда на SPI сажают и контроллер тачскрина, особенно в моделях, которые опрашивают касания сотни раз в секунду (хотя многие тачскрины до сих пор работают по I2C). SPI, или Serial Peripheral Interface, применяют, когда нужно как можно быстрее переправить увесистый массив данных.

Пример подключения трёх чипов по SPI, у каждого своя линия выбора. Иллюстрировано в PAINT
Пример подключения трёх чипов по SPI, у каждого своя линия выбора. Иллюстрировано в Paint.

В случае 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 рядом, тёмным выделен ведущий. Иллюстрировано в PAINT
UART, I2C и SPI рядом, тёмным выделен ведущий. Иллюстрировано в Paint.

Для каждого безмолвного черного квадратика инженер подбирает либо личную прямую линию, либо место в общем чате, либо скоростную магистраль — в зависимости от того, что именно чипу нужно сообщить процессору и как быстро.

UART

I2C

SPI

Сигнальных проводов

2 (4 с управлением потоком)

2

3 общих и по одному на чип

Устройств

2

десятки, у каждого адрес

сколько хватит выводов процессора

Тактовый провод

нет

есть

есть

Кто начинает разговор

любая сторона

ведущий

ведущий

Ходовая скорость

9600–115200 бит/с, бывает до нескольких Мбит/с

100 или 400 кбит/с, (реже 1 и 3,4 Мбит/c)

десятки Мбит/с

В телефоне

Bluetooth, отладочная консоль

датчик приближения, контроллер батареи

сканер отпечатка, защищённый чип

Ни один из этих трех способов передачи данных не лучше и не хуже остальных сам по себе. У каждого своя цена — в количестве проводов и сложности разводки платы. В следующий раз, когда телефон погасит экран у уха или невозмутимо сообщит уровень заряда, вспомните: за этим спокойствием стоит десяток крошечных договоренностей.

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов