Для нетерпеливых можно пропустить фон.
Задний план
Я программирую набор микроконтроллеров, которые взаимодействуют с SPI. Есть один хозяин и n
раб, которые делят автобус. Там нет выбора чипа. (Это неплохой дизайн, но n
он большой и не хватает места для n
дополнительных строк).
Поэтому ответственность за то, чтобы их MISO находились под высоким импедансом, - это обязанность рабов, и самое большее один из них говорит. Это делается путем ответа только тогда, когда их идентификатор опрошен.
Теперь мы хотели бы иметь начальную фазу обнаружения, когда мастер обнаруживает рабов с помощью того, какие идентификаторы прикреплены к нему. Чтобы упростить жизнь (в некоторых аспектах), мы бы хотели, чтобы идентификатор был уникальным (и, следовательно, например, 32-битным). Это делает для мастера невозможным просто опрашивать идентификаторы один за другим и видеть, кто отвечает (слишком много возможностей).
Чтобы решить эту проблему, я разработал вариант бинарного поиска, где подчиненные коллективно отвечают, и мастер может быстро найти минимальный идентификатор. Ведомому с таким идентификатором говорят, что он больше не участвует, и алгоритм повторяется. (Подробности неважные).
Хотя есть одна проблема. Коллективный ответ должен быть логическим ИЛИ (или логическим И) всех ответов. Мне сказали, что линия может быть настроена таким образом, что шина MISO может действовать как логическое ИЛИ. То, что мне сказали, это:
- Установите MISO на master в качестве Pull-up и
- Установите MISO на каждого раба как Open-Drain.
Я пробовал это, но даже с одним ведомым устройством эта конфигурация не работает (осциллограф показывает постоянный ноль на линии). Если я сконфигурирую MISO на ведущем устройстве как вход с высоким импедансом, то с помощью осциллографа я могу видеть, что напряжение падает до половины там, где биты выходов от двух ведомых устройств различаются (в основном короткое замыкание, которое я предполагаю).
Примечание: конфигурируя MISO на ведущем устройстве как высокоимпедансный, а подчиненные - как двухтактный, я могу говорить с каждым из них по отдельности, даже если их много на одной шине. Я имею в виду, я сомневаюсь, что это проблема самой линии.
Вопрос
У меня вопрос, если это вообще возможно, и если да, то как я могу настроить входные и выходные контакты главного и подчиненного устройств, чтобы общая линия MISO действовала как логическое ИЛИ (или логическое И)?
редактировать
Оказалось, это становится ИЛИ с отрицательно-истинной логикой (в основном, И).
Проблема с единственным ведомым устройством была решена с записью 1 на подтягивающий штифт на ведущем устройстве. Ранее он имел начальное состояние 0.
Редактировать 2
Оказалось, что ведомое устройство ST переопределяет мою конфигурацию GPIS MISO как открытый канал и форсировало его при записи. Я решил отключить SPI и вывести MISO в этом конкретном случае вручную.
источник
Ответы:
Ваш SPI-без-выбора - это то, что Microchip использует на своих чипах MCP23017 (и других). Ничего плохого в этом подходе.
Да, то, что вы хотите, возможно, но вы должны заставить рабов быть открытыми. Вы можете обмануть, поместив (диод Шоттки) последовательно с каждым выходом, если вы не можете заставить их вести себя как открытый сток.
Ваш подход к перечислению такой же, какой используется однопроводной шиной Далласа для перечисления и шиной CAN для арбитража.
Но серьезным недостатком вашего подхода является то, что скорость теперь ограничена временем нарастания, обусловленным нагрузочным резистором. Это будет медленнее, чем при использовании двухтактного выхода, и, скорее всего, ограничит скорость, с которой вы можете управлять шиной.
Если у вас есть два контакта, которые можно сэкономить на каждом ведомом устройстве, вы можете их последовательно соединить, и у вас есть схема перечисления, основанная на их месте в цепочке.
источник
Вам необходимо проверить, каково эквивалентное сопротивление главного вывода ввода / вывода в режиме подтягивания.
Как правило, подтягивающий режим имеет очень высокое сопротивление, может быть 50 кОм или выше. Он предназначен для предотвращения сбоев на выводе из-за электромагнитного или другого шума или для установки значения по умолчанию для очень медленных сигналов управления, и в то же время не тратит слишком много энергии на это.
Как указал Ваутер, в шине с открытым стоком скорость ограничена подтягивающим резистором. Более высокие значения резистора замедляют шину. Типичные значения в I2C (который получает 100 или 400 кГц) составляют от 1 до 5 кОм. Вам потребуется аналогичное сопротивление подтягиванию, чтобы достичь аналогичной скорости.
Я думаю, что вам нужно использовать внешний подтягивающий резистор (от 1 до 5 кОм или около того), а не подтягивание выводов ввода / вывода мастера, чтобы эта схема работала.
источник
Для того чтобы проводная и шина работали, узлы на шине должны быть с открытым стоком, то есть они должны передавать
Кроме того, автобус должен быть подтянут слабо.
Своеобразное поведение, которое вы видите с одним непередающим ведущим и одним передающим ведомым, может быть объяснено либо сильным подтягиванием мастера, либо слабым падением ведомого.
Вам необходимо определить, что из перечисленного происходит.
Переведите подчиненное устройство в режим высокого сопротивления и подключите шину к земле через резистор 10 кОм. Если напряжение линии существенно не меняется, то мастер сильно напрягается, и вам нужно это исправить. В противном случае выполните ту же процедуру с подчиненным устройством (на этот раз подключите резистор к Vcc); если напряжение в линии значительно возрастает, ведомое устройство слабо тянет (исправьте это). В противном случае ищите пространственно-временные искажения в области вокруг вас.
источник
Я бы посоветовал иметь пассивное подтягивание или опускание в автобусе (я предполагаю, что подтягивание), и чтобы рабы активно водили автобус (двигаясь высоко и низко), когда им есть что сказать, и плавать в противном случае , Иметь команды запроса адреса, которые принимают адрес и маску, и инструктируют каждого ведомого устройства выводить 00 или ничего не делать (продолжают выводить свои выходные данные) в зависимости от того, нравится ли ему адрес и маска. Если возможно, попросите мастера активно поднять автобус на некоторое время, прежде чем рабы начнут его водить. В зависимости от силы подтягивания и от того, управляет ли мастер высокой шиной, до того, как ведомым будет разрешено понижать ее, может потребоваться ограничение скорости шины на этапе настройки. С другой стороны, после завершения установки
источник