Dla niecierpliwych możesz pominąć tło.
tło
Programuję zestaw mikrokontrolerów, które komunikują się z SPI. Jest jeden pan i n
niewolnicy, którzy dzielą autobus. Nie ma wyboru chipa. (To nie jest zły projekt, ale n
jest duży i nie ma wystarczająco dużo miejsca na n
dodatkowe 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ć
Okazało się, że staje się OR z logiką ujemno-prawdziwą (w zasadzie AND).
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.
źródło
Odpowiedzi:
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.
źródło
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ł.
źródło
Aby przewodowa i magistrala działała, węzły na magistrali muszą być otwarte, tzn. Muszą transmitować
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.
źródło
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,
źródło