Заставить общий автобус действовать как ИЛИ


10

Для нетерпеливых можно пропустить фон.

Задний план

Я программирую набор микроконтроллеров, которые взаимодействуют с SPI. Есть один хозяин и nраб, которые делят автобус. Там нет выбора чипа. (Это неплохой дизайн, но nон большой и не хватает места для nдополнительных строк).

Поэтому ответственность за то, чтобы их MISO находились под высоким импедансом, - это обязанность рабов, и самое большее один из них говорит. Это делается путем ответа только тогда, когда их идентификатор опрошен.

Теперь мы хотели бы иметь начальную фазу обнаружения, когда мастер обнаруживает рабов с помощью того, какие идентификаторы прикреплены к нему. Чтобы упростить жизнь (в некоторых аспектах), мы бы хотели, чтобы идентификатор был уникальным (и, следовательно, например, 32-битным). Это делает для мастера невозможным просто опрашивать идентификаторы один за другим и видеть, кто отвечает (слишком много возможностей).

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

Хотя есть одна проблема. Коллективный ответ должен быть логическим ИЛИ (или логическим И) всех ответов. Мне сказали, что линия может быть настроена таким образом, что шина MISO может действовать как логическое ИЛИ. То, что мне сказали, это:

  • Установите MISO на master в качестве Pull-up и
  • Установите MISO на каждого раба как Open-Drain.

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

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

Вопрос

У меня вопрос, если это вообще возможно, и если да, то как я могу настроить входные и выходные контакты главного и подчиненного устройств, чтобы общая линия MISO действовала как логическое ИЛИ (или логическое И)?


редактировать

  1. Оказалось, это становится ИЛИ с отрицательно-истинной логикой (в основном, И).

  2. Проблема с единственным ведомым устройством была решена с записью 1 на подтягивающий штифт на ведущем устройстве. Ранее он имел начальное состояние 0.

Редактировать 2

Оказалось, что ведомое устройство ST переопределяет мою конфигурацию GPIS MISO как открытый канал и форсировало его при записи. Я решил отключить SPI и вывести MISO в этом конкретном случае вручную.


Я не хотел бы спрашивать, потому что я уверен, что вы думали об этом, но вы рассматривали возможность использования I2C или CAN? Они предназначены для n устройств, тогда как SPI действительно предназначен для использования с микросхемой для каждого устройства.
Боб

@ Боб, да. Они слишком медленные. В любом случае, если ответ на мой вопрос «это невозможно», то нам просто нужно немного поработать вручную, но все же конечный продукт намного лучше с SPI.
Шахбаз

1
Жаль, что в качестве адреса вы используете 32 бита, потому что если бы вы использовали 24 бита (16 772 216 вариаций), вы могли бы отправить команду «обнаружить» и подождать 16 772 216 часов, и у вас могла бы быть вся ваша ведомая информация. На скорости 10 Мбит / с это займет не более 2 секунд, и никаких столкновений выяснить не придется. Эй, хо - ты заставил меня так думать +1 за это.
Энди ака

@ Andyaka, 24 бита тоже могут быть неплохими (но 32 бита, конечно, лучше). если я вас правильно понял, вы имеете в виду, что каждый раб отвечает на свои часы цифрой 1, а мастер смотрит, какие часы сгенерировали единицу? Это неплохо, кроме того, что рабы отвечают байтами. Таким образом, каждый подчиненный отвечает 8 битами, и если я не могу заставить шину действовать как ИЛИ, ответ одного ведомого все равно «теряется» в ответах другого ведомого (1 от одного ведомого сбрасывается на 0 из всех отдых).
Шахбаз

@Shahbaz, если у вас есть контроль над кодом ведомого, вы можете сделать это «особенным», когда подчиненное отвечает только 1 битом в назначенное время. Да, вы поняли суть моих размышлений.
Энди ака

Ответы:


5

Ваш SPI-без-выбора - это то, что Microchip использует на своих чипах MCP23017 (и других). Ничего плохого в этом подходе.

Да, то, что вы хотите, возможно, но вы должны заставить рабов быть открытыми. Вы можете обмануть, поместив (диод Шоттки) последовательно с каждым выходом, если вы не можете заставить их вести себя как открытый сток.

Ваш подход к перечислению такой же, какой используется однопроводной шиной Далласа для перечисления и шиной CAN для арбитража.

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

Если у вас есть два контакта, которые можно сэкономить на каждом ведомом устройстве, вы можете их последовательно соединить, и у вас есть схема перечисления, основанная на их месте в цепочке.


Да, я забыл упомянуть, мне также сказали, что мне нужно снизить скорость (что я сделал примерно в 20 раз (с 4 Мбит / с до 128 Кбит / с)). Это начальная фаза, и мой алгоритм может работать с более медленной скоростью (она все еще довольно быстрая). К сожалению, я сомневаюсь, что мы изменили оборудование сейчас. Стоимость - это больше, чем просто игнорирование этой фазы и указание мастеру, чего ожидать.
Шахбаз

Возвращаясь к вопросу, я уже настроил рабов как открытый сток. Как мне настроить мастер?
Шахбаз

1
Ничего особенного в булавке MISO мастера, кроме подтягивания. Я сомневаюсь, что вы достигнете 128Kbps с подтягивающим дизайном, но YMMV. Чтение некоторых подробных документов I2C может помочь, например, проводная или подтягивающая шина, поэтому каждый трюк, который там применяется, может вам помочь.
Воутер ван Оойен

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

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

4
  • Установите MISO на master в качестве Pull-up и
  • Установите MISO на каждого раба как Open-Drain.

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

Вам необходимо проверить, каково эквивалентное сопротивление главного вывода ввода / вывода в режиме подтягивания.

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

Как указал Ваутер, в шине с открытым стоком скорость ограничена подтягивающим резистором. Более высокие значения резистора замедляют шину. Типичные значения в I2C (который получает 100 или 400 кГц) составляют от 1 до 5 кОм. Вам потребуется аналогичное сопротивление подтягиванию, чтобы достичь аналогичной скорости.

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


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

Если у вас есть один свободный вывод ввода / вывода на главном микро, вы можете подключить его к шине, скажем, через 5 кОм. Затем увеличьте его во время перечисления шины и включите высокий Z во время обычной связи.
Фотон

1

Для того чтобы проводная и шина работали, узлы на шине должны быть с открытым стоком, то есть они должны передавать

  • логика низкая, сильно потянув вниз, и
  • логика высока путем отключения от шины.

Кроме того, автобус должен быть подтянут слабо.

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

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

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


Извините за мое невежество в электронике, но если раб сильно срывается, разве это не заставляет автобус действовать как AND? Я говорю, потому что рабы, которые хотят высокого, разъединяются, а те, которые хотят низкого, рушатся, так что общий результат снижается, нет?
Шахбаз

@ Shahbaz, мой плохой, конечно, автобус будет проводным, и я исправил ответ. Если вы хотите использовать проводную связь, или просто поменяйте полярность (мастер слабо опускается, рабы сильно вытягиваются).
Авакар

Читая википедию, я понял, что они называют ее проводной и / или проводной или с отрицательно-истинной логикой.
Шахбаз

1

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


Если два раба активно ездят высоко и низко, что мне ожидать от автобуса?
Шахбаз

Следует избегать того, чтобы один раб пытался двигаться высоко, а другой - низко. Раб должен ездить на автобусе только тогда, когда (1) он знает, что это будет единственное, что делает это, или (2) он знает, что он и все остальные, кто управляет автобусом, будут вести его к противоположности его пассивного холостого хода. штат.
суперкат

Что это значит тогда? ... активная работа каждого выбранного ведомого устройства на высоких и низких уровнях позволит шине ...
Шахбаз

@Shahbaz: Когда ведомый хочет что-то сказать, он должен активно увеличивать шину, чтобы передавать биты «1», и низкий, чтобы передавать биты «0». Когда рабу нечего сказать, он вообще не должен водить автобус. Обратите внимание, что наличие ведомых устройств, активно активирующих шину на высоком уровне, когда они хотят отправить биты «1», позволит шине работать намного быстрее, чем при пассивном повышении, чтобы повысить шину.
суперкат

@Shahbaz: То, что пытается сказать суперкат, это то, что в состоянии перечисления резистор должен подтягивать линию, а ведомые должны только посылать «0» или ничего (выход с открытым стоком), но впоследствии, при нормальном обмене данными, только один подчиненный должен быть активным одновременно, а активный подчиненный должен отправлять «0» или «1» (нормальный выход). Таким образом, подтягивающий резистор и емкость линии ограничивают скорость передачи только во время перечисления. После этого при обычной связи скорость передачи может быть выше, что позволяет активное вождение.
Ласло Валько,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.