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 n
Slaves, die sich den Bus teilen. Es gibt keine Chipauswahl. (Es ist kein schlechtes Design, aber n
groß und es gibt nicht genug Platz für n
zusä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.
quelle
Antworten:
Ihr SPI ohne Auswahl wird von Microchip für die MCP23017-Chips (und andere) verwendet. An diesem Ansatz ist nichts auszusetzen.
Ja, was Sie wollen, ist möglich, aber Sie müssen dafür sorgen, dass die Slaves offen sind. Sie könnten schummeln, indem Sie eine (Schottky-) Diode mit jedem Ausgang in Reihe schalten, wenn Sie nicht erreichen können, dass sie sich wie Open-Drain verhalten.
Ihr Aufzählungsansatz ist der gleiche wie der, den der Dallas One-Wire-Bus für die Aufzählung und der CAN-Bus für die Arbitrierung verwenden.
Ein schwerwiegender Nachteil Ihres Ansatzes ist jedoch, dass die Geschwindigkeit jetzt durch die Anstiegszeit begrenzt ist, die vom Pull-up-Widerstand angetrieben wird. Dies ist langsamer als bei einem Push-Pull-Ausgang und begrenzt wahrscheinlich die Geschwindigkeit, mit der Sie den Bus betreiben können.
Wenn Sie zwei Pins für jeden Slave übrig haben, können Sie sie verketten und ein Aufzählungsschema erstellen, das auf ihrem Platz in der Verkettung basiert.
quelle
Sie müssen überprüfen, wie hoch der äquivalente Widerstand des Master-E / A-Pins im Pull-up-Modus ist.
Typischerweise hat der Pull-up-Modus einen sehr hohen Widerstand, möglicherweise 50 kOhm oder höher. Es ist beabsichtigt, zu verhindern, dass der Pin aufgrund von EMI oder anderen Störungen fehlerhaft wird, oder einen Standard für sehr langsame Steuersignale festzulegen und gleichzeitig nicht zu viel Strom zu verschwenden.
Wie Wouter betonte, wird in einem Open-Drain-Bus die Geschwindigkeit durch den Pull-up-Widerstand begrenzt. Höhere Widerstandswerte verlangsamen den Bus. Typische Werte in I2C (die 100 oder 400 kHz erreichen) sind 1 bis 5 kOhm. Sie möchten einen ähnlichen Pull-up-Widerstand, um eine ähnliche Geschwindigkeit zu erreichen.
Ich denke, Sie müssen einen externen Pull-Up-Widerstand (von 1 bis 5 kOhm oder so) anstelle des I / O-Pin-Pull-Ups des Masters verwenden, damit dieses Schema funktioniert.
quelle
Damit ein Kabel- und ein Bus funktionieren, müssen die Knoten auf dem Bus offen sein, dh sie müssen senden
Außerdem muss der Bus schwach hochgezogen werden.
Das eigentümliche Verhalten, das Sie bei einem einzelnen nicht sendenden Master und einem einzelnen sendenden Slave sehen, kann entweder dadurch erklärt werden, dass der Master stark nach oben oder der Slave schwach nach unten zieht.
Sie müssen feststellen, welche der oben genannten Aktionen ausgeführt werden.
Versetzen Sie den Slave in den hochohmigen Modus und verbinden Sie den Bus über einen 10k-Widerstand mit Masse. Wenn sich die Netzspannung nicht wesentlich ändert, zieht der Master stark an und Sie müssen das beheben. Andernfalls gehen Sie genauso mit dem Slave vor (diesmal verbinden Sie den Widerstand mit Vcc). Wenn die Netzspannung deutlich ansteigt, zieht der Slave schwach nach unten (beheben Sie das). Suchen Sie andernfalls nach Zeit-Raum-Verzerrungen in der Umgebung.
quelle
Ich würde vorschlagen, ein passives Pull-up oder Pull-down im Bus zu haben (ich nehme an, Pull-up) und Slaves den Bus aktiv fahren zu lassen (hoch und niedrig fahren), wenn sie etwas zu sagen haben und es anders schweben lassen . Haben Sie Abfrage-Adress-Befehle, die eine Adresse und eine Maske annehmen und jeden Slave anweisen, 00 auszugeben oder nichts zu tun (schweben Sie die Ausgabe weiter), je nachdem, ob ihm die Adresse und die Maske gefallen. Wenn möglich, lassen Sie den Master den Bus einige Zeit aktiv hochfahren, bevor die Slaves ihn fahren. Abhängig von der Stärke des Pull-Ups und davon, ob der Master den Bus hoch fährt, bevor die Slaves ihn niedrig ziehen dürfen, kann es erforderlich sein, die Busgeschwindigkeit während der Setup-Phase zu begrenzen. Sobald die Einrichtung abgeschlossen ist,
quelle