Für die Ungeduldigen können Sie den Hintergrund überspringen.
Hintergrund
Ich programmiere eine Reihe von Mikrocontrollern, die mit SPI kommunizieren. Es gibt einen Master und nSlaves, die sich den Bus teilen. Es gibt keine Chipauswahl. (Es ist kein schlechtes Design, aber ngroß und es gibt nicht genug Platz für nzusätzliche Linien).
Es liegt daher in der Verantwortung der Sklaven, ihr MISO in hoher Impedanz zu halten und höchstens einer von ihnen spricht. Dies erfolgt, indem nur geantwortet wird, wenn ihre ID abgefragt wird.
Jetzt möchten wir eine erste Erkennungsphase haben, in der der Master Slaves mit den damit verbundenen IDs erkennt. Um das Leben (in einigen Aspekten) einfacher zu machen, möchten wir, dass die ID eindeutig ist (und daher z. B. 32 Bit). Dies macht es dem Master unmöglich, die IDs einfach einzeln abzufragen und zu sehen, wer antwortet (es gibt zu viele Möglichkeiten).
Um dieses Problem zu lösen, habe ich eine Variante der binären Suche entwickelt, bei der die Slaves gemeinsam antworten und der Master die minimale ID schnell finden kann. Der Slave mit dieser ID wird angewiesen, nicht mehr teilzunehmen, und der Algorithmus wird wiederholt. (Details unwichtig).
Es gibt jedoch ein Problem. Die kollektive Antwort muss das logische ODER (oder logische UND) aller Antworten sein. Mir wurde gesagt, dass die Leitung so konfiguriert werden kann, dass der MISO-Bus als logisches ODER fungieren kann. Was mir gesagt wurde ist:
- Stellen Sie MISO am Master als Pull-up und ein
- Stellen Sie MISO auf jedem Slave als Open-Drain ein.
Ich habe es versucht, aber mit nur einem einzigen Slave funktioniert diese Konfiguration nicht (das Oszilloskop zeigt eine konstante Null auf der Leitung). Wenn ich MISO am Master als hochohmigen Eingang konfiguriere, kann ich mit dem Oszilloskop sehen, dass die Spannung auf die Hälfte abfällt, wenn sich die Bits der Ausgänge von zwei Slaves unterscheiden (im Grunde genommen nehme ich einen Kurzschluss an).
Hinweis: Wenn Sie MISO auf dem Master als hochohmig und Slaves als Push-Pull konfigurieren, kann ich mit jedem einzeln sprechen, auch wenn sich viele von ihnen auf demselben Bus befinden. Ich meine, ich bezweifle, dass es ein Problem der Leitung selbst ist.
Frage
Meine Frage ist, ob dies überhaupt möglich ist und wenn ja, wie kann ich die Eingangs- und Ausgangspins des Masters und der Slaves so konfigurieren, dass die gemeinsam genutzte MISO-Leitung als logisches ODER (oder logisches UND) fungiert?
Bearbeiten
Es stellte sich heraus, dass es ein ODER mit negativ-wahrer Logik wird (im Grunde ein UND).
Das Problem mit einem einzelnen Slave wurde behoben, indem 1 in den Pull-up-Pin des Masters geschrieben wurde. Zuvor hatte es einen Anfangszustand von 0.
Bearbeiten 2
Es stellte sich heraus, dass der ST-Slave meine GPIO-Konfiguration von MISO als Open-Drain überschreibt und sie beim Schreiben auf High erzwingt. Ich habe mich entschlossen, SPI zum Schweigen zu bringen und MISO in diesem speziellen Fall manuell auszugeben.