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ć
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.