Verwenden Sie GPIO für schaltbare Pullups von I2C

Ich entwerfe eine Allzweck-Schnittstellenkarte und möchte möglichst viele der Peripheriegeräte verfügbar und auf einem Erweiterungskopf verwendbar machen, ohne dass dauerhafte (Löt-)Änderungen erforderlich sind.

Ein Problem besteht darin, die I2C-Pullup-Widerstände schaltbar zu machen, sodass sie deaktiviert werden können, wenn sie nicht benötigt werden. Meine ursprüngliche Idee verwendet einfach einen freien GPIO-Ausgang, um die Widerstände hochzuziehen, oder wird deaktiviert (hohe Impedanz), wenn er nicht benötigt wird, wie unten dargestellt. Das spart mir anscheinend einen Schalttransistor. Muss ich irgendwas beachten oder ist das machbar?

Ich weiß, dass die Pullup-Widerstandswerte von der Buslänge und -geschwindigkeit abhängen, aber wir haben festgestellt, dass für unsere Anwendungen 4k7 Ohm im Allgemeinen in Ordnung sind.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Antworten (2)

Die Verwendung eines GPIO-Pins zum Hochziehen des I2C-Buswiderstands ist eine vernünftige Idee, solange die verwendete MCU über GPIOs verfügt, die einen starken aktiven High-Level-Ausgang haben.

Sie müssen zwei GPIOs verwenden, einen für jeden Widerstand. Wenn nicht, werden die beiden Widerstände 2 x 4,7 kOhm zwischen die beiden Signalleitungen legen.

Sie haben also einen Kompromiss. Verwenden Sie dafür zwei GPIOs oder einen GPIO und zwei kleine Schalt-FETs. Oder Sie könnten jeden Widerstand mit einem zweipoligen Header und einem Jumper ausstatten und überhaupt keine GPIOs verwenden.

Warum brauche ich zwei Pins? Ist der Ausgang nicht im Grunde ein Transistor, der zwischen Pin und Versorgung geschaltet ist? Wie unterscheidet sich das von einem diskreten Schalter?
@Arne: schau dir mal deine Schaltpläne an. Sie haben 9,4 kΩ zwischen MOSI und MISO. Wäre das für dich in Ordnung?
@ Michael Huhh, tut mir leid, dass ich blind war ... Entschuldigung.

Scheint ziemlich vernünftig zu sein (besonders wenn Sie zwei Leitungen verwenden, wie @MichealKaras vorschlägt, aber ich wäre besorgt über die ganze Idee, den I2C-Bus überhaupt schweben zu lassen - natürlich abhängig davon, was Sie mit dem Bus machen. At Zumindest würde ich mich auf mehr Tests und Überprüfungen verlassen, als ich normalerweise tun würde, um sicherzustellen, dass der Bus reibungslos wieder hochfährt.

Natürlich stellt sich die Frage, warum Sie den Bus überhaupt deaktivieren müssen. Wenn es nur darum geht, Strom zu sparen, würde ich in Betracht ziehen, den Bus mit einigen kräftigen Widerständen hochzuziehen, die parallel zu Ihren geschalteten Widerständen permanent hoch geschaltet sind, wenn Sie einige Mikroampere entbehren können. Auf diese Weise bleibt Ihr Bus während der Inaktivität hochgebunden.

Ich möchte nicht, dass der I2C-Bus schwebend ist. Wenn ein I2C-Gerät an den Erweiterungsanschluss angeschlossen ist, müssen die Pullups aktiv sein. Nur wenn die Pins beispielsweise für SPI oder GPIO verwendet werden, werden die Pullups deaktiviert, um nicht zu stören.
@Arne Das ist eine andere Geschichte. Ziemlich geizig mit deinen Pins, aber. Meine eigene Neigung für eine Allzweckschnittstelle wäre jedoch, jeden Bus und DIO bereitzustellen. Natürlich könnte es gemacht werden, wie es beim BusPirate der Fall ist. Sie können sich dieses Design ansehen, um zu sehen, wie es gehandhabt wurde. Ich glaube, das ganze Design ist offen.
„Ziemlich geizig“ – was meinst du?
@Arne - Ich weiß nicht, wie hoch Ihre Kosten- und Größenbeschränkungen sind, aber es gibt einige ziemlich große Pakete mit einer hohen Anzahl von Pins, die die Notwendigkeit eines Funktionswechsels ausschließen würden. Sie müssen mehr ausgeben, mehr Platz auf der Platine beanspruchen und natürlich größere Anschlüsse verwenden, daher ist dies möglicherweise nicht die richtige Wahl.
Mangel an Anschlussplatz ist genau die Einschränkung, die ich umgehen muss. Ich werde einen Blick auf verfügbare PMOS-Schalter in geeigneten Gehäusen werfen.