КРАТКОЕ СОДЕРЖАНИЕ:
Вот что работает:
Raspberry Pi (I²C) <-> кабель 1 м <-> датчик (I²C)
Вот что я пытаюсь сделать (не работает, отсюда и вопрос):
Raspberry Pi (I²C) <-> кабель 30 м <-> датчик (I²C)
Таким образом, «уравнение» для решения:
Raspberry Pi (I²C, SPI и др.) <-> X <-> кабель 30 м <-> Y <-> датчик (I²C/SPI)
Решите для X и Y
ДЕТАЛИ:
Я работаю с кучей датчиков, сконфигурированных в звездообразной сети/топологии.
Raspberry Pi Zero используется как центральный «концентратор», где собираются и обрабатываются все данные датчиков. Все датчики одинаковы и используют протокол I²C (они также предлагают интерфейс шины SPI). При этом у меня в настоящее время есть мультиплексор I²C, подключенный к Raspberry Pi Zero, чтобы включить несколько устройств, настроенных с одним и тем же аппаратным адресом I²C. Все датчики подключены к Raspberry Pi Zero с помощью экранированного кабеля 26/4. На данный момент все работает как задумано.
Имея доказательство концепции, я теперь хочу увеличить радиус действия звездообразной сети/топологии на 20-30 м для каждого соединения датчика с концентратором. Я думал, что могу просто использовать более длинный провод, но, видимо, протокол I²C ограничивает длину удлинителя провода. Я читал различные приемы/решения о том, как увеличить длину, такие как снижение частоты, замена резисторов и т. д.
Я буду честен; Я не инженер-электрик, поэтому некоторые из этих вещей кажутся немного более продвинутыми, и у меня действительно нет знаний или инструментов для оценки эффективности этих типов ссор.
В любом случае, я немного покопался и нашел различные микросхемы, которые потенциально могу реализовать как решение типа «подключи и работай». При этом большая часть материала, который я прочитал, была написана много лет назад, и я не знаю, жизнеспособны ли эти решения до сих пор. Вот фишки, которые я нашел
Сравнивая два, я читал, что первый пункт более универсален. Я также читал, что второй элемент старше и требует много энергии , что делает удаленное развертывание (питание от батареи) менее практичным. Недавно я наткнулся на другое решение, в котором вы используете преобразователь I²C в 1-wire, поскольку протокол 1-wire не так чувствителен к увеличению длины провода.
Это похоже на потенциальное решение, но я мало слышал о том, что его используют другие. Единственным источником информации, который я получил, была веб-страница компании и видео. Если я правильно прочитал техническое описание, решение также не требует большой мощности. Мне интересно, покупают ли другие то, что они продают, и работает ли это?
В любом случае, опять же, я не инженер-электрик, поэтому мне действительно не помешал бы совет. Похоже, что протокол I²C — это то, что используют многие датчики (по крайней мере, на рынке встраиваемых систем «сделай сам»), поэтому я полагаю, что я не единственный, кто сталкивается с проблемой расширения связи I²C .
Вот мои требования к решению:
РЕДАКТИРОВАТЬ: я еще немного покопался на выходных и наткнулся на этот набор микросхем (MCP25 *), который звучит как интерфейс CAN-to-SPI. ЭТО НЕ РАБОТАЕТ... СМОТРИТЕ комментарии @Maple ниже.Я, конечно, не говорю, что это единственный набор микросхем, предлагающий такое преобразование, просто он первый, с которым я столкнулся. Датчики, которые я использую, имеют интерфейс шины SPI, поэтому я думаю, что смогу напрямую подключить один из этих чипов к каждому датчику? У меня есть только 5 сенсорных узлов, подключенных к Raspberry Pi в моей звездообразной топологии, поэтому я полагаю, что я хорошо укладываюсь в ограничения на количество узлов, которые может поддерживать шина CAN. Тогда возникнет вопрос, как настроить остальную часть шины. Могу ли я просто подключить один конец кабеля Cat 5 к одному из чипов CAN-to-SPI? Затем провод протянется на 20-30 м к Raspberry Pi. Могу ли я затем добавить еще один чип в Raspberry Pi, чтобы «инвертировать» преобразование и общаться с Raspberry Pi? Есть ли способ подключить все пять узлов к одному интерфейсу/чипу? я не Не думаю, что Raspberry Pi имеет встроенную поддержку шины CAN, но, очевидно, имеет SPI (я думаю, вы можете подключить только два устройства?). Если бы эти чипы можно было добавить на сенсорные узлы, что потребовалось бы для взаимодействия с Raspberry Pi?
EDIT_2: Собрав дополнительные сведения из отзывов всех (спасибо), я решил продолжить копать. Неудивительно, что я наткнулся на еще одно потенциальное решение! Я читал комментарии к одной из ссылок, на которые я указал выше , и кто-то упомянул чип PCA9615 . Быстрый поиск в Google по этому чипу вводит «дифференциальный I²C». С точки зрения непрофессионала, это звучит как решение, которое не потребует от меня изменения моего программного обеспечения. Кроме того, я не полностью знаю плюсы и минусы и соответствует ли это моим трем перечисленным требованиям. Я буду читать дальше в таблице данных, но если у кого-то есть отзывы об этом решении, я весь внимание!
Решение Onewire с DS28E17 — это решение, которое в основном работает сразу после установки. Вы даже можете использовать битбанговый хост (например, на GPIO4) и обойтись практически без дополнительного оборудования. Каждый DS28E17 на шине автоматически отображается как хост-адаптер I²C, никаких изменений программного обеспечения не требуется. Недостатки:
Забудьте о DS2484 за идеей DS28E17 . Это просто возводит в квадрат накладные расходы, поэтому отправка нескольких байтов занимает секунду или около того. (DS28E17 за DS2484 или DS2482-800, напротив, предназначен для использования по назначению и позволяет избежать битовых ударов.)
Причина, по которой чип еще мало используется другими людьми, заключается в том, что он вышел только в 2016 году, а драйвер для Linux доступен только с версии ядра 4.15.
(И предостережение: DS28E17 рассчитан только на 3,3 В.)
Я подозреваю, что есть и другие виды удлинителей I2C, но я знаком только с двумя — буферами (такими как PCA9605, P82B715) и сплиттерами (такими как PCA9600, P82B96). Все они предназначены для изоляции более высокой емкости шины от длинных шин за счет увеличения пропускной способности выходов. Кажется, что все буферы приближаются к EOL.
Обратите внимание, однако, что увеличение пропускной способности в основном означает увеличение токов, что не сулит ничего хорошего с вашим требованием низкого энергопотребления.
Есть много заметок по применению, которые я бы рекомендовал прочитать, например, уже предложенные @ali-chen AN11084 или AN11075 , AN10658 . Интересно, что даже те из них, которые используют в своей топологии витые пары, по-прежнему полагаются на несимметричную сигнализацию. Я почти уверен, что любое приложение или устройство, которое вы выберете, должно работать хорошо.
Что я хотел бы предложить, так это сначала взглянуть на это устройство . Они описывают его как «удлинитель PCA9600». Однако глубоко внутри технического описания вы можете найти умное использование микросхемы приемопередатчика CAN PCA82C251 для преобразования сигналов I2C (разделенных на Tx, Rx с помощью PCA9600) в дифференциальные сигналы.
Вышеупомянутое уже имеет преимущество высокой помехозащищенности без какого-либо экранирования. И это может дать вам высокоскоростную связь на расстоянии более 100 м. Но вот вам еще одна хитрость - шина CAN может работать при напряжении 3,3 В с той же скоростью и надежностью, что и при напряжении 5 В, при этом снижая энергопотребление более чем на 50%. Я думаю, это оправдывает более пристальное внимание к вашему приложению.
В этой заметке NXP описываются методы увеличения длины шинной системы I2C до более чем 300 м при скорости 60 кбит/с, AN11084 . Решения включают в себя витые линии, повторители PCA9605 и логику генерации задержки на каждом ведомом устройстве. Удачи.
Я также предлагаю посмотреть на это . https://en.m.wikipedia.org/wiki/Низковольтный_дифференциальный_сигнал
Он невосприимчив к синфазному шуму, не зависит от заземления, а также легко работает в течение нескольких десятков метров, обеспечивая при этом высокую скорость передачи данных по сравнению со стандартом I2C.
Если вы можете предоставить схему или блок-схему предполагаемого соединения, можно разработать лучшую схему для дальнейшего снижения энергопотребления.
M LVDS (multi LVDS) может быть подходящим кандидатом. Вы можете использовать отдельные каналы для часов и данных I2C.
Линия данных является двунаправленной, но ее можно обрабатывать с помощью арбитража.
Ник Алексеев
Але..ченски
Тони Стюарт EE75
ЭтоПравыйДжек
Клен
ЭтоПравыйДжек
Клен
Клен
Клен