Последовательная связь
Последовательная передача данных заключается в передаче одного бита за раз, а не многих битов (как при параллельной передаче данных). Параллельная схема требует как минимум N линий при передаче N битов, в то время как последовательная схема может обойтись только 1 линией. Во многих случаях для арбитража операций передачи используются дополнительные линии (например, тактовая линия). На следующей схеме показаны последовательная и параллельная версии 8-битной схемы передачи данных, в которой используется тактовая линия.
Рис. 6.1. Сравнение последовательной (слева) и параллельной (справа) передачи данных 8 бит (взято из SparkFun Electronics, предоставлено по CC BY 4.0)
GPIO хорош для чтения нескольких входных переключателей или кнопок и управления несколькими выходами, такими как светодиоды или двигатели, но он не справляется, когда нам нужно передавать сообщения туда и обратно между микроконтроллером и другими устройствами. Это может звучать не очень интуитивно, если мы рассмотрим преимущество параллельной связи, передавая все N битов одновременно с помощью N линий GPIO. Однако наличие N линий сделает обмен данными только в N раз быстрее, чем последовательный вариант. Недостатки параллельной связи обычно перевешивают это преимущество. Вот несколько недостатков для обмена 32-битными словами:
- Для связи двух микросхем на одной плате требуется 32 линии на печатной плате, что заняло бы значительную площадь.
- Для связи двух микросхем на отдельных платах требуется кабель или лента с 32 проводами. Более толстые кабели тяжелее и с ними сложнее обращаться.
- 32 электрические линии в кабеле или печатной плате могут иметь 32 проблемы с электромагнитными помехами.
- Невозможно использовать инфракрасную связь (как у телевизионного пульта) из 32 параллельных линий, так как 32 мигающих огонька будут мешать друг другу.
- Использование 32 волоконно-оптических кабелей было бы очень дорого.
- Использование 32 радиоканалов также было бы неудобным.
Серьезность этих проблем снижается или устраняется при последовательном обмене данными. Фактически, несколько интерфейсов последовательной связи превосходят свои параллельные аналоги. Один из известных примеров - интерфейсы дисковых накопителей, где Serial ATA намного быстрее Parallel ATA. Самый быстрый интерфейс Parallel ATA способен передавать данные со скоростью 133 МБ в секунду, тогда как самый быстрый Serial ATA - 600 МБ в секунду.
Рис. 6.2. 7-контактный кабель Serial ATA и 40-контактный ленточный кабель Parallel ATA (левое изображение взято из Wikimedia Commons, предоставлено по лицензии CC BY-SA 3.0, правое изображение взято из Wikimedia Commons, By Evan Amos, Public Domain)
Параллельная связь - это не плохо
Цель предыдущего обсуждения - показать обстоятельства, при которых последовательная связь предпочтительнее параллельной.
Однако параллельная связь находит применение во многих областях вычислительной техники. Одно из самых сильных применений - в архитектуре компьютера, где у нас есть схема шины для соединения центрального процессора, памяти и устройств ввода-вывода. Это модель памяти, используемая в языке C. Фактически, когда мы используем адрес памяти для доступа к данным, этот адрес в конечном итоге преобразуется в физический адрес, который передается по параллельной шине адреса.
Адресованные данные будут доступны в параллельной шине данных. Хотя существуют последовательные шины, такие как I2C и USB, внутренняя шина микроконтроллера всегда была параллельной, и не похоже, что эта практика изменится в ближайшем будущем.
Сдвиговые регистры
Последовательная передача данных осуществляется путем взятия слова определенной ширины (например, 8, 32 или 64 бита) и последовательной передачи всех битов по одному каналу. Именно эту операцию и выполняет сдвиговый регистр. Вы можете быть знакомы со сдвигом битов с точки зрения программиста. Он заключается в сдвиге всех битов вправо или влево, обычно на одну позицию за раз. Для последовательной связи нас интересует бит, который "выпадает" из регистра после сдвига.
Регистр сдвига - это последовательность D флип-флопов, которые выполняют операцию сдвига между битами, хранящимися в каждом флип-флопе. Здесь мы имеем 4-битный регистр сдвига:
Рис. 6.3. 4-битный регистр сдвига (взято из Wikimedia Commons, автор MichaelFrey, предоставлено по лицензии CC BY-SA 2.0)
На приведенной выше схеме каждый раз, когда на линии Clock возникает нарастающий фронт импульса, все биты сдвигаются вправо. Регистр может иметь механизм для параллельного чтения и записи своих данных (все 4 бита одновременно).
Линия Data служит в качестве последовательного входа, а линия - в качестве последовательного выхода.
Все последовательные коммуникационные интерфейсы используют сдвиговый регистр в той или иной части своего оборудования, поскольку им необходимо отправлять некоторые данные по одному биту за раз. На следующей схеме показано, что общего у всех схем последовательной передачи данных.
Здесь у нас есть передатчик, который посылает слово из N бит (например, 8 или 32 бита) приемнику, используя их соответствующие сдвиговые регистры. Через N тактов слово, которое первоначально было в передатчике, окажется в приемнике. На схеме показаны передатчик и приемник, но обратите внимание, что сдвиговый регистр в так называемом приемнике может отправить свой крайний правый бит обратно в так называемый передатчик, что делает эту операцию не передачей, а подменой.
В некоторых схемах элементы этой сети называются не передатчиком и приемником, а ведущим и ведомым, где ведущий управляет обменом данными, а ведомые принимают данные, отправленные ведущим, или отвечают данными, запрошенными ведущим.
Одно из основных различий между множеством последовательных коммуникационных интерфейсов заключается в том, откуда поступает тактовый сигнал для каждого сдвигового регистра:
- В SPI он поступает от ведущего устройства, а ведомые устройства получают этот сигнал от ведущего устройства по отдельной линии.
- При асинхронной последовательной связи передатчик и приемник имеют собственные тактовые сигналы, работающие на одинаковой частоте, чтобы обеспечить соответствие скорости передачи данных.
- В I2C тактовый сигнал также посылается ведущим устройством, но ведомые устройства также могут переводить тактовую линию в низкий уровень, чтобы сообщить, что они еще не готовы к ответу.