Створення загальної шини виступає як АБО


10

Для нетерплячих можна пропустити фон.

Фон

Я програмую набір мікроконтролерів, які спілкуються з SPI. Є один господар і nраби, які поділяють автобус. Вибір мікросхеми немає. (Це не поганий дизайн, але nвін великий і не вистачає місця для nдодаткових ліній).

Тому відповідальність рабів утримувати MISO у високому опорі і, принаймні, один з них говорить. Це робиться, відповідаючи лише тоді, коли їх ідентифікатор опитується.

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

Щоб вирішити цю проблему, я розробив варіант бінарного пошуку, коли раби спільно реагують і господар може швидко знайти мінімальний ідентифікатор. Веденому з цим ідентифікатором говорять більше не брати участь, і алгоритм повторюється. (Деталі неважливі).

Однак є одна проблема. Колективна відповідь повинна бути логічним АБО (або логічним І) усіх відповідей. Мені сказали, що лінія може бути налаштована таким чином, що шина MISO може діяти як логічний АБО. Що мені сказали:

  • Встановіть MISO на master як Pull-up і
  • Встановіть MISO на кожного раба як Open-drain.

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

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

Питання

Моє запитання: якщо це взагалі можливо, і якщо так, то як я можу налаштувати вхідні та вихідні шпильки головного та ведучого, щоб спільна лінія MISO діяла як логічне АБО (або логічне І)?


Редагувати

  1. Виявилося, це АБО з негативно-істинною логікою (в основному, І).

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

Редагувати 2

Виявилося, що підлеглий ST переосмислює мою конфігурацію MISO GPIO як відкриту зливу і змушує її високо, коли пишеться. Я вирішив замовити SPI та вивести MISO в цьому конкретному випадку вручну.


Мені б не хотілося питати, тому що я впевнений, що ти це подумав, але ти думав про використання I2C чи CAN? Вони розроблені для n пристроїв, тоді як SPI дійсно призначений для використання з вибором мікросхем для кожного пристрою.
Боб

@bob, так. Вони занадто повільні. У будь-якому разі, якщо відповідь на моє запитання "неможливо", тоді нам просто треба було б виконати трохи ручної роботи, але все-таки кінцевий продукт значно кращий із 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 (та інших). Нічого поганого в цьому підході.

Так, те, що ви хочете, можливо, але ви повинні змусити рабів бути відкритими. Можна обдурити, поставивши послідовно діод (Шоткі) з кожним виходом, якщо ви не можете змусити їх поводитись як з відкритим стоком.

Ваш підхід до перерахування такий же, як використовується однопровідної шиною Dallas для перерахунку, а шиною CAN для арбітражу.

Але серйозним недоліком вашого підходу є те, що швидкість тепер обмежена часом підйому, керуючись підтягуючим резистором. Це буде повільніше, ніж коли керується виштовхувальним виходом, і, ймовірно, обмежить швидкість, з якою ви можете керувати шиною.

Якщо у вас є два штифта, щоб запасти на кожного раба, ви могли б зав'язати їх ланцюжками і створити схему перерахування, що базується на їхньому місці в ланцюжку ромашок.


Так, я забув згадати, мені також сказали, що мені потрібно знизити швидкість (що я зробив приблизно в 20 разів (вниз від 4 Мбіт до 128 Кбіт / с)). Це початкова фаза, але мій алгоритм може працювати з меншою швидкістю (це все ще досить швидко). На жаль, я сумніваюся, що ми переробили обладнання зараз. Вартість більше, ніж просто ігнорувати цю фазу і сказати майстру, що очікувати.
Шахбаз

Повернувшись до питання, я вже налаштував рабів як відкритих каналів. Як мені налаштувати майстер?
Шахбаз

1
Нічого особливого на майстер-штифті MISO, крім підтягування. Сумніваюсь, ви досягнете 128Kbps з підтяжним дизайном, але YMMV. Читання поглиблених документів I2C може допомогти, тобто шина проводки або підтягування, тому кожен застосований там трюк може допомогти вам.
Wouter van Ooijen

Дуже дякую. Я спробую ще більше уповільнити автобус, щоб побачити, що відбувається. Я думаю, що я маю нарешті вивчити та зрозуміти, що насправді означають ці підтяжки, відкриті зливи та інші. (Інженер-програміст тут!)
Шахбаз

1
Покладіть осцилограф в автобус і перевірте, що відбувається. Час підйому може бути надто повільним, але також може бути дзвінок.
Wouter van Ooijen

4
  • Встановіть MISO на master як Pull-up і
  • Встановіть MISO на кожного раба як Open-drain.

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

Потрібно перевірити, який еквівалентний опір головного штифта вводу-виводу в режимі підтягування.

Як правило, режим підтягування має дуже високий опір, можливо 50 кОм або більше. Він призначений для запобігання зблиску штифта через емі чи іншого шуму або встановлення за замовчуванням дуже повільних керуючих сигналів, і в той же час не витрачати на це занадто багато енергії.

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

Я думаю, що вам потрібно використовувати зовнішній резистор, що підтягується (від 1 до 5 кОм або більше), а не підтягування штифтів для вводу-виводу майстра для роботи цієї схеми.


Дякую за підказки. Я не хлопець з електроніки, але мені доведеться попросити свого колегу поглянути на вашу пропозицію. Мені потрібен провідний або лише для початкової фази програми, а в звичайній фазі штифт не налаштований як підтягування. Тому, ймовірно, зовнішній резистор - це не варіант.
Шахбаз

Якщо у вас є один вільний штифт вводу-виводу на головний мікрофон, ви можете підключити його до шини через, скажімо, 5 кОм. Потім поверніть його високо під час перерахунку шини та поверніть його на високий-Z під час звичайного спілкування.
The Photon

1

Для того, щоб провідна і шина працювала, вузли на шині потрібно бути відкритими, тобто вони повинні передавати

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

Крім того, автобус повинен бути слабко підтягнутий.

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

Вам потрібно визначити, що з вищезазначеного відбувається.

Покладіть підлеглий в режим високого опору і підключіть шину до землі за допомогою резистора 10 К. Якщо напруга лінії не змінюється істотно, то ведучий сильно підтягується і вам потрібно це виправити. В іншому випадку виконайте таку ж процедуру з веденим (на цей раз підключіть резистор до Vcc); якщо напруга в лінії значно підвищується, підлеглий слабко вниз (виправити це). В іншому випадку шукайте спотворення часу та простору в зоні навколо вас.


Вибачте моє незнання в електроніці, але якщо раб сильно тягнеться вниз, чи не змушує шина діяти як І? Я кажу, оскільки раби, які хочуть високого, відключаються, а ті, хто хоче низький, знижуються, тому загальний результат знижується, ні?
Шахбаз

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

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

1

Я б запропонував у автобусі пасивного підтягування або пониження (я вважаю, що підтягування), і раби активно керують автобусом (їздять високо і їздять низько), коли їм є що сказати, і пропливати його інакше . Майте команди запиту-адреси, яка приймає адресу та маску, і доручає кожному підлеглому виводити 00 або нічого не робити (продовжуйте плавати його вихід), залежно від того, чи подобається йому адреса та маска. Якщо це можливо, попросіть господаря активно заїхати в автобус за деякий час, перш ніж раби почнуть їздити на ньому. Залежно від сили підтягування та від того, чи ведучий веде шину високо, перш ніж підлеглі дозволять знизити її, може знадобитися обмежити швидкість шини під час фази налаштування. З іншого боку, після завершення налаштування,


Якщо двоє рабів активно їздять високо і низько, що я повинен прочитати з автобуса?
Шахбаз

Слід уникати того, щоб один раб намагався заїхати високо, а інший - з низьким. Раб повинен керувати автобусом лише тоді, коли або (1) він знає, що це буде єдине, що робить це, або (2) він знає, що він і всі інші, хто їде в автобусі, будуть їздити на протилежному пасивному простою держава.
supercat

Що це означає тоді? ... що кожен вибраний раб активно їздить як на високих, так і на низьких рівнях, дозволить автобусу ...
Шахбаз,

@Shahbaz: Коли підлеглому є що сказати, він повинен активно вести шину, щоб передати "1" біти і низько для передачі "0" біт. Коли у раба немає нічого сказати, він взагалі не повинен їздити на автобусі. Зауважте, що раби активно підводять шину високо, коли вони хочуть надіслати "1" біти, дозволять шині працювати набагато швидше, ніж покладатися на пасивне підтягування, щоб підняти шину високо.
supercat

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