Каков общий протокол для отправки информации из одной системы в другую? Например, предположим, у нас есть некоторая информация, собранная с микроконтроллера за определенный промежуток времени, который мы хотим отправить другому микроконтроллеру. Я слышал об интерфейсах SPI и I2C, но мне неясно, когда вы используете один метод поверх другого и как вы его реализуете. Существуют ли другие методы, помимо SPI и I2C, которые являются общими? Схож ли процесс внедрения для разных микроконтроллеров? Это в основном парсинг байтов данных, которые я делаю на принимающем микроконтроллере?
18
Ответы:
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 в качестве своей физической среды.
источник
На самом деле не существует «общего» протокола, то, что вы в конечном итоге используете, сильно зависит от приложения. Чтобы мы могли дать вам лучший ответ, нам нужно немного лучше понять ваши требования. Вы упоминаете, что хотели бы, чтобы отдельные микроконтроллеры говорили друг с другом как подсистемы.
Некоторые вопросы об этом приложении:
Если вы ответили НЕТ на вопрос 1:
Если в этом проекте только 2 микроконтроллера, вы определенно можете использовать UART между ними. Если им обоим необходимо инициировать связь, используйте управление потоком, в противном случае отправка данных в одном направлении должна быть тривиальной. По большей части это должно быть «достаточно быстро», учитывая, что вы выбираете одну из более высоких скоростей в бодах. I2C и SPI обычно хороши только для архитектуры master / slave.
Если вы ответили ДА (более 2 контроллеров) на вопрос 1:
Так что теперь вам нужно что-то более масштабируемое, чтобы вы могли перебрасывать адресуемые устройства на общую шину. Ответ на эти вопросы поможет вам выбрать между I2C и SPI (master-slave) или чем-то вроде CAN (multi-master).
Ваш микроконтроллер, скорее всего, имеет периферийное устройство UART, остальные (особенно CAN) могут быть доступны только на более высокопроизводительных чипах. В любом случае должно быть много документации о том, как использовать эти периферийные устройства для перемещения байтов.
источник
Как отметил @Jon, одна проблема при выборе интерфейса связи заключается в том, всегда ли один объект будет отвечать за инициирование обмена данными, или же ответственность за него может нести более одного объекта. С этим связан вопрос, будет ли одна организация всегда готова получать нежелательные сообщения. SPI часто используется в приложениях, где одна сторона всегда будет готова принять сообщение. Например, что-то вроде сдвигового регистра 74HC595 никогда не бывает «занято». Хотя SPI хорош для связи между микроконтроллером и оборудованием, которым должен управлять микроконтроллер, на самом деле он не подходит для связи между двумя микроконтроллерами. Когда два процессора с аппаратным обеспечением I2C используют его для связи, программному обеспечению может потребоваться столько времени, сколько ему нужно (в рамках очень щедрых ограничений), чтобы справиться с тем, что происходит, без потери данных. Если бы процессору потребовалось 100 микросекунд для обработки каждого входящего байта, это серьезно ограничило бы пропускную способность, но отправитель замедлился бы настолько, чтобы получатель не отставал. Единственный способ, который обычно может случиться с SPI, - это иметь отдельный провод для рукопожатия.
I2C действительно замечательный протокол. Самые большие ограничения, которые мешают ему быть самым совершенным протоколом, который только можно представить,
Лично я хотел бы, чтобы продавцы контроллеров поддерживали трехпроводной вариант SPI, который включал рукопожатие. Я не знаю ни одного контроллера, который делает это, хотя.
источник
В произвольном порядке наиболее популярными экземплярами физического уровня для двух процессоров в одном блоке являются:
Эти экземпляры физического уровня (а также другие экземпляры физического уровня для 2 процессоров в отдельных блоках) обычно предоставляют поток байтов программному обеспечению, которое реализует более высокие уровни системы связи.
Умные программисты пишут программное обеспечение таким образом, что, когда аппаратный специалист решает вырвать один экземпляр физического уровня и заменить его совершенно другим экземпляром физического уровня, им нужно только переписать несколько функций, чтобы подать свой выходной поток байтов на аппаратное обеспечение и считывание потока байтов с аппаратного обеспечения, и все компоненты протокола более высокого уровня продолжают работать без изменений.
Протокол для отправки информации из одного ЦП в другой ЦП почти всегда включает интерпретацию потока байтов как серии пакетов:
Некоторым людям нравится создавать совершенно новые, нестандартные, несовместимые протоколы, смешивая и сопоставляя (2) один из множества видов структуры заголовка с (3a) одним из множества видов сериализации данных с (3b) одним из многих видов экранирование этих сериализованных данных с помощью (4) одного из многих видов трейлеров.
Некоторые из самых простых протоколов для инкапсуляции данных в пакет включают в себя:
Несколько более сложные протоколы для инкапсуляции данных в пакет включают в себя:
Существует длинный список протоколов на
Вам может понравиться чтение «Фольклора дизайна протокола» Радии Перлман, в котором рассказывается, как дизайн протокола может пойти не так.
источник
Нет единого «общего» протокола. Выбор может (например) зависеть от:
Во многих случаях вы должны отличать физический уровень (уровни сигналов) от канального уровня (+/- способ кодирования данных) (проверьте модель OSI, нижние 2 ..4 уровня). Возможные физические слои, например:
Вы можете использовать одну строку для переноса данных и информации о часах или разбить ее на несколько строк. Последние были популярны, но в настоящее время большинство новых / быстрых протоколов имеют тенденцию использовать одну линию (или пару строк, действующих как одна).
Есть много способов кодировать данные и часы на линии. RS232 традиционно использует NRZ, есть кодировка Machester, а также различные форматы, используемые на жестких дисках со строкой любопытных имен 2.7 RLL.
Подводя итог: существует множество способов установить связь между системами. И я даже не упомянул соединители или аспекты более высокого уровня, такие как обнаружение и восстановление ошибок, кодирование данных, сжатие и шифрование ...
источник