Sprawiając, że wspólny autobus działa jak OR

10

Dla niecierpliwych możesz pominąć tło.

tło

Programuję zestaw mikrokontrolerów, które komunikują się z SPI. Jest jeden pan i nniewolnicy, którzy dzielą autobus. Nie ma wyboru chipa. (To nie jest zły projekt, ale njest duży i nie ma wystarczająco dużo miejsca na ndodatkowe linie).

Dlatego obowiązkiem niewolników jest utrzymywanie MISO w wysokiej impedancji i co najwyżej jedno z nich mówi. Odbywa się to poprzez odpowiadanie tylko wtedy, gdy odpytywany jest ich identyfikator.

Chcielibyśmy teraz mieć wstępną fazę odkrywania, w której mistrz odkrywa niewolników z dołączonymi do nich identyfikatorami. Aby ułatwić życie (w niektórych aspektach), chcielibyśmy mieć unikalny identyfikator (a więc np. 32 bity). To uniemożliwia mistrzowi po prostu sondowanie identyfikatorów jeden po drugim i sprawdzanie, kto odpowiada (istnieje zbyt wiele możliwości).

Aby rozwiązać ten problem, opracowałem odmianę wyszukiwania binarnego, w której niewolnicy wspólnie reagują, a mistrz jest w stanie szybko znaleźć minimalny identyfikator. Sługa o tym identyfikatorze nie jest już uczestnikiem, a algorytm się powtarza. (Szczegóły nieważne).

Jest jednak jeden problem. Zbiorowa odpowiedź musi być logiczną OR (lub logiczną AND) wszystkich odpowiedzi. Powiedziano mi, że linię można skonfigurować w taki sposób, aby magistrala MISO mogła działać jako logiczna operacja OR. Powiedziano mi:

  • Ustaw MISO na urządzeniu głównym jako Pull-up i
  • Ustaw MISO na każdym slave jako Open-drain.

Próbowałem tego, ale nawet z jednym slave, ta konfiguracja nie działa (oscyloskop pokazuje stałe zero na linii). Jeśli skonfiguruję MISO na module głównym jako wejście o wysokiej impedancji, za pomocą oscyloskopu widzę, że napięcie spada do połowy, w których bity wyjść z dwóch urządzeń podrzędnych różnią się (w zasadzie przypuszczam, że zwarcie).

Uwaga: konfigurując MISO na master jako wysokiej impedancji i slaveach jako push-pull, mogę rozmawiać z każdym z nich osobno, nawet jeśli jest ich wiele na tej samej magistrali. Wątpię, czy to problem samej linii.

Pytanie

Moje pytanie brzmi, czy jest to w ogóle możliwe, a jeśli tak, to w jaki sposób mogę skonfigurować styki wejściowe i wyjściowe urządzenia nadrzędnego i urządzeń podrzędnych, aby wspólna linia MISO działała jak logiczne OR (lub logiczne AND)?


Edytować

  1. Okazało się, że staje się OR z logiką ujemno-prawdziwą (w zasadzie AND).

  2. Problem z pojedynczym urządzeniem podrzędnym został rozwiązany przez zapisanie 1 do kołka podciągającego w urządzeniu nadrzędnym. Wcześniej miał stan początkowy 0.

Edytuj 2

Okazało się, że niewolnik ST zastępuje moją konfigurację MISO GPIO jako otwartego i wymuszał jej wysoką wartość, gdy jedna została napisana. W tym konkretnym przypadku postanowiłem ręcznie wyciszyć SPI i wyprowadzić MISO.

Shahbaz
źródło
Nie chciałbym pytać, bo jestem pewien, że o tym pomyślałeś, ale czy zastanawiałeś się nad użyciem I2C lub CAN? Są zaprojektowane dla n urządzeń, podczas gdy SPI jest naprawdę zaprojektowany do użycia z wyborem układu dla każdego urządzenia.
Bob
@ Bob, tak. Są za wolne. W każdym razie, jeśli odpowiedź na moje pytanie brzmi „to niemożliwe”, to musielibyśmy po prostu wykonać trochę pracy ręcznej, ale produkt końcowy jest o wiele lepszy dzięki SPI.
Shahbaz
1
Szkoda, że ​​używasz 32 bitów jako adresu, ponieważ jeśli używasz 24 bitów (16 772 216 odmian), możesz wysłać polecenie „odkryj” i poczekać 16 772 216 zegarów, a możesz mieć wszystkie swoje informacje o niewolnikach. Przy 10 Mb / s zajęłoby to mniej niż 2 sekundy i nie doszło do żadnych starć. Hej ho - zmusiłeś mnie do myślenia o +1 za to.
Andy alias
@Andyaka, 24 bity mogą również nie być złe (ale 32 bity są z pewnością lepsze). jeśli dobrze cię zrozumiałem, masz na myśli, że każdy niewolnik odpowiada na swój id-ty zegar 1, a mistrz patrzy, które zegary wygenerowały jeden? To nie jest złe, tyle że niewolnicy odpowiadają w bajtach. Tak więc każdy slave odpowiada 8 bitami i jeśli nie mogę sprawić, by magistrala działała jak OR, nadal odpowiedź jednego slave'a zostanie „zagubiona” w odpowiedziach drugiego slave'a (1 z jednego slave'a zostanie ściągnięty przez 0 od wszystkich reszta).
Shahbaz
@Shahbaz, jeśli masz kontrolę nad kodem urządzenia podrzędnego, możesz uczynić go „specjalnym”, w którym urządzenie podrzędne odpowiada tylko 1 bitem w przydzielonym czasie. Tak, masz sedno moich rozmyślań.
Andy alias

Odpowiedzi:

5

Twój SPI-bez-wyboru jest tym, co Microchip wykorzystuje na swoich układach MCP23017 (i innych). Nic złego w tym podejściu.

Tak, to, czego chcesz, jest możliwe, ale musisz doprowadzić niewolników do otwartego drenażu. Możesz oszukiwać, umieszczając (schottky) diodę szeregowo z każdym wyjściem, jeśli nie możesz sprawić, by zachowywały się jak otwarte dreny.

Twoje podejście do wyliczania jest takie samo, jak stosowane przez jednoprzewodową magistralę Dallas do enumereacji i przez magistralę CAN do arbitrażu.

Ale poważną wadą twojego podejścia jest to, że prędkość jest teraz ograniczona przez czas narastania, napędzany przez rezystor podciągający. Będzie to wolniejsze niż w przypadku napędu push-pull i prawdopodobnie ograniczy prędkość, z jaką można obsługiwać magistralę.

Jeśli masz dwa piny do każdego niewolnika, możesz je połączyć szeregowo i mieć schemat wyliczania oparty na ich miejscu w łańcuchu.

Wouter van Ooijen
źródło
Tak, zapomniałem wspomnieć, że powiedziano mi również, że muszę zmniejszyć prędkość (co zrobiłem około 20-krotnie (z 4 Mb / s do 128 Kb / s)). Jest to jednak faza początkowa, a mój algorytm radzi sobie z wolniejszą prędkością (wciąż dość szybką). Niestety wątpię, abyśmy teraz przeprojektowali sprzęt. Koszt to coś więcej niż po prostu zignorowanie tej fazy i poinformowanie mistrza, czego mogą się spodziewać.
Shahbaz
Wracając do pytania, skonfigurowałem już niewolników jako otwarty odpływ. Jak mam skonfigurować master?
Shahbaz
1
Nic szczególnego na szpilce MISO mistrza, z wyjątkiem podciągania. Wątpię, czy osiągniesz 128 Kb / s dzięki konstrukcji pull-up, ale YMMV. Pomocne może być przeczytanie niektórych szczegółowych dokumentów I2C, tj. Magistrali kablowej lub podciąganej, więc każda zastosowana tam sztuczka może ci pomóc.
Wouter van Ooijen
Wielkie dzięki. Spróbuję jeszcze bardziej spowolnić autobus, aby zobaczyć, co się stanie. Chyba muszę w końcu przestudiować i zrozumieć, co tak naprawdę oznaczają te podciągnięcia, otwarty odpływ i inne. (Inżynier oprogramowania tutaj!)
Shahbaz
1
Umieść oscyloskop w autobusie i sprawdź, co się stanie. Czas narastania może być zbyt wolny, ale może również dzwonić.
Wouter van Ooijen
4
  • Ustaw MISO na urządzeniu głównym jako Pull-up i
  • Ustaw MISO na każdym slave jako Open-drain.

Próbowałem tego, ale nawet z jednym slave, ta konfiguracja nie działa (oscyloskop pokazuje stałe zero na linii).

Musisz sprawdzić, jaka jest równoważna rezystancja głównego styku we / wy w trybie pull-up.

Zazwyczaj tryb podciągania ma bardzo wysoką rezystancję, może 50 kOhm lub wyższą. Jego celem jest zapobieganie usterkom pinów spowodowanym przez emi lub inne zakłócenia, lub ustawienie domyślne dla bardzo wolnych sygnałów sterujących, a jednocześnie nie marnowanie zbyt dużej mocy na to.

Jak wskazał Wouter, w szynie z otwartym odpływem prędkość jest ograniczana przez rezystor podciągający. Wyższe wartości rezystorów powodują spowolnienie magistrali. Typowe wartości w I2C (które otrzymuje 100 lub 400 kHz) wynoszą od 1 do 5 kOhm. Będziesz potrzebował podobnego oporu do podciągania, aby osiągnąć podobną prędkość.

Myślę, że musisz użyć zewnętrznego rezystora podciągającego (od około 1 do 5 kOhm) zamiast podciągania pinów we / wy master, aby ten schemat działał.

The Photon
źródło
Dzięki za podpowiedzi. Nie jestem facetem od elektroniki, ale musiałbym poprosić mojego współpracownika o zapoznanie się z twoją sugestią. Potrzebuję przewodowej lub tylko do początkowej fazy programu, aw normalnej fazie pin nie jest skonfigurowany jako pull-up. Prawdopodobnie więc zewnętrzny rezystor nie wchodzi w grę.
Shahbaz
Jeśli masz jeden wolny pin we / wy na master micro, możesz podłączyć go do magistrali przez, powiedzmy, 5 kiloomów. Następnie ustaw go na wysoki podczas wyliczania magistrali i ustaw na wysoki Z podczas normalnej komunikacji.
Photon
1

Aby przewodowa i magistrala działała, węzły na magistrali muszą być otwarte, tzn. Muszą transmitować

  • niski poziom logiki poprzez silne pociągnięcie w dół, oraz
  • wysoki poziom logiki poprzez odłączenie od magistrali.

Ponadto autobus musi być słabo zatrzymany.

Szczególne zachowanie, które można zaobserwować w przypadku pojedynczego nieprzenoszącego się mistrza i pojedynczego nadrzędnego nadajnika, można wyjaśnić albo przez silnego podciągania, albo przez niewolnika słabego w dół.

Musisz ustalić, które z powyższych zdarzeń się dzieje.

Przełącz urządzenie slave w tryb wysokiej impedancji i podłącz magistralę do uziemienia za pomocą rezystora 10k. Jeśli napięcie sieciowe nie zmienia się znacząco, oznacza to, że mistrz mocno podciąga i trzeba to naprawić. W przeciwnym razie wykonaj tę samą procedurę z urządzeniem slave (tym razem podłącz rezystor do Vcc); jeśli napięcie sieciowe znacznie wzrośnie, slave słabo się obniża (napraw to). W przeciwnym razie poszukaj zniekształceń czasoprzestrzennych w obszarze wokół ciebie.

avakar
źródło
Przepraszam za moją niewiedzę w dziedzinie elektroniki, ale jeśli niewolnik mocno pociągnie w dół, czy to nie powoduje, że autobus działa jak AND? Mówię, ponieważ niewolnicy, którzy chcą wysokiego, rozłączają się, a ci, którzy chcą niskiego, zmniejszają się, więc ogólny wynik jest w dół, nie?
Shahbaz
@Shahbaz, mój zły, oczywiście autobus zostanie okablowany - i naprawiłem odpowiedź. Jeśli chcesz podłączyć lub po prostu odwróć polaryzację (mistrz słabo ciągnie, niewolnicy silnie podciągają).
avakar
Czytając wikipedię, zdałem sobie sprawę, że nazywają ją przewodową i przewodową lub z logiką negatywną.
Shahbaz
1

Sugerowałbym pasywne podciąganie lub zrywanie w autobusie (zakładam, że jest to podciąganie) i posiadanie niewolników aktywnie jeżdżących autobusem (jadących wysoko i jadących nisko), kiedy mają coś do powiedzenia i pływają inaczej . Polecenia kwerendy-adresu, które pobierają adres i maskę, i instruują każdego niewolnika, aby wyprowadził 00 lub nic nie robił (kontynuuj przesyłanie danych wyjściowych) w zależności od tego, czy podoba mu się adres i maska. Jeśli to możliwe, poproś mistrza, aby aktywnie podniósł autobus na jakiś czas, zanim niewolnicy zaczną go prowadzić. W zależności od siły podciągania i tego, czy master napędza magistralę wysoko, zanim urządzenia podrzędne będą mogły pociągnąć ją nisko, konieczne może być ograniczenie prędkości magistrali podczas fazy konfiguracji. Z drugiej strony, po zakończeniu instalacji,

supercat
źródło
Jeśli dwóch niewolników aktywnie jeździ wysoko i nisko, co mam odczytać z autobusu?
Shahbaz
Należy unikać sytuacji, w której jeden niewolnik próbuje jechać wysoko, podczas gdy inny jedzie nisko. Niewolnik powinien prowadzić autobus tylko wtedy, gdy (1) wie, że będzie to jedyna rzecz, lub (2) wie, że on i wszyscy inni, którzy prowadzą autobus, będą jechać na przeciwną stronę niż pasywny bieg jałowy stan.
supercat
Co to znaczy? ... mając każdego wybranego niewolnika aktywnie prowadzącego zarówno wysokie, jak i niskie poziomy, pozwoli autobusowi na ...
Shahbaz 26.09.13
@Shahbaz: Gdy slave ma coś do powiedzenia, powinien aktywnie prowadzić magistralę, aby przesłać bity „1”, a niski, aby przesłać bity „0”. Kiedy niewolnik nie ma nic do powiedzenia, nie powinien w ogóle prowadzić autobusu. Zauważ, że posiadanie niewolników aktywnie napędza magistralę wysoko, gdy chcą wysłać bity „1”, pozwoli autobusowi działać znacznie szybciej, niż polegałby na pasywnym podciąganiu do napędzania magistrali wysoko.
supercat
@Shahbaz: Supercat próbuje powiedzieć, że w stanie wyliczenia rezystor powinien podciągnąć linię, a niewolnicy powinni wysyłać tylko „0” lub nic (wyjście z otwartym odpływem), ale później, w normalnej komunikacji, tylko pojedynczy slave powinien być aktywny na raz, a aktywny slave powinien wysyłać „0” lub „1” (normalne wyjście). Tak więc rezystor podciągający i pojemność linii ograniczają jedynie przepływność podczas zliczania. Następnie, w normalnej komunikacji, przepływność może być wyższa, na ile pozwala aktywna jazda.
Laszlo Valko,