Когда вы подключаете микроконтроллер к датчику, дисплею или другому модулю, задумываетесь ли вы когда-нибудь о том, как эти два устройства общаются друг с другом? Что именно они говорят? Как они смогут понять друг друга?
Общение между электронными устройствами похоже на общение между людьми. Обе стороны должны говорить на одном языке. В электронике эти языки называются протоколами связи.
К счастью для нас, существует всего несколько протоколов связи, которые нам нужно знать при создании большинства проектов электроники своими руками. Для начала мы рассмотрим основы трёх наиболее распространенных протоколов: последовательный периферийный интерфейс SPI, последовательная синхронная шина I2C и универсальная асинхронная связь, управляемая приемником/передатчиком UART.
SPI, I2C и UART немного медленнее, чем такие протоколы, как USB, Ethernet, Bluetooth и WiFi, но они намного проще и используют меньше аппаратных и системных ресурсов. SPI, I2C и UART идеально подходят для связи между микроконтроллерами, а также между микроконтроллерами и датчиками, когда не требуется передавать большие объемы высокоскоростных данных.
Последовательная и параллельная связь
Электронные устройства общаются друг с другом, отправляя биты данных по проводам, физически соединенным между устройствами. Бит похож на букву в слове, за исключением того, что вместо 33 букв (в русском алфавите) бит является двоичным и может иметь значение только 1 или 0. Биты передаются от одного устройства к другому путем быстрого изменения напряжения.
В системе, работающей при напряжении +5В, бит 0 передается как короткий импульс 0В, а бит 1 передается коротким импульсом +5В.
Биты данных могут передаваться как в параллельном, так и в последовательном виде. При параллельной передаче биты данных передаются одновременно, каждый по отдельному проводу. На следующей схеме показана параллельная передача буквы «R» в двоичном формате 01010010
:
При последовательной связи биты передаются один за другим по одному проводу. На следующей диаграмме показана последовательная передача буквы «R» в двоичном формате 01010010
:
Введение в SPI
SPI — это распространенный протокол связи, используемый многими устройствами. Например, модули чтения SD-карт, модули чтения RFID-меток, беспроводные передатчики/приемники используют SPI для связи с микроконтроллерами.
Одним из уникальных преимуществ SPI является тот факт, что данные могут передаваться без перерыва. Любое количество битов может быть отправлено или получено в непрерывном потоке. При использовании I2C и UART данные передаются пакетами, ограниченными определенным количеством бит. Условия запуска и остановки определяют начало и конец каждого пакета, поэтому передача данных прерывается во время передачи.
Устройства, обменивающиеся данными через SPI, находятся в отношениях «Master-Slave» (Ведущий-Ведомый).
Ведущее устройство — это управляющее устройство (обычно микроконтроллер), а ведомое устройство (обычно датчик, дисплей или микросхема памяти) получает инструкции от ведущего устройства. Простейшая конфигурация SPI — это система с одним ведущим устройством и одним ведомым устройством, но один ведущий может управлять более чем одним ведомым устройством (подробнее об этом ниже).
MOSI (Master Output / Slave Input) – выход ведущего, вход ведомого. Линия, по которой ведущий передает данные ведомому.
MISO (Master Input / Slave Output) – вход ведущего, выход ведомого. Линия, по которой ведомый передает данные ведущему.
SCLK (Clock) – линия для тактового сигнала.
SS/CS (Slave Select / Chip Select) – линия, позволяющая ведущему выбирать, на какое ведомое устройство отправлять данные.
Последовательный или параллельный | Последовательный |
Максимальное количество ведущих устройств | 1 |
Максимальное количество ведомых устройств | В теории, неограниченное количество* |
Количество проводов | 4 |
Синхронный или асинхронный | Синхронный |
Максимальная скорость передачи | До 10 Мбит/с |
*На практике количество ведомых устройств ограничено емкостью нагрузки системы, что снижает способность ведущего переключать уровни напряжения.
Как работает SPI
Синхронизация (Clock)
Тактовый сигнал синхронизирует вывод битов данных от ведущего устройства с выборкой битов ведомым устройством. За каждый такт передается один бит данных, поэтому скорость передачи данных определяется частотой тактового сигнала. Связь SPI всегда инициируется ведущим устройством, поскольку ведущее устройство настраивает и генерирует тактовый сигнал.
Любой протокол связи, в котором устройства совместно используют тактовый сигнал, называется синхронным.
SPI — это протокол синхронной связи. Существуют также асинхронные методы, не использующие тактовый сигнал. Например, при передаче данных по UART обе стороны настроены на предварительно настроенную скорость передачи данных в бодах, которая определяет скорость и время передачи данных.
Тактовый сигнал в SPI можно изменить, используя свойства полярности и фазы тактового сигнала. Эти два свойства работают вместе, чтобы определить, когда биты выводятся, а когда они выбираются. Полярность тактового сигнала может быть установлена ведущим устройством, чтобы обеспечить вывод и выборку битов либо по нарастающему, либо по спадающему фронту тактового сигнала. Фазу тактового сигнала можно настроить так, чтобы вывод и выборка происходили либо на первом, либо на втором фронте такта, независимо от того, нарастает он или спадает.
Выбор ведомого устройства (Select Slave)
Ведущий может выбрать, с каким ведомым устройством он хочет общаться, установив на линии CS/SS ведомого устройства низкий уровень напряжения. В режиме ожидания, в состоянии отсутствия передачи, линия выбора ведомого устройства поддерживается на высоком уровне напряжения.
На ведущем устройстве может быть доступно несколько контактов CS/SS, что позволяет подключать несколько ведомых устройств параллельно. Если присутствует только один вывод CS/SS, несколько ведомых устройств могут быть подключены к ведущему с помощью последовательной цепочки.
Несколько ведомых устройств
SPI можно настроить для работы с одним ведущим и одним ведомым устройством. Также можно настроить для работы с несколькими ведомыми устройствами, управляемыми одним главным (ведущим) устройством.
Есть два способа подключить несколько ведомых устройств к главному. Если у ведущего устройства есть несколько контактов выбора ведомого устройства, ведомые устройства можно подключить параллельно следующим образом:
Если доступен только один контакт SS/CS выбора ведомого устройства, ведомые устройства можно подключить последовательно следующим образом:
MOSI и MISO
Ведущий передает данные ведомому побитно, последовательно через линию MOSI. Ведомое устройство получает данные, отправленные от ведущего устройства, на вывод MOSI. Данные, передаваемые от ведущего устройства к ведомому, обычно передаются начиная со старшего бита.
Ведомое устройство также может отправлять данные обратно ведущему устройству через линию MISO в последовательном режиме. Данные, отправляемые от ведомого устройства обратно к ведущему, обычно передаются начиная с младшего бита.
Этапы передачи данных по SPI
- Ведущий (Master) выводит тактовый сигнал:
- Ведущий (Master) переключает вывод SS/CS в состояние низкого уровня напряжения, что активирует ведомое (Slave) устройство:
- Ведущий (Master) отправляет данные по одному биту за раз ведомому устройству по линии MOSI. Ведомое (Slave) устройство считывает биты по мере их поступления:
- Если требуется ответ, ведомое (Slave) устройство возвращает данные по одному биту за раз ведущему (Master) устройству по линии MISO. Ведущий считывает биты по мере их поступления:
Преимущества и недостатки SPI
У использования SPI есть некоторые преимущества и недостатки. Если у вас есть выбор между различными протоколами связи, вы должны знать, когда использовать SPI в соответствии с требованиями вашего проекта.
Преимущества
- Нет стартовых и стоповых битов, поэтому данные могут передаваться непрерывно.
- Нет сложной системы адресации ведомых устройств, такой как у I2C.
- Более высокая скорость передачи данных, чем у I2C (почти в два раза быстрее).
- Отдельные линии MISO и MOSI, поэтому данные можно отправлять и получать одновременно.
Недостатки
- Использует четыре провода (I2C и UART используют два).
- Нет подтверждения того, что данные были успешно получены (у I2C это есть).
- Нет формы проверки ошибок, такой как бит четности в UART.
- Допускается только один мастер.