Какая встроенная последовательная шина самая популярная? [закрыто]

Я разрабатываю встроенное устройство, которое я хотел бы сделать совместимым со сторонними периферийными устройствами через последовательную шину. Должен ли я выбрать SPI, I²C или какую-то другую шину?

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

Это зависит от того, с какими периферийными устройствами вы хотите взаимодействовать, при каких напряжениях, на каких скоростях и на каком расстоянии.
Я добавил больше деталей к вопросу
Я не могу поверить, что UART вообще не упоминался ... Я просто говорю.
Поправьте меня, если я ошибаюсь, но я не думал, что UART — это шина. Я думал, что это просто последовательная связь между двумя устройствами.
Значит, шина не предназначена для последовательной связи между двумя устройствами? Вы сбрасываете со счетов это, потому что иногда это просто используется в двух точках? PCIe, SATA, HT, как правило, двухточечные. Несмотря на это, большинство периферийных устройств UART можно использовать для RS-422, RS-485 или LIN, которые являются многоточечными.

Ответы (5)

Если вы не уверены, и ваши требования довольно расплывчаты, я бы выбрал I²C.

Основное различие между SPI и I²C заключается в том, что SPI требует линии выбора микросхемы для каждого периферийного устройства. I²C передает периферийный адрес в начале связи, поэтому ему не нужны линии выбора микросхемы. Линии выбора чипа становятся громоздкими после первых нескольких.

С другой стороны, SPI, вероятно, легче реализовать и отладить. Это может быть победителем, если вы просто хотите подключиться к паре устройств.

Я бы исключил USB, если вам не нужны высокие скорости передачи данных на относительно больших расстояниях (м, а не см). Я бы также исключил RS-232, если только это еще не 1976 год, и вашим периферийным устройствам нужен массивный сигнал, чтобы немного отличить его от шума.

Вы можете подумать о Dallas 1-wire, но я подозреваю, что он не так распространен, как I²C, и «1-wire» шина, для работы которой требуется 2 провода, всегда казалась мне немного подозрительной.

Я думаю, что если у вас очень простой контроллер и вам нужно использовать бит-бэнг (в основном, ручное управление часами), гораздо проще реализовать SPI на 4 оставшихся портах GPIO.
Я думаю, вы правы в том, что проще использовать SPI, чем I2C. Я все же надеюсь, что до стука не дойдет.
+1 за подозрительность двухпроводной системы, продаваемой как «1-проводная».
И что еще хуже, многие микросхемы, которые реализуют систему 1-wire (+земля), требуют третьего контакта — Vcc — потому что они не могут работать от паразитного питания! Когда я думаю об однопроводной шине, я представляю себе схему с емкостной связью, мостовым выпрямителем с ограничением по току и линейным кодом с автосинхронизацией; а не 2 или 3 провода.
«1-wire» следовало бы назвать «1-data-wire», так как это больше, чем он есть. Дополнительные провода — это GND и (иногда) стабильная линия питания.

Поскольку вы сказали, что это будет низкая пропускная способность, я бы выделил достаточно операций ввода-вывода для обработки как SPI, так и I2C. Я бы также, если возможно, имел дополнительные линии CS, чтобы вы могли запускать несколько устройств SPI. Также не забудьте посмотреть, как вы собираетесь питать периферийное устройство. Если у вас разряжается батарея, чтобы продлить срок службы, вам необходимо перевести устройство в режим пониженного энергопотребления или отключить питание, когда оно не используется. Также используйте модуль последовательного контроллера контроллера, если это возможно, многие контроллеры будут мультиплексировать SPI, I2C и последовательный порт. Если вы можете отделить беспроводную связь от датчика, это облегчит отключение устройств, когда они не используются. Кроме того, у некоторых датчиков есть линия, которая сообщает контроллеру, когда их нужно обслуживать, поэтому вы также хотите иметь дополнительный ввод-вывод, входящий в контакт, в идеале тот, от которого вы можете генерировать прерывание.

Вопрос немного проблематичен из-за проблем с определением.

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

SPI — это четырехпроводная шина. I2C — двухпроводная шина.

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

Эта статья в Википедии и этот справочный сайт объясняют гораздо яснее, чем я, также следуйте ссылкам, чтобы узнать еще больше!

По сути, вам следует выбирать между I2C и SPI.

Независимо от того, какую шину вы используете, вы должны учитывать уровень напряжения ваших датчиков и сторонних периферийных устройств. Вы можете сделать это, сделав свой собственный преобразователь с двумя полевыми МОП-транзисторами (работает только в одном направлении — срабатывание/без изменений или понижение/без изменений; только проблема, если вам нужно запустить датчики на 3,3 и интерфейс с мастерами 1,8 и 5 В). См. документ NXP AN10441 [PDF]. Это также будет работать для SPI (просто удалите подтяжки). Вам нужно будет добавить линию к разъему, чтобы установить опорное напряжение (если вы еще этого не сделали).

Одним из недостатков I2C является то, что вы ограничены самыми медленными часами на шине. Если один датчик поддерживает только 100 кГц, а вы хотите обмениваться данными с памятью на частоте 400 кГц или 1 МГц (обе допустимые скорости), поведение вашего более медленного сенсора не указано. Если вы используете SPI, линия выбора чипа означает, что более медленный датчик даже не будет прослушивать то, что находится на шине, и вы можете использовать разные скорости для разных датчиков.

Я бы использовал I2C. Просто убедитесь, что вы можете получить беспроводной модуль, который может обмениваться данными через I2C, если вы хотите, чтобы он был на той же шине, что и ваши датчики. Большинство коммуникационных периферийных устройств, которые я видел, используют SPI, а не I2C.