Недорогая простая связь между двумя микроконтроллерами

Какие компромиссы и варианты подключения существуют при недорогой двунаправленной связи между двумя микроконтроллерами?

В этом случае:

  • Отношения Master/Slave, двунаправленный поток данных
  • Расстояние меньше дюйма
  • Ведомый подключается к ведущему (поэтому защита от электростатического разряда на соединениях обязательна).
  • Ведомый микропроцессор довольно тупой, но для блочного ввода-вывода с SD-карты требуются данные средней скорости. Помимо SD-карты, на ведомом устройстве есть немного низкоскоростных операций ввода-вывода, где скорость не является проблемой.
  • Дешево дешево дешево.
  • Количество контактов ограничено.
  • Предпочитайте минимальные накладные расходы стека протоколов.

Очевидные варианты включают SPI, CAN, USB, последовательный уровень TTL. I2C и 1-Wire, вероятно, слишком медленные. Из-за проблемы с количеством выводов модуляция источника питания для данных была бы идеальной, если бы существовал набор микросхем потребительского уровня, который делал бы это, экономя два контакта по сравнению с последовательными методами.

Что вы подразумеваете под "данными средней скорости"? Вы имеете в виду порядок? 100кб/с? 1 Мбит/с? Есть ли у вас ограничения на то, какой MCU вы хотите/должны использовать? Когда вы говорите «ведущий/ведомый», вы хотите поддерживать двунаправленную передачу? Или просто хотите «отдать» данные немому рабу без какой-либо схемы исправления ошибок или обратной связи?
«дешевизна» и «простота» и «модулирующий источник питания» несовместимы. Я работал над дифференциальными последовательными данными, закодированными в манчестерском коде, через 12 В и подключение к источнику питания GND, и это не очень весело как в программном, так и в аппаратном плане, так что даже не беспокойтесь об этом!
@LorenzoDonati Под «данными средней скорости» я имею в виду сохранение закодированного видео на SD-карту, то есть, возможно, 5 МБ / с.
@KyranF, модулирующий источник питания, будет работать только в том случае, если существует какая-то микросхема «Сделано в Китае», которая справляется со всем.
Справедливо. Вероятно, есть один, который частично это делает, но все же будет полагаться на множество пользовательских внешних схем.

Ответы (6)

Учитывая ваши доступные варианты, похоже, что у вас есть несколько доступных контактов:

  • SPI является полнодуплексным и требует 1 тактового сигнала + 1 данных в каждом направлении + 1 необязательный выбор микросхемы = 3 контакта.
  • CAN является полудуплексным и требует 2 данных для двунаправленной связи = 2 контакта.
  • USB является полудуплексным и требует 2 данных для двунаправленной связи = 2 контакта
  • Последовательный TTL - это все, что вы хотите, но большинство людей используют для этого UART, требуется 1 данные в каждом направлении = 2 контакта для полного дуплекса или 1 контакт с некоторыми хитростями.
  • UART является полнодуплексным и требует 1 данных в каждом направлении = 2 контакта или 1 контакт с некоторыми хитростями.
  • I2C является полудуплексным и требует 1 тактового сигнала + 1 данных = 2 контакта.

Таким образом, похоже, что консенсус составляет 2 контакта, если вы хотите двунаправленную связь, или, возможно, 3 для SPI. Учитывая одинаковое количество контактов, я бы выбрал UART, если он есть на обоих чипах. Предполагая соединение 1:1, вы можете просто перебрасывать данные, не обращая внимания на время или коллизии, и аппаратное обеспечение действительно простое.

Что касается служебных данных стека, существует множество различных протоколов, которые могут работать с UART, но, вероятно, в этом случае лучше всего определить свой собственный. С точки зрения связи, вы просто извергаете байты и получаете их на другом конце. Аппаратное обеспечение автоматически синхронизируется с каждым байтом, но вам все равно нужно знать, что это за байт. У вас будет эта проблема независимо от того, какой вариант вы выберете.

Если вы хорошо разбираетесь в UART (и я собираюсь дать вам ответ), вы можете соединить два вывода TX вместе с двумя резисторами последовательно, а затем иметь компаратор на каждом конце, который управляет выводом RX на основе местный ТХ и центральный отвод двух резисторов. Это позволяет использовать полный дуплекс на одном проводе. См. схему ниже.

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


схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

  • «Низкие» резисторы предназначены для защиты диодов ESD. В таблицах данных может или не может быть заявлено, что они не нужны, но я бы все равно их использовал. Сделайте их достаточно большими, чтобы они выполняли свою работу; они должны выглядеть как короткие по сравнению с «высокими» резисторами.
  • «Высокие» резисторы должны смешивать два сигнала TX на общем проводе.
  • Резисторы номиналом 10 кОм и 5 кОм должны принимать сигнал TX с полным диапазоном питания и обеспечивать соответствующий порог для компараторов.
  • Если два устройства питаются независимо друг от друга, у вас, вероятно, не должно быть «Дополнительного подключения», оставляя вам 2 провода вместо 3. Я не понимаю, как вы можете вообще общаться с меньшим количеством контактов, чем это, если вы не используете беспроводную связь. .

Вот как это работает:

  • Если оба TX имеют высокий уровень, общая линия будет высокой, и оба компаратора будут выдавать высокий уровень.
  • Если оба TX имеют низкий уровень, общая линия будет иметь низкий уровень, и оба компаратора будут выдавать низкий уровень.
  • Если один TX высокий, а другой низкий, общая линия будет средней, и каждый компаратор будет иметь различный порог, основанный на его локальном TX. Таким образом, тот, у которого высокий TX, будет иметь более высокий порог, чем общий средний диапазон, и будет выдавать низкий уровень, а тот, у кого низкий TX, будет иметь более низкий порог, чем общий средний диапазон, и будет выдавать высокий уровень.

Таким образом, во всех случаях выходной сигнал принимающего компаратора равен передаваемому TX.

Если вам не нравится аппаратная сложность внутри коробки, то вы можете использовать отдельный вывод для каждого направления и оставить только «высокий» и «низкий» резисторы и диоды ESD — отдельный экземпляр для каждого контакта.

Я никогда не использовал CAN-шину, поэтому ничего не могу сказать по этому поводу. Что оставляет SPI, I2C, последовательный TTL и USB.

Последовательный TTL обычно работает со скоростью 115 200 бод, но многие микроконтроллеры могут работать со скоростью 1 Мбит/с или выше. Вам нужно будет проверить таблицы данных вашего микроконтроллера и посмотреть, сможете ли вы запустить его так быстро. Очевидно, что оба конца должны совпадать. Преимущество последовательного TTL заключается в том, что для него требуется всего два провода.

Первоначально I2C был ограничен 100 Кбит/с, затем 400 Кбит/с. Последний стандарт — 1 Мбит/с. Но возможно, что ваш микроконтроллер может иметь более высокую тактовую частоту. Опять же, проверьте свои таблицы данных. Как и последовательный TTL, для I2C требуется только два провода.

SPI - это совсем другая порода. Теоретически он может работать до 50 Мбит/с или около того. Я запускал один с SD-картой в коммерческом продукте со скоростью 25 Мбит / с без каких-либо проблем. Недостатком является то, что для интерфейса SPI требуется четыре провода. На самом деле, если на шине всего одно подчиненное устройство, вам не нужна линия выбора микросхемы, если только она не требуется аппаратным интерфейсом. Если вы отправляете данные только на подчиненное устройство, вы также можете избавиться от линии MISO, если микроконтроллер позволяет переназначить ее как контакт GPIO. В случае, если у вас осталось два провода, как и у других.

Накладные расходы на прошивку для первых трех минимальны; Последовательный TTL, вероятно, самый простой. I2C и SPI примерно одинаковы.

Вы можете забыть о USB, хотя он потенциально самый быстрый, если вы используете USB 2.0. (USB 1.1 имеет скорость всего 12 Мбит/с, поэтому он даже не может сравниться с SPI по скорости.) Первая проблема с USB заключается в том, что вам необходимо реализовать хост с одной стороны и подчиненный с другой. Для этого требуются микроконтроллеры с интерфейсами, а хост-интерфейсы USB обычно встречаются только на чипах довольно высокого класса. Затем требуется прошивка. Несколько кБ прошивки. Хорошей новостью является то, что вы обычно можете получить библиотеку от производителя. Плохая новость заключается в том, что вам все равно потребуются недели, чтобы заставить его работать.

Вам нужно будет обеспечить свою единственную защиту от электростатического разряда на интерфейсах. Есть много дешевых чипов, которые выполняют эту функцию, например, TPD4E1B06 для 61-го шага в Digi-Key.

введите описание изображения здесь

О CAN: это шинная система наподобие I²C. В то время как I²C предназначен для связи на одной печатной плате, CAN позволяет передавать данные на расстояние до 2 км. Следовательно, у него много накладных расходов протокола, поскольку сообщение CAN содержит до 64 бит данных, а также около 50 бит для идентификатора сообщения, адреса, CRC и так далее. I²C также «тратит» некоторые биты на адресацию, но не так много. Это также может добавить некоторые накладные расходы на программирование. Так что однозначно CAN здесь нет!
61 цент не дешев для требуемого уровня. С самовывозом отдельные зендеры начинают выглядеть дешево.

Вы рассматривали UART? Для однонаправленной связи нужен только один провод. Если вы будете отправлять большие порции данных, вы можете проявить смекалку и сделать так, чтобы один провод чередовался между TX и RX в соответствии с некоторыми выдуманными правилами. Вы можете создать свой собственный протокол для исправления ошибок, конфликтов на шине и так далее. Приятно то, что даже самые дешевые микроконтроллеры будут иметь встроенный UART (чего нельзя сказать о USB или CAN).

Если вы посмотрите, вы, вероятно, сможете найти схемы модуляции источника питания, но их скорость передачи данных, вероятно, будет намного медленнее.

Основываясь на вашем утверждении: «Из-за проблемы с количеством выводов модулировать источник питания для данных было бы идеально, если бы это был набор микросхем потребительского уровня, который экономил бы два контакта по сравнению с последовательными методами», это звучит как 1-проводная связь, однако это предоставляет данные о низкой скорости, и вы не указываете, каковы могут быть ваши требования к скорости.

Добавлено указанное выше требование к скорости, которое контролируется требованием к SD-карте.

Я не вижу особого смысла в системе master/slave всего с двумя микроконтроллерами, которые оба запрограммированы вами.

Самая маленькая распиновка, которую вы можете получить, это, вероятно, UART (2 контакта). Поскольку вы программируете оба микроконтроллера, вы можете выбрать произвольную скорость. AVR µC может запускать UART со скоростью 1 Мбит/с, и если вы выберете 1 стоповый бит, отсутствие четности и 9 битов данных, вы можете получить 82% использования пропускной способности.

Вы всегда можете использовать собственный протокол, похожий на 1-Wire (но намного быстрее). Однако это довольно глупый подход, поскольку он будет потреблять всю вашу вычислительную мощность для поддержки протокола.

TLDR: не особенно дешево, но надежно подходит в некоторых случаях использования.

Глядя нестандартно, здесь могут быть какие-то другие решения, такие как следующий чип, с которым я недавно столкнулся. Конечно, все зависит от того, что вы хотите сделать. Что-то вроде UART приходит на ум, если вы установили оба микроконтроллера на одну плату или даже планируете защитить их от электростатического разряда вручную, если они разделены.

Решение Master и Device для приложений IO-Link

L6360   Master
L6362A  Device

введите описание изображения здесь

Когда бы вы рассмотрели такое решение:

  1. Пограничные чипы поставляются полностью защищенными, что было бы важно, если у вас есть каждый MCU на отдельной плате и вы имеете дело с открытыми контактами, например, с винтовыми клеммами.
    • Обратная полярность
    • Перегрузка с функцией отключения
    • Перегретый
    • Пониженное напряжение и перенапряжение
    • GND и VCC открытый провод
  2. Совместимость. Если кто-то другой собирается проектировать другую сторону, все, что ему нужно знать, это направлять данные через IO-Link.
  3. Встроенный регуляторVcc(in) 7~30v, Vdd(out) 3.3/5v

Мне это показалось интересным, поэтому я решил выложить его там.