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

Я хотел бы начать реализацию системы, состоящей из N микроконтроллеров (N >= 2 микроконтроллеров), но я хотел бы знать возможности, позволяющие им взаимодействовать друг с другом.

В идеале (N-1) микроконтроллеры размещаются внутри дома в качестве клиентов, а последний («серверный») подключается к ПК через USB. Проблемы, которые у меня есть сейчас, заключаются в том, как подключить эти (N-1) микроконтроллеры к «серверу». Клиентские микроконтроллеры выполняют очень простые задачи, поэтому использование ARM для выполнения таких простых задач только потому, что они предоставляют CAN/ PHY-MAC , может оказаться не лучшим решением .

Связь будет происходить не чаще одного раза в несколько минут для большинства устройств и по запросу для других. Скорость не очень критична (сообщение короткое): 1 Мбит/с считаю ОЧЕНЬ перебором для моих целей.

MCU, которые я планирую использовать, следующие.

  • Atmel AVR Tiny/Mega
  • ТИ МСП430
  • АРМ Кортекс М3/М4
  • (Возможно, Atmel AVR UC3 - 32-битная версия)

Я хотел бы избегать PIC , если это возможно (личный выбор), просто потому, что меньше возможностей для их программирования (все вышеперечисленные инструменты имеют более или менее открытый исходный код, а также некоторые официальные инструменты).

Я знаю, что некоторые ARM обеспечивают функциональность CAN , но не уверен в других.

Прямо сейчас я придумал эти возможности:

  1. Простой GPIO для отправки данных (скажем,> 16 бит в HIGH, чтобы указать начало сообщения,> 16 бит в LOW, чтобы указать на конец сообщения). Однако он должен быть на стандартной частоте << (частота_клиента, частота_сервера), чтобы иметь возможность обнаруживать все биты. Требуется только один кабель на клиентский MCU.
  2. RS-232 : я думаю, что это наиболее часто используемый протокол связи, но я не знаю, насколько хорошо он масштабируется. Я рассматриваю до 64 клиентских MCU прямо сейчас (возможно, больше позже)
  3. USB: Насколько я знаю, это в основном похоже на RS-232, но я не думаю, что он очень хорошо масштабируется в этом случае (хотя USB поддерживает множество устройств — 255, если я правильно помню — это может быть слишком сложно для этого приложения)
  4. RJ45 / Ethernet: это то, что я бы очень хотел использовать, потому что он позволяет без проблем передавать данные на большие расстояния (по крайней мере, с экранированным кабелем > Cat 6 ). Проблема в стоимости (PHY, MAC, трансформатор, ...). Я не знаю, сможете ли вы на самом деле хорошо паять дома. Таким образом, мне не понадобится клиентский MCU.
  5. Беспроводная связь / ZigBee : модули очень дорогие, хотя это может быть выходом, чтобы избежать «спагетти» за столом.
  6. Радиомодули/трансиверы: я говорю о тех, которые работают в диапазоне 300 МГц - 1 ГГц, поэтому их сложно паять дома. Модули все встроенные, но стоят они так же дорого, как ZigBee (по крайней мере модули RF у Mouser, у Sparkfun вроде дешевле).
  7. МОЖЕТ? Он кажется очень прочным. Хотя я не планирую использовать его в автомобильных приложениях, он все же может быть хорошей альтернативой.
  8. I²C / SPI / UART ? Опять же - лучше избегать "спагетти" с кабелями, если это возможно.
  9. ПЛК на самом деле не вариант. Производительность ухудшается довольно быстро по мере увеличения длины и зависит от емкостной нагрузки сети питания. Я думаю, что цена примерно такая же, как у Ethernet.

Кроме того, какой протокол будет «лучше» в случае одновременных передач (допустим, редкий случай, когда два устройства начинают передачу в один и тот же момент: какой протокол обеспечивает лучшую «систему управления конфликтами» / «систему управления конфликтами»?

Подводя итог : я хотел бы услышать, что может быть лучшим решением для распределенной клиентской системы, которая обеспечивает очень легкую передачу данных, учитывая как гибкость (максимальное количество устройств, система управления конфликтами/коллизиями, ...), цена , легко сделать дома (пайка), ... Я хотел бы не тратить 20 долларов только на модуль связи, но в то же время иметь 30 проводов за столом было бы отстойно.

Решение, которое я представляю прямо сейчас, состояло бы в том, чтобы установить базовую связь между соседними MCU через GPIO или RS-232 ( дешево !) И использовать Ethernet/ZigBee/Wi-Fi на одном MCU на «зону» для связи с сервером ( дорого ). , но это все же намного дешевле, чем один модуль Ethernet на каждый клиентский MCU).

Вместо кабелей вполне можно использовать оптоволокно/световоды. Хотя необходимы дополнительные преобразования, и я не уверен, что это будет лучшим решением в этом случае. Я хотел бы услышать дополнительную информацию о них.

Существуют PIC с функциональностью CAN и бесплатные официальные инструменты для их программирования с документацией.
@AndrejaKo PIC на самом деле не имеет компилятора с открытым исходным кодом, такого как AVR или, по крайней мере, MSP430. Это правда, что они часто предоставляют больше возможностей, чем микроконтроллеры, которые я перечислил выше, по той же цене. Мне не очень нравятся эти большие различия между семействами 12/16/18/24/32 и то, что некоторые из них вообще не имеют бесплатного компилятора (думаю, это PIC18).
На самом деле PIC18 имеет бесплатный компилятор, как и другие. Главный плюс других семейств в том, что они работают с GCC. В лагере с открытым исходным кодом есть компилятор C для малых устройств, который должен поддерживать устройства PIC 16 и PIC 18.
Если у вас еще нет опыта работы ни с одним из упомянутых вами UC, имейте в виду, что начать с ARM гораздо сложнее, чем, например, с PIC или AVR, особенно если вы хотите использовать открытый исходный код. С ARM поставщики не проектируют ядро, а также обычно не предоставляют IDE, что может немного усложнить все это. Приятно, например, что Microchip предоставляет и поддерживает все, что касается PIC.
@OliGlaser Ну ... хотя это правда, что инструменты с открытым исходным кодом для ARM могут быть немного сложными в использовании (я пробовал плату STM32 Discovery, и она не очень хорошо работала), многие поставщики предлагают IDE, которая - с его плюсы и минусы - на основе eclipse и с бесплатными ограничениями: например, LPCXpresso (NXP) и Code Composer Studio (TI) (не с открытым исходным кодом, но они, по крайней мере, поддерживаются). С другой стороны, AVR довольно хорошо поддерживаются на стороне с открытым исходным кодом, а также в ATMEL STUDIO 6. Никакого опыта работы с PIC. Кодировал только AVR (ассемблер) и ARM (C, на NDS).
@ user51166 PIC с новейшей IDE использует Netbeans.
@AndrejaKo: Я вижу это. Но это само по себе не означает, что PIC можно легко или эффективно закодировать (как и многое другое).
@ user51166 - Да, я должен был сказать, что некоторые поставщики не предоставляют IDE (например, ST), и большинство бесплатных версий, которые я видел, имеют некоторые раздражающие ограничения (например, могут программировать/отлаживать только до 32 КБ - очень полезно на STM32F4 ;-)) Я использую инструменты Raisonance, которые не так уж плохи и дешевле большинства.
@OliGlaser: тогда, вероятно, лучшим из них является LPCXpresso (NXP) с разрешением до 128 КБ, если я правильно помню (или это было 256 КБ?) С бесплатной лицензией, позволяющей использовать его даже в коммерческих целях. Затем идут другие инструменты с открытым исходным кодом, хотя их сложнее настроить. Бесплатные версии CCS/IAR/Keil/... не очень полезны с ARM, как вы сказали, из-за ограничений размера кода (для компиляции ИЛИ «только» для отладки).
У rs232 нет протокола, вы хотели сказать uart.
Существует растущая экосистема беспроводных устройств IoT. На ум приходит RuuviTag. Если ваши подчиненные являются простыми датчиками и будут работать от батареи, то это может быть вариантом.

Ответы (8)

CAN звучит наиболее применимо в данном случае. Расстояния внутри дома могут быть обработаны CAN со скоростью 500 кбит/с, что звучит как достаточная пропускная способность для ваших нужд. Последним узлом может быть готовый интерфейс USB-CAN. Это позволяет программному обеспечению компьютера отправлять сообщения CAN и видеть все сообщения на шине. Остальное - программное обеспечение, если вы хотите представить это внешнему миру как TCP-сервер или что-то в этом роде.

CAN - это единственное средство связи, которое вы упомянули, которое на самом деле является шиной, за исключением собственных линий ввода-вывода. Все остальные — точка-точка, включая Ethernet. Ethernet можно сделать так, чтобы он логически выглядел как шина с коммутаторами, но отдельные соединения по-прежнему являются двухточечными, и получение топологии логической шины будет дорогостоящим. Накладные расходы на прошивку на каждом процессоре также значительно больше, чем у CAN.

Приятным моментом в CAN является то, что несколько нижних уровней протокола обрабатываются аппаратно. Например, несколько узлов могут пытаться передавать одновременно, но аппаратное обеспечение позаботится об обнаружении и устранении коллизий. Аппаратное обеспечение обеспечивает отправку и получение целых пакетов, включая генерацию и проверку контрольной суммы CRC.

Ваши причины избегать PIC не имеют никакого смысла. Есть много проектов для программистов, которые могут создать свой собственный. Одним из них является мой LProg со схемой, доступной внизу этой страницы. Тем не менее, создание собственного не будет экономически эффективным, если вы не цените свое время на копейки в час. Это также больше, чем просто программист. Вам понадобится что-то, что поможет в отладке. Microchip PicKit 2 или 3 — это очень недорогие программаторы и отладчики. Хотя у меня нет личного опыта с ними, я слышал, что другие регулярно их используют.

Добавлен:

Я вижу некоторые рекомендации для RS-485, но это не очень хорошая идея по сравнению с CAN. RS-485 является стандартом только для электрических сетей. Это дифференциальная шина, поэтому она позволяет использовать несколько узлов и обладает хорошей помехоустойчивостью. Однако в CAN есть все это, а также многое другое. CAN также обычно реализуется как дифференциальная шина. Некоторые утверждают, что RS-485 легко подключить к электрическому интерфейсу. Это правда, но CAN тоже. В любом случае это делает один чип. В случае с CAN хорошим примером является MCP2551.

Таким образом, CAN и RS-485 имеют практически одинаковые электрические преимущества. Большое преимущество CAN находится выше этого уровня. С RS-485 над этим уровнем ничего нет. Ты сам по себе. Можно разработать протокол, который имеет дело с арбитражем шины, проверкой пакетов, тайм-аутами, повторными попытками и т. д., но на самом деле сделать это правильно гораздо сложнее, чем думает большинство людей.

Протокол CAN определяет пакеты, контрольные суммы, обработку коллизий, повторные попытки и т. д. Он не только уже существует, продуман и протестирован, но действительно большим преимуществом является то, что он реализован непосредственно в кремнии на многих микроконтроллерах. Прошивка взаимодействует с периферийным устройством CAN на уровне отправки и получения пакетов. Для отправки аппаратное обеспечение выполняет обнаружение конфликтов, отсрочку, повторную попытку и генерацию контрольной суммы CRC. При приеме он выполняет обнаружение пакетов, настройку рассогласования часов и проверку контрольной суммы CRC. Да, для периферийного устройства CAN потребуется больше встроенного ПО, чем для UART, которое часто используется с RS-485, но в целом требуется намного меньше кода, поскольку кремний обрабатывает так много деталей протокола низкого уровня.

Короче говоря, RS-485 — это ушедшая эпоха, и сегодня в новых системах мало смысла. Основная проблема, по-видимому, заключается в том, что люди, которые использовали RS-485 в прошлом, цепляются за него и думают, что CAN каким-то образом «сложный». Низкие уровни CAN сложны, как и любая компетентная реализация RS-485. Обратите внимание, что несколько хорошо известных протоколов, основанных на RS-485, были заменены более новыми версиями, основанными на CAN. NMEA2000 является одним из примеров такого нового стандарта на основе CAN. Существует еще один автомобильный стандарт J-J1708 (основанный на RS-485), который сейчас в значительной степени устарел с появлением OBD-II и J-1939 на основе CAN.

создание моей собственной платы полезно при интеграции MCU с аппаратным обеспечением, которое у него есть. Я согласен, что для целей разработки лучше использовать комплект для разработки. Причина, по которой я избегаю PIC, заключается в отсутствии у них компиляторов с открытым исходным кодом (есть некоторые бесплатные, но не для PIC18, например), а не в отсутствии общедоступных схем, хотя они предоставляют некоторые дополнительные функции, которые вы можете не найти в других микроконтроллерах (Ethernet, МОЖЕТ, ...). А I2C - это шина AFAIK.
@ user51166 - Микрочип предоставляет бесплатные компиляторы PIC18. См . страницу продукта Компиляторы MPLAB XC . В нем также перечислены компиляторы для 16-битного и 32-битного UC.
@user51166 user51166 Также есть бесплатный компилятор C18 .
@PetPaulsen Странно. Я почти уверен, что месяц назад я видел страницу со списком всех компиляторов, доступных для бесплатной загрузки (PIC16/24/32), за исключением PIC18, который не был связан с какой-то проблемой лицензирования. Вероятно, это решилось переходом MPLAB C Compiler -> MPLAB XC Compiler, хотя я не уверен. Кроме того, они «только» предлагают бесплатную версию, которая не оптимизирует ваш код, а не компилятор с полностью открытым исходным кодом. Все же это лучше, чем ничего ;)
@user: Я считаю, что у всех компиляторов Microchip есть бесплатные версии, которые отличаются от полных только тем, что некоторые оптимизации отключены. Ассемблер, библиотекарь, компоновщик и симулятор включены в бесплатный пакет MPLAB. Здесь действительно нет проблем.
@ user51166 Ну, вы можете разрабатывать бесплатную версию, а затем загрузить демо-версию полной версии, которая работает со всеми оптимизациями в течение 60 дней. Так же C18 на данный момент доступен бесплатно, я скачал его буквально пару дней назад.
@AndrejaKo: приятно знать. Я только сказал, что месяц назад я видел другую страницу на сайте Microchip, в которой говорилось, что компилятор PIC18 недоступен в свободном доступе. Приятно осознавать, что все изменилось в лучшую сторону ;)
@user51166 user51166 - насколько мне известно, Microchip всегда предоставляла бесплатные компиляторы для всех своих семейств (я использовал их все в тот или иной момент) с полными возможностями программы и отладки, только функции оптимизации отключены, как говорит Олин (что для многих приложений мало что значит)
+1 - Я думаю, что взвешивание всех требований ОП МОЖЕТ показаться правильным. Однако, если связь очень нечастая, может быть вариантом базовая настройка RS485 с мастером, инициирующим все транзакции.
+1 - я согласен со всем, что вы говорите. ARM могут быть неожиданной занозой в заднице для новичка. CAN будет самым простым способом заставить несколько микроконтроллеров разговаривать по шине. Но вы должны рассмотреть еще более низкие скорости передачи данных.

Я бы порекомендовал контроллер с CAN, так как эта функция предназначена именно для сетевой цели контроллера.

RS232 можно легко внедрить, но это станет очень сложным, если вы попытаетесь реализовать связь более чем с двумя узлами (потому что он не предназначен для этой цели).

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

Каковы, например, преимущества CAN по сравнению с Ethernet? Дешевле, наверное, но кроме этого, что еще?
@ user51166 - CAN не просто дешевле, а намного дешевле. Это не просто проще, а гораздо проще.
@Rocketmagnet: объясните, пожалуйста, немного подробнее. В большинстве случаев вам все равно нужна интегрированная ИС (хотя PIC, ARM и другие? Часто интегрируют функцию CAN, они немного дороже). С аппаратной точки зрения я не вижу, как это может быть намного дешевле, поскольку микросхемы можно найти по 0,5-1,0 доллара за штуку. Я полагаю, вы имеете в виду проще с точки зрения программного обеспечения, верно? CAN имеет максимальное расстояние ~ 500 метров, что, безусловно, достаточно в моем случае, но - просто для информации - есть ли аналогичные альтернативы для больших расстояний (может быть, оптоволокно)?

Я бы выбрал шину RS-485, работающую с данными Manchester Encoding .

RS-485, потому что:

  • Дешево
  • Легко реализовать
  • Использует энергию
  • Позволяет преодолевать большие расстояния (до 1200 метров)
  • Высокая скорость передачи данных (до 10 Мбит/с)
  • Высокая устойчивость к помехам
  • Существуют приемопередатчики, позволяющие подключать до 256 устройств на одной шине.
  • Низкое количество деталей

Манчестерское кодирование, потому что:

  • Легко реализовать
  • самосинхронизируется

Для обеспечения целостности данных сообщение может включать длину и поле CRC.

Пример функции CRC:

unsigned char crc_calc(unsigned char buffer[], unsigned short size)
{
  unsigned long i;
  unsigned char crc;

  crc = CRC_INIT;

  for (i=0;i<size * 8;i++)
  {
    crc = (crc << 1) | (crc >> (7));

    if (buffer[i/8] & (0x80 >> (i%8)))
    {
      crc ^= CRC_POLY;
    }
  }

  return crc;
}

CRC_INITи CRC_POLYявляются произвольными значениями, которые используются для вычисления CRC.

Пример сообщения с полями длины и CRC:

Пример сообщения

Любое предложение для таких хороших приемопередатчиков, возможно, дешевых?
Кроме того, как предположил @AndrejaKo, RS-485, похоже, не предлагает протокол разрешения конфликтов.
Выбор трансиверов зависит от напряжения, которое вы собираетесь использовать. Разрешение конфликта должно быть выполнено в программном обеспечении с проверкой CRC, контролем линии или тем и другим.
Если у вас есть один мастер, вы также можете реализовать какую-то адресацию или пошаговую передачу.
Не совсем мастер. Просто «сервер», который действует как интерфейс к ПК через USB. Однако клиенты должны отправлять ему сообщения автоматически ...
@ user51166 Я использую аналогичную систему связи, и во всех сообщениях есть поле CRC, все узлы контролируют шину, когда происходит коллизия (CRC не совпадает), узлы, которые должны передать, ждут случайное время перед снова пытаемся передать. Это работает, и у меня никогда не было проблем с этим.
Я не совсем знаком с CRC. Я пытался прочитать статью в Википедии, но не очень понял. У вас есть ссылка на статью / книгу, чтобы помочь мне понять это?
@ user51166 Проверьте обновленный ответ.
Спасибо. Теперь немного понятнее. Я полагаю, вы отправляете CRC вместе с сообщением и проверяете отправленный CRC с локально вычисленным CRC, верно? Для расстояний, подобных тем, которые я сказал для этого приложения, может не иметь значения, но можно ли использовать оптическое волокно / оптоволокно для дальнейшего распространения передачи (с точки зрения расстояния), поскольку тогда сообщение отправляется как свет, а не напряжение / Текущий? Или для этого нужен другой протокол? Спасибо.
@ user51166 Верно. Помните, что вы также должны отправить длину сообщения, вы можете использовать это в качестве первой проверки, затем вы сравниваете вычисленный CRC полученного сообщения с полученным CRC, и если они равны, это означает, что сообщение «вероятно» не является поврежден. Вы можете использовать 16- или 32-битную CRC, чтобы уменьшить вероятность того, что проверка CRC для поврежденного сообщения будет интерпретирована как хорошая. Также не забудьте установить в поле CRC значение 0 (или другое значение по вашему выбору) перед вычислением CRC сообщения.
@user: Генерация CRC - это лишь небольшая часть общей проблемы разработки собственного протокола многоабонентской шины выше RS-485. Помимо манчестерской кодировки, есть еще много чего. Это не простая задача. Как вы собираетесь обнаруживать столкновения, не говоря уже об их обработке, если упомянуть только один пример?
@OlinLathrop Да, я знаю, что проверка CRC не решает всего, необходимо иметь уровень протокола, который обрабатывает коллизии и повреждение данных, но это не так уж сложно для реализации надежной связи через RS-485 с использованием манчестерского кодирования. Я знаю это, потому что я уже сделал это.
В CAN уже есть CRC и куча других уловок для обнаружения проблем. Зачем создавать свой собственный, когда CAN уже делает все, что вы хотите?
@Rocketmagnet Это было просто предложение. Я никогда не использовал CAN, поэтому могу только предложить то, что знаю. Может быть, если бы я уже использовал CAN, я бы предложил его вместо этого.

RS-485, использующий несколько проводов, может здесь хорошо работать, если есть возможность подключить одну и ту же линию ко всем устройствам.

Если, например, он используется с традиционным сетевым кабелем категории 5e, у вас могут быть две пары для передачи данных в обоих направлениях (с использованием полнодуплексного модуля), одна пара или, может быть, даже один провод в качестве общей земли, а остальные для согласования. какое устройство будет передавать в какой момент. Это немного сложнее, чем RS-232, но модули дешевле, чем CAN и Ethernet, а ограничение по кабелю составляет 1200 м. Недостатком является то, что вам придется составить собственный протокол разрешения конфликтов. Возможно, устройство, которое хочет передавать, проверяет один выделенный провод и смотрит, высокий ли он. Если это не так, поднимите его и начните общение, а если это так, подождите случайный период времени. Тем не менее, я не уверен, насколько хорошо это будет работать на больших расстояниях.

Не беспокойтесь о слишком длинных дистанциях, в данный момент я не планирую преодолевать более 100 метров.
Кстати, почему сегодня stackexchange не принимает @<username>? Каждый раз, когда я ставлю один, он полностью удаляется (не только символ @) ...
@ user51166 - Создатель ответа автоматически уведомляется, поэтому «\@-шум» автоматически удаляется. (Мой \@user51166 не был удален, потому что вы не являетесь автором этого ответа)
Интересно то, что я не получил уведомления ни об одном из комментариев здесь.

Позвольте мне сравнить ваш предпочтительный выбор, Ethernet, с моим предпочтительным выбором, CAN.

Требуемые компоненты:

  • Ethernet: разъем RJ45, магниты, микросхема Phy (если не интегрирована в MCU). Также нужны коммутаторы и кабель от коммутатора к каждому узлу. Для каждой печатной платы требуется довольно много конденсаторов и нагрузочных резисторов, возможно, также ферритовых. Нужен хороший дизайн печатной платы.
  • CAN: микросхема приемопередатчика (дешевая), любой разъем, дешевый кабель могут переходить от одного узла к другому по кольцу вокруг сайта. Нужен только один конденсатор для приемопередатчика и по одному согласующему резистору на каждом конце шины.

Вы говорите о микроконтроллерах за 1 доллар. Стоимость автобуса намного больше, чем MCU. Вам придется сложить общую стоимость каждого решения, чтобы узнать, какое из них на самом деле дешевле. Сложите стоимость MCU, разъемов, приемопередатчиков, пассивных компонентов, печатной платы, кабелей и т. д.

LPC11C24 от NXP также имеет встроенный приемопередатчик CAN, а CANOpen поддерживается в ПЗУ (не съедает вашу флэш-память 32 КБ данных). Плата LPCXpresso 11c24 стоит 20 евро (предусмотрено место для разъема DB9), так что вы просто добавляете провода :-)

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

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

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

Это зависит от масштаба вашего приложения и ваших микроконтроллеров. Вы упомянули Atmel tiny/mega, они довольно маленькие. В их случае I2C/SPI/UART имеют то преимущество, что они реализованы аппаратно и поэтому просты в использовании.

Хорошо, но как это решает проблему ОП? IIC - это автобус, но на самом деле он совсем не подходит для дальних расстояний, например, через дом. Он несимметричный и имеет относительно высокий импеданс. SPI — это шина, но она управляется одним мастером с отдельной линией выбора подчиненного устройства для каждого устройства. Вы можете реализовать каждую линию как дифференциальную пару с линейными драйверами и приемником, но у вас все равно будет проблема выбора двухточечного ведущего к подчиненному. UART строго точка-точка. Непонятно, как вы собираетесь использовать их в ситуации ОП.