Разумный стандартный тип проводки для дальнего действия I2C

Я планирую взаимодействовать с некоторыми сенсорными устройствами через I 2 C по длинной шине, с устройствами, соединенными в цепочку каждые 2 м или около того, всего до 16 м. Я видел здесь другие вопросы , относящиеся к этому из раздела «какой протокол мне использовать?» угол, но меня больше интересует фактическая проводка.

Мои основные требования:

  • Кабели должны быть чем-то, что нетехнический специалист может приобрести у обычного розничного продавца, такого как Amazon или eBay. Желательно что-то очевидное и общеизвестное, например USB, CAT5 или S-Video.
  • Разъемы должны быть максимально дешевыми — я пытаюсь сделать отдельные сенсорные платы как можно более дешевыми.
  • Максимальная стабильность, если это возможно.
  • Стараюсь избегать добавления дополнительных частей, поэтому по возможности следует избегать случаев, когда мне нужны такие вещи, как драйверы дифференциальных линий.

Устройства, вероятно, будут работать на логике 5 В.

Существует ли идеальный тип кабеля для такого рода вещей?

2 м — это не так уж и плохо, но интересно, сможете ли вы установить буферные чипы I2C на каждое устройство, которые будут разделять цепочку всего на 2 м кусков с полной буферизацией драйвера на каждом этапе?
и в этой ситуации я бы использовал Ethernet CAT5 или телефонный провод
Ваш выбор I2C имеет последствия. Если бы я хотел, чтобы это было действительно дешево, я бы сначала посмотрел на дешевые кабели / разъемы, а затем на дешевый реализуемый протокол. Проводка CAt5, включая разъемы, чепа, но я бы не выбрал I2C как оптимальный дешевый/надежный протокол для таких расстояний.
@WoutervanOoijen К сожалению, у меня есть только два варианта датчика: I2C и SPI, а для последнего потребуется 13 проводов из-за большой дальности. Перевод на альтернативные протоколы затруднен из-за необходимости использования дополнительных компонентов, что увеличивает стоимость одной платы.
@KyranF Буферы I2C выглядят идеально с точки зрения производительности, и я рассматривал их, но включение одного на каждую плату увеличило бы мои затраты как минимум на 30%. Я стараюсь их избегать, чтобы снизить себестоимость.
Я нашел некоторые за 1,7 канадских доллара или 0,73 канадских доллара в единицах по 1000+, и преимущества их приобретения для таких вещей, как электрическая изоляция (вы также можете получить оптоизолированные) и сдвиг уровня, потрясающие ... для отличной помехоустойчивости вы можете запустите некоторые из них от 15 В I2C, а затем сдвиньте уровень вниз
о, и вы исследовали One Wire? 1-проводные цепочки устройств — это круто, и вы можете делать довольно сильные подтяжки, используя полевые транзисторы, чтобы получить очень большие расстояния, но я не уверен, каковы скорости передачи данных.
@polynomial Что вы пытаетесь понять, что доступны только I2C и SPI, и откуда вы знаете, что uC на каждой плате дороже, чем другие решения, если вы еще не знаете других решений? Например, небольшой uC дешевле буфера am I2C. При проектировании систем вы не должны сначала делать «маленький» выбор: получите общую картину для всех альтернатив, а затем сможете принять решение.
Мне пришлось выдвинуть шину I2C далеко за пределы размера и варианта использования, для которых она предназначена. Трудно было добиться надёжности надёжно: Мемуары о разросшейся шине I2C . В следующий раз я буду использовать дифференциальную шину для дальней связи.
@NickAlexeev Я решил эту проблему в другом проекте, используя несколько дешевых двунаправленных микросхем буфера LVDS. С SPI это еще дешевле, потому что вам нужна только пара однонаправленных буферов LVDS.

Ответы (2)

I2C в некотором смысле является очень удобным протоколом, но цель его разработки состоит в том, чтобы соединять устройства на одной плате. Помимо проблем с уровнями сигнализации, существуют некоторые проблемы с протоколом, которые могут создавать проблемы при использовании его для связи с несколькими платами.

Например, предположим, что подключены два ведомых устройства, которые позволяют ведущему считывать произвольное количество байтов и которые могут возвращать ноль для произвольного количества этих байтов. Если в то время как одно устройство посылает данные ведущему устройству, второе устройство ошибочно интерпретирует часть данных как последовательность «СТАРТ», за которой следует его адрес чтения, возможно, что для каждого последующего такта по крайней мере одно из устройств будет хотеть для вывода бита данных "0". Такой сценарий сделал бы невозможным для мастера когда-либо восстановить контроль над шиной. Хотя можно спроектировать одноплатную связь таким образом, чтобы паразитные импульсы «просто не возникали», это часто невозможно при подключении многих устройств. Можно попытаться свести к минимуму вероятность появления паразитных импульсов, но не следует ожидать, чтобы избежать их полностью. Если раз в месяц показания датчика искажаются из-за паразитного импульса, это может быть приемлемо, но блокировка системы раз в месяц, скорее всего, будет менее приемлемой.

Если вы используете установку с одним мастером, я бы посоветовал использовать отдельные провода для выхода SDA к подчиненным устройствам и возврата SDA. Если ведомые устройства используют квитирование, возможно, стоит сделать то же самое для SCK. Затем на выходе мастера можно было бы активно повышать и понижать уровень (вместо того, чтобы активно понижать и пассивно повышать). Если бы разъемы были обозначены сторонами «вход» и «выход», каждая плата в цепочке могла бы «И» вернуть возврат от предыдущего устройства с состоянием контактов своего собственного устройства и вывести активный высокий и низкий уровень в обратном направлении. также. Такой дизайн, скорее всего, потребует использования битового мастера, а не аппаратного мастера, но, учитывая, что реализации программных мастеров часто могут лучше восстанавливать ошибки, чем аппаратные мастера, которые не должны этого делать.

В дополнение к повышенной надежности, достигаемой за счет привода «активный-высокий/активный-низкий», использование отдельных выходных/возвратных проводов для SDA позволит избежать возможности того, что одно ведомое устройство будет мешать попыткам ведущего заставить другое устройство отключиться, поскольку даже если все но одно ведомое устройство хотело выводить низкий уровень на SDA, у ведущего не возникло бы проблем с генерацией перехода с низкого уровня на высокий на выводе SDA последнего оставшегося ведомого.

Если вы не хотите использовать дополнительные провода для отделения выхода SDA от возврата SDA, можно было бы подключить ведомые устройства так, чтобы их сила подтягивания к SDA была ограничена, и подключить ведущее устройство так, чтобы оно могло безопасно подавлять рабы. Это позволило бы выполнить чистое восстановление в случае неисправности ведомого устройства, но не обеспечило бы преимуществ чистоты сигнала при использовании отдельных проводов. Кроме того, это будет хорошо работать только в том случае, если квитирование не используется. Надежная работа I2C требует, чтобы переходы на SCK и SDA были разделены временем, превышающим наихудший случай перекоса передачи. Если мастер полностью контролирует SCK, он может это обеспечить. Однако ведомые устройства, использующие квитирование, могут асинхронно генерировать события на SCK и SDA, при этом ведущее устройство не может контролировать их разделение.

Мой предпочтительный выбор, чтобы избежать такой блокировки, состоял бы в том, чтобы мастер периодически отключал питание или, возможно, при обнаружении такой проблемы, или даже в начале каждого цикла измерения.
@WoutervanOoijen: пригодность такого подхода может зависеть от характера датчиков и того, что они сообщают. Например, можно ожидать, что датчик вращения будет сообщать общее расстояние, на которое повернулся вал; выключение такого датчика приведет к потере всех подсчетов, которые произошли, когда он был выключен. Кроме того, несмотря на то, что I2C без установления связи можно сделать надежным в многоабонентской конфигурации за счет того, что ведущий управляет относительной синхронизацией SDA/SCK, в большинстве зависимых реализаций I2C, управляемых процессором, потребуется подтверждение связи.
Принять это, потому что это побудило меня изучить временные графики и другие решения для автобусов дальнего следования. В конце концов, можно было понизить скорость шины до 50 кГц или около того и надежно получить пару метров по кабелям USB, если у меня были двунаправленные преобразователи логического уровня на каждом устройстве, чтобы гарантировать, что падение напряжения не станет проблемой. В более позднем проекте я использовал двунаправленные буферные ИС LVDS для лучшей целостности сигнала, используя CAT5 для переноса дифференциальных пар. Это также может быть применено к SPI.

Слайд 68, стр. 25 из AN10216:

Лист68

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