Для нетерплячих можна пропустити фон.
Фон
Я програмую набір мікроконтролерів, які спілкуються з SPI. Є один господар і n
раби, які поділяють автобус. Вибір мікросхеми немає. (Це не поганий дизайн, але n
він великий і не вистачає місця для n
додаткових ліній).
Тому відповідальність рабів утримувати MISO у високому опорі і, принаймні, один з них говорить. Це робиться, відповідаючи лише тоді, коли їх ідентифікатор опитується.
Тепер ми хотіли б здійснити початкову фазу відкриття, коли майстер виявляє рабів із тим, які ідентифікатори додаються до нього. Щоб полегшити життя (з деяких аспектів), ми хотіли б, щоб ідентифікатор був унікальним (і, наприклад, 32 біти). Це робить неможливим для майстра просто опитувати ідентифікатори один за одним і бачити, хто відповідає (можливостей занадто багато).
Щоб вирішити цю проблему, я розробив варіант бінарного пошуку, коли раби спільно реагують і господар може швидко знайти мінімальний ідентифікатор. Веденому з цим ідентифікатором говорять більше не брати участь, і алгоритм повторюється. (Деталі неважливі).
Однак є одна проблема. Колективна відповідь повинна бути логічним АБО (або логічним І) усіх відповідей. Мені сказали, що лінія може бути налаштована таким чином, що шина MISO може діяти як логічний АБО. Що мені сказали:
- Встановіть MISO на master як Pull-up і
- Встановіть MISO на кожного раба як Open-drain.
Я спробував це, але навіть при одному підлеглому ця конфігурація не працює (осцилограф показує постійний нуль на лінії). Якщо я налаштував MISO на ведучому як вхід з високим імпедансом, я можу за допомогою осцилографа побачити, що напруга падає вдвічі, коли біти виходів з двох невільників відрізняються (в основному я припускаю, що це коротке замикання).
Примітка: конфігуруючи MISO на master як високий імпеданс, і підлеглі кожен, як push-pull, я можу поговорити з кожним з них окремо, навіть якщо їх багато в одній шині. Я маю на увазі, я сумніваюся, що це проблема самої лінії.
Питання
Моє запитання: якщо це взагалі можливо, і якщо так, то як я можу налаштувати вхідні та вихідні шпильки головного та ведучого, щоб спільна лінія MISO діяла як логічне АБО (або логічне І)?
Редагувати
Виявилося, це АБО з негативно-істинною логікою (в основному, І).
Проблема з одним веденим була вирішена записом 1 на підтягувальний штифт на ведучому. Раніше він мав початковий стан 0.
Редагувати 2
Виявилося, що підлеглий ST переосмислює мою конфігурацію MISO GPIO як відкриту зливу і змушує її високо, коли пишеться. Я вирішив замовити SPI та вивести MISO в цьому конкретному випадку вручну.