Для нетерпеливых можно пропустить фон.
Задний план
Я программирую набор микроконтроллеров, которые взаимодействуют с 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 в этом конкретном случае вручную.