Какие компромиссы и варианты подключения существуют при недорогой двунаправленной связи между двумя микроконтроллерами?
В этом случае:
Очевидные варианты включают SPI, CAN, USB, последовательный уровень TTL. I2C и 1-Wire, вероятно, слишком медленные. Из-за проблемы с количеством выводов модуляция источника питания для данных была бы идеальной, если бы существовал набор микросхем потребительского уровня, который делал бы это, экономя два контакта по сравнению с последовательными методами.
Учитывая ваши доступные варианты, похоже, что у вас есть несколько доступных контактов:
Таким образом, похоже, что консенсус составляет 2 контакта, если вы хотите двунаправленную связь, или, возможно, 3 для SPI. Учитывая одинаковое количество контактов, я бы выбрал UART, если он есть на обоих чипах. Предполагая соединение 1:1, вы можете просто перебрасывать данные, не обращая внимания на время или коллизии, и аппаратное обеспечение действительно простое.
Что касается служебных данных стека, существует множество различных протоколов, которые могут работать с UART, но, вероятно, в этом случае лучше всего определить свой собственный. С точки зрения связи, вы просто извергаете байты и получаете их на другом конце. Аппаратное обеспечение автоматически синхронизируется с каждым байтом, но вам все равно нужно знать, что это за байт. У вас будет эта проблема независимо от того, какой вариант вы выберете.
Если вы хорошо разбираетесь в UART (и я собираюсь дать вам ответ), вы можете соединить два вывода TX вместе с двумя резисторами последовательно, а затем иметь компаратор на каждом конце, который управляет выводом RX на основе местный ТХ и центральный отвод двух резисторов. Это позволяет использовать полный дуплекс на одном проводе. См. схему ниже.
Для защиты от электростатического разряда добавьте последовательный резистор внутри обоих корпусов для каждого контакта и установите несколько фиксирующих диодов на внешней стороне резистора. Для этого есть специальные диоды.
смоделируйте эту схему - схема, созданная с помощью CircuitLab
Вот как это работает:
Таким образом, во всех случаях выходной сигнал принимающего компаратора равен передаваемому 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.
Вы рассматривали UART? Для однонаправленной связи нужен только один провод. Если вы будете отправлять большие порции данных, вы можете проявить смекалку и сделать так, чтобы один провод чередовался между TX и RX в соответствии с некоторыми выдуманными правилами. Вы можете создать свой собственный протокол для исправления ошибок, конфликтов на шине и так далее. Приятно то, что даже самые дешевые микроконтроллеры будут иметь встроенный UART (чего нельзя сказать о USB или CAN).
Если вы посмотрите, вы, вероятно, сможете найти схемы модуляции источника питания, но их скорость передачи данных, вероятно, будет намного медленнее.
Основываясь на вашем утверждении: «Из-за проблемы с количеством выводов модулировать источник питания для данных было бы идеально, если бы это был набор микросхем потребительского уровня, который экономил бы два контакта по сравнению с последовательными методами», это звучит как 1-проводная связь, однако это предоставляет данные о низкой скорости, и вы не указываете, каковы могут быть ваши требования к скорости.
Я не вижу особого смысла в системе master/slave всего с двумя микроконтроллерами, которые оба запрограммированы вами.
Самая маленькая распиновка, которую вы можете получить, это, вероятно, UART (2 контакта). Поскольку вы программируете оба микроконтроллера, вы можете выбрать произвольную скорость. AVR µC может запускать UART со скоростью 1 Мбит/с, и если вы выберете 1 стоповый бит, отсутствие четности и 9 битов данных, вы можете получить 82% использования пропускной способности.
Вы всегда можете использовать собственный протокол, похожий на 1-Wire (но намного быстрее). Однако это довольно глупый подход, поскольку он будет потреблять всю вашу вычислительную мощность для поддержки протокола.
TLDR: не особенно дешево, но надежно подходит в некоторых случаях использования.
Глядя нестандартно, здесь могут быть какие-то другие решения, такие как следующий чип, с которым я недавно столкнулся. Конечно, все зависит от того, что вы хотите сделать. Что-то вроде UART приходит на ум, если вы установили оба микроконтроллера на одну плату или даже планируете защитить их от электростатического разряда вручную, если они разделены.
Решение Master и Device для приложений IO-Link
L6360 Master
L6362A Device
Когда бы вы рассмотрели такое решение:
Vcc(in) 7~30v, Vdd(out) 3.3/5v
Мне это показалось интересным, поэтому я решил выложить его там.
Лоренцо Донати поддерживает Украину
КиранФ
Брайс
Брайс
КиранФ