Wie kann ich einen Raspberry PI GPIO an eine Open-Collector-Schaltung anschließen, um Daten zu senden / zu empfangen?

Ich habe einen GPIO von einem Raspberry PI, der wie folgt mit einem Nintendo 64-System verbunden ist:

n64-gpio-verbindung

Nach dem, was ich gesammelt und beobachtet habe, ist die Datenleitung auf dem N64-System ein Open-Collector-Ausgang. Die Leitung wird hochgezogen, wenn keine Daten übertragen werden, und zum Senden niedrig gezogen.

Der PI unterstützt Pull-Up/Down-Konfigurationen für die GPIO-Pins, aber ich sehe nichts über eine Open-Collector-Konfiguration.

Mit meinem aktuellen Setup kann ich mit dem PI Daten vom N64 lesen. Ich weiß jedoch nicht, wie ich die Datenleitung mit dem GPIO-Pin zerstörungsfrei auf Low ziehen und auch vom selben Pin lesen kann.

Kann ich das ohne zusätzliche Hardware erreichen? Oder muss ich so etwas wie einen Transistor hinzufügen, den ich mit dem PI schalten kann, um die Datenleitung mit Masse zu verbinden? Wenn ich das tue, wie werde ich Daten lesen?

Wie Sie sehen, weiß ich gerade genug, um mich gründlich zu verwirren, aber nicht genug, um das Problem zu lösen.

Vielen Dank für Ihre Hilfe!

Antworten (2)

Angenommen, der Raspberry Pi ist nur ein Verbraucher von Daten, würde sein GPIO als Eingang konfiguriert, und ob Sie einen Pull-up-Widerstand aktivieren oder nicht, hängt davon ab, ob dieser in den Controller integriert ist oder nicht. Ich kann mir keinen Grund vorstellen, warum der Raspberry Pi jemals aktiv die Datenleitung ansteuern würde. Ich würde vermuten , dass Sie den Pull-up auf dem Raspberry Pi aktivieren müssen, denn was bringt es sonst, eine Open-Collector-Schnittstelle auf dem Controller zu haben. Möglicherweise müssen Sie einen externen Pullup-Widerstand verwenden, wenn der interne Pullup zu schwach ist; Das Tutorial, auf das ich unten verweise, schlägt 2,2 kOhm vor, während die internen Klimmzüge auf dem Pi wahrscheinlich> 30k sind.

Ich frage mich, ob Sie tatsächlich in der Lage sein werden, das Signal auf dem Raspberry Pi ausreichend häufig / deterministisch abzutasten, indem Sie den GPIO abfragen, um die (vermutlich) seriellen Daten zu decodieren, die vom Controller kommen. Ich bin mit dem N64-Controller-Protokoll nicht vertraut, daher ist es schwer zu sagen.

Ich habe diese Referenz im Internet gefunden, die für Sie hilfreich sein könnte:

Um zu verstehen, wie man sich mit einem N64-Controller verbindet, muss man zuerst das Protokoll verstehen, das ein echter N64 verwendet, um sich mit dem Controller zu verbinden. Alle Daten werden auf einem einzigen Halbduplexkabel übertragen (das Signalkabel wird oben an Pin 25 angeschlossen). Wenn dieser Draht im Leerlauf ist, ist er hoch (daher der Pull-up-Widerstand). Wenn eine fallende Flanke erkannt wird, bedeutet dies, dass Bits übertragen werden. Bits werden in 4μs-Intervallen übertragen. Bei einer 0 ist der Draht 3 μs lang niedrig und 1 μs lang hoch. Bei einer 1 ist der Draht 1 μs lang niedrig und 3 μs lang hoch. Um ein Bit zu lesen, müssen Sie einfach auf eine fallende Flanke warten und dann den Draht 2 μs nach der fallenden Flanke lesen. Wenn die Leitung hoch ist, ist der Wert 1, wenn sie niedrig ist, ist der Wert 0. Alle Übertragungen enden mit einem 1-Bit, dem keine fallende Flanke folgt, das so genannte Signalbit.

Sieht aus wie eine serielle Pulsweitenmodulationscodierung. Ich bin skeptisch, dass man das mit einem Raspberry Pi einfach entschlüsseln kann. Auf der anderen Seite wäre es trivial, mit einem Mikrocontroller zu dekodieren, zB unter Verwendung von Pin-Wechsel-Interrupts und/oder Hardware-Timern / Input-Capture-Interrupts.

Aktualisieren

Da es sich um einen bidirektionalen Bus handelt, sollten Sie den GPIO in der Tat niemals auf Output-HIGH setzen. Wenn Sie möchten, dass der Ausgang HIGH ist, stellen Sie ihn einfach als Eingang mit aktiviertem Pull-up (oder vielleicht ohne Pull-up) ein. Wenn Sie LOW ausgeben möchten, setzen Sie den GPIO auf einen niedrigen Ausgang. Ich bezweifle jedoch, dass Sie mit einem Pi das richtige Timing bekommen können, wenn das Betriebssystem im Weg ist.

Jedes Mal, wenn die Daten des N64-Controllers gelesen werden müssen, sendet die Konsole eine 9-Bit-Abfrageanforderung
Danke für die sehr ausführliche Antwort! Ich kann Daten vom N64 mit einem von mir geschriebenen Linux-Kernelmodul ohne Probleme lesen (abgesehen davon, dass das System während des Lesens hängen bleibt). Ich habe Ihren Tipp zum Einstellen des GPIO auf Eingang verwendet, um den hohen Wert zu "schreiben", und den GPIO-Ausgang auf Null zu setzen, um niedrig zu schreiben, und das funktioniert bei sehr niedrigen Übertragungsraten. Ich habe die Leitung mit einem Multimeter gemessen, um dies zu bestätigen. Wenn ich jedoch versuche, mit der erforderlichen Geschwindigkeit zu schreiben, hängt der Raspberry PI und ich muss das Gerät aus- und wieder einschalten ... es sieht also so aus, als ob ein oder zwei PIC in meiner Zukunft liegen. Das hilft mir aber weiter.

Mit meinem aktuellen Setup kann ich mit dem PI Daten vom N64 lesen. Ich weiß jedoch nicht, wie ich die Datenleitung mit dem GPIO-Pin zerstörungsfrei auf Low ziehen und auch vom selben Pin lesen kann.

Schalten Sie den GPIO nur zwischen Input / High-Z und Output Low um. Schalten Sie ihn niemals auf High-Ausgang. So funktioniert ein Open Collector.

Sie schlagen vor, dass dies eine bidirektionale Schnittstelle ist? Ich kann mir nicht vorstellen, dass der "Computer" die Datenleitung ansteuert, um Informationen an den Controller zu senden.
@vicatcu ja. Controller in den letzten drei Jahrzehnten sind keine einfachen Geräte. hackaday.com/2012/10/16/…
Verstanden "Die Konsole sendet eine 9-Bit-Abfrageanforderung. Der Controller antwortet wiederum mit einer 32-Bit-Sequenz, die die Konsole über den Status aller Tasten und Joysticks informiert", jedenfalls denke ich, das meiste von dem, was ich geschrieben habe Meine Antwort ist solide.