Каков общий протокол для отправки информации из одной системы в другую? Например, предположим, что у нас есть некоторая информация, собранная с микроконтроллера за определенный период времени, которую мы хотим отправить на другой микроконтроллер. Я слышал об интерфейсах SPI и I2C, но мне неясно, когда вы используете один метод вместо другого и как вы его реализуете. Существуют ли другие распространенные методы, помимо SPI и I2C? Одинаков ли процесс реализации для разных микроконтроллеров? Это в основном анализ байтов данных, которые я делаю на принимающем микроконтроллере?
SPI и I2C отчасти похожи в том, что они действительно используются больше для подключения периферийных устройств к контроллеру или процессору, чем для фактической передачи данных между системами. USB — это еще один интерфейс, который люди, кажется, хотят рассматривать как систему связи, которая на самом деле является шиной подключения периферийных устройств.
Связь между системами не похожа на подключение устройства к шине. Подсоединение к шине позволяет процессору напрямую обращаться к регистрам устройства, тогда как коммуникационный интерфейс позволяет отправлять/получать потоки данных. Для устройства, подключенного к шине, обычно требуется драйвер устройства, тогда как при обмене данными не имеет значения , что подключено на другом конце, если речь идет о хост-компьютере.
Конечно, эта граница все время становится все более размытой. Такие вещи, как PCI и ISA, несомненно, являются шинами; I2C, SPI, USB, возможно, являются шинами; тогда как RS232, RS485 и Ethernet определенно являются коммуникационными интерфейсами. Но есть такие вещи, как шина CAN и 1553, которые определенно связаны с перемещением данных, но очень сложным способом.
Не существует единого способа отправки данных, существует множество различных способов связи в зависимости от расстояния, скорости передачи данных, окружающей среды, приложения...
Самый нижний уровень — это физический уровень , который фактически перемещает биты.
SPI и I²C предназначены для коротких расстояний внутри устройства, где не так много шума, который может нарушить передачу.
Для не слишком быстрой связи на расстояния до нескольких десятков метров хорошим выбором будет последовательная связь через RS-232.
Если есть больше шума или больше расстояния, используются дифференциальные сигналы, например, в RS-485. Для более быстрой передачи данных есть Ethernet, который становится все более популярным.
Кроме того, существуют различные стандарты беспроводной связи.
Поверх физического уровня есть еще уровни, организующие отправку данных, обнаружение и исправление ошибок при передаче, маршрутизацию в сети и многое другое. Например, интернет-протокол представляет собой довольно сложный стек из нескольких уровней, обычно поверх протокола Ethernet.
Можно использовать простой последовательный UART (одна линия Tx и одна линия Rx без дискретных часов) и его можно легко адаптировать для пересечения различных потенциалов (даже первичной и вторичной цепей) с помощью оптронов или магнитных изоляторов .
Что касается протоколов, все с определенными командными байтами и какой-то схемой контрольной суммы будет работать хорошо. На самом деле не существует универсального стандартного протокола, подходящего для всех типов связи. I2C имеет стандарты сигнализации (определяющие адресацию, остановки, запуски и т. д.), но протокол того, что на самом деле передается, зависит исключительно от разработчика.
Например, PMBus — это протокол связи с источником питания, который использует I2C в качестве физического носителя.
Как отметил @Jon, одна из проблем при выборе коммуникационного интерфейса заключается в том, всегда ли один объект будет нести ответственность за инициирование связи или за это могут нести ответственность несколько объектов. Связанный с этим вопрос заключается в том, всегда ли один объект будет готов к получению незапрашиваемых сообщений. SPI часто используется в приложениях, где одна сторона всегда будет готова к приему данных. Что-то вроде сдвигового регистра 74HC595, например, никогда не бывает «занято». Хотя SPI хорош для связи между микроконтроллером и оборудованием, которым должен управлять микроконтроллер, на самом деле он не подходит для связи между двумя микроконтроллерами. Когда два процессора с аппаратным обеспечением I2C используют его для связи, программному обеспечению может потребоваться столько времени (в очень широких пределах), чтобы справиться с тем, что происходит, без потери данных. Если бы процессору требовалось 100 микросекунд для обработки каждого входящего байта, это серьезно ограничило бы пропускную способность, но отправитель замедлился бы достаточно, чтобы получатель не отставал. Единственный способ, который обычно может произойти с SPI, - это наличие отдельного провода для квитирования.
I2C действительно замечательный протокол. Самые большие ограничения, которые мешают ему быть самым совершенным протоколом, который только можно себе представить, это
Лично я хотел бы, чтобы поставщики контроллеров поддерживали трехпроводной вариант SPI, который включает квитирование. Однако я не знаю ни одного контроллера, который делает это.
На самом деле не существует «общего» протокола, то, что вы в конечном итоге используете, сильно зависит от приложения. Чтобы мы могли дать вам лучший ответ, нам нужно немного лучше понять ваши требования. Вы упомянули, что хотели бы, чтобы отдельные микроконтроллеры взаимодействовали друг с другом как подсистемы.
Некоторые вопросы по этому приложению:
Если вы ответили НЕТ на вопрос 1:
Если в этом проекте всего 2 микроконтроллера, то однозначно можно использовать UART между ними. Если им обоим необходимо инициировать связь, используйте управление потоком, в противном случае отправка данных в одном направлении должна быть тривиальной. По большей части это должно быть «достаточно быстро», учитывая, что вы выбираете одну из более высоких скоростей передачи данных. I2C и SPI обычно хороши только для архитектуры master/slave.
Если вы ответили ДА (более 2 контроллеров) на вопрос 1:
Так что теперь вам нужно что-то более масштабируемое, где вы можете сбрасывать адресуемые устройства на общую шину. Ответы на эти дополнительные вопросы помогут вам выбрать между I2C и SPI (ведущий-ведомый) или чем-то вроде CAN (многоглавный).
Ваш микроконтроллер, скорее всего, имеет периферийное устройство UART, другие (особенно CAN) могут быть доступны только на чипах более высокого класса. В любом случае должно быть много документации о том, как использовать эти периферийные устройства для перемещения байтов.
В произвольном порядке самые популярные экземпляры физического уровня для 2 ЦП в одном блоке выглядят следующим образом:
Эти экземпляры физического уровня (а также другие экземпляры физического уровня для 2 ЦП в отдельных блоках) обычно предоставляют поток байтов программному обеспечению, реализующему более высокие уровни системы связи.
Умные программисты пишут программное обеспечение таким образом, что, когда специалист по аппаратному обеспечению решает вырвать один экземпляр физического уровня и заменить его совершенно другим экземпляром физического уровня, им нужно всего лишь переписать несколько функций, чтобы передать свой выходной поток байтов. на аппаратное обеспечение и считывает поток байтов с аппаратного обеспечения, а весь протокол более высокого уровня продолжает работать без изменений.
Протокол для отправки информации от одного процессора к другому почти всегда включает интерпретацию потока байтов как серии пакетов:
Некоторым людям нравится создавать совершенно новые, настраиваемые, несовместимые протоколы путем смешивания и сопоставления (2) одного из многих видов структуры заголовка с (3a) одним из многих видов сериализации данных с (3b) одним из многих видов экранирование этих сериализованных данных с помощью (4) одного из многих видов трейлера.
Некоторые из самых простых протоколов для инкапсуляции данных в пакет включают в себя:
Чуть более сложные протоколы для инкапсуляции данных в пакет включают:
Существует длинный список протоколов на
Вам может понравиться чтение «Фольклор по дизайну протоколов» Радии Перлман, в котором описывается, как дизайн протокола может пойти не так.
Нет единого «общего» протокола. Выбор может (например) зависеть от:
Во многих случаях вы должны отличать физический уровень (уровни сигналов) от уровня канала передачи данных (+/- способ кодирования данных) (проверьте модель OSI, нижние 2 ..4 уровня). Возможные физические слои, например:
Вы можете использовать одну строку для передачи данных и информации о часах или разделить ее на несколько строк. Последний раньше был популярен, но в настоящее время большинство новых / быстрых протоколов, как правило, используют одну линию (или пару линий, действующих как одна).
Существует множество способов кодирования данных и синхронизации на линии. RS232 традиционно использует NRZ, есть кодировка Machester, а также различные форматы, используемые на жестких дисках с любопытными именами, строка 2.7 RLL.
Подводя итог: существует огромное количество способов связи между системами. И я даже не упомянул соединители или аспекты более высокого уровня, такие как обнаружение и восстановление ошибок, кодирование данных, сжатие и шифрование...
звездно-голубой
О_О
Кортук
ДжастДжефф
Даррон
Кейси