I2C Pull-up-Widerstände und Spannung

Ich habe einen Sensor, den ich über I2C zu lesen versuche, aber ich habe einige Probleme mit den Pull-up-Widerständen und der Spannung, auf die sie eingestellt sind.

Mein Host-Computer ist der Arduino Nano, während mein Sensor das Magnetometer HMC5883L ist .

Unten ist ein Blockdiagramm, das mein Verdrahtungsschema zeigt.

Ich habe einige Nachforschungen über den Prozessor des Nano Every angestellt . Die I2C-Pins sind mit dem ATMEGA4809 verbunden und werden mit +5 V versorgt. Somit werden die I2C-Leitungen auf eine Spannung von 5 Volt bezogen. Das HMC5883L-Modul hat bereits Pull-up-Widerstände für 5 V und 3,3 V, aber wenn ich meine eigenen externen Pull-up-Widerstände hinzufügen wollte, müsste ich sie auf 5 V referenzieren, wie in meinem Blockdiagramm gezeigt, richtig? Wenn ich mich entscheide, es auf 3,3 Volt zu referenzieren (und 3,3 Volt vom Nano mit dem entsprechenden Pin am Sensor verbinde), da der Mikrocontroller mit 5 Volt läuft, an welche Spannung sollte ich die Pull-up-Widerstände anschließen?

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Antworten (3)

Somit werden die I2C-Leitungen auf eine Spannung von 5 Volt bezogen

Nö. Sie sind auf GND bezogen.

Anschließen von 3,3 Volt vom Nano an den entsprechenden Pin des Sensors

Tun Sie dies nicht! Die 3,3 V am Sensor sind ein Ausgang .

Das HMC5883L-Modul hat bereits Pull-up-Widerstände für 5 V und 3,3 V

Obwohl es sich tatsächlich um Pull-up-Widerstände handelt, sind sie auch Teil des eingebauten Pegelumsetzers, der es dem 3,3-V-Sensor ermöglicht, mit einem 5-V-I2C-Bus zu arbeiten.

Wenn ich meine eigenen externen Pull-up-Widerstände hinzufügen wollte, müsste ich sie wie in meinem Blockdiagramm gezeigt auf 5 V referenzieren, richtig?

Es gibt keinerlei Grund, irgendetwas extern hinzuzufügen. Wenn Sie dies jedoch tun möchten, können Sie Pull-up-Widerstände zu 5 V hinzufügen, aber dann müssen Sie entweder R3, R4 von der Sensorplatine entfernen oder sicherstellen, dass Ihre zusätzlichen Widerstände parallel zu ihnen nicht unter ein Minimum fallen zulässigen Widerstand (dh Ihr kombinierter Klimmzug ist nicht zu stark). Beispielsweise führen zusätzliche 10k-Widerstände zu einem 5k-Pull-up, was für einen 400-kHz-Bus in Ordnung sein sollte.

Wenn ich mich entscheide, es auf 3,3 Volt zu beziehen

Auch hierfür gibt es keinen Grund, da die Sensorseite des Pegelumsetzers bereits auf 3,3 V hochgezogen ist. Die MCU-Seite der Schalthebel wird auf 5 V hochgezogen. Wenn Sie eine 3,3-V-MCU verwendet haben, hätten Sie alle 4 Widerstände (R1-R4) und zwei MOSFETs entfernen, die SDA- und SCL-Leitungen für den Durchgang kurzschließen und schließlich externe Pull-up-Widerstände auf 3,3 V hinzufügen können. Da Sie jedoch Nano verwenden, ist seine MCU nicht mit dem 3,3-V-I2C-Bus kompatibel.

AKTUALISIEREN:

Was Sie an VIN anschließen, hängt vom I2C-Logikpegel der MCU ab?

JA für Adafruit-Boards, NEIN im Allgemeinen. Die Adafruit-Boards sind so konzipiert, dass sie mit 5 V (VIN) betrieben werden, wobei der interne Regler verwendet wird, um auf 3,3 V herunterzuregeln, wie Sie selbst erwähnt haben. Die Platine wird also mit 5 V betrieben, der Sensorchip darauf jedoch mit 3,3 V.

Jetzt beträgt die VIN_min für den HMC5883L-Chip 2,16 V, für LSM9DS1 1,9 V. Theoretisch können Sie die Platinen mit diesen Spannungen + Spannungsabfall am LDO versorgen. Bedeutet nicht, dass Sie es tun müssen. Wenn Sie ein stabiles vorhersehbares Verhalten wünschen, würde ich empfehlen, die Platinen nach Möglichkeit mit 5 V zu versorgen. Aber lies weiter...

Also 5V von Nano zu VIN und meine Klimmzüge.

Ihr Fehler ist zu glauben, dass VIN irgendetwas mit Klimmzügen zu tun hat. Die I2C-Busspannung (wo Pull-Ups angeschlossen werden sollten) wird in den Schaltplänen oft als VDDIO bezeichnet. Viele Chips haben separate Eingangspins für VDDIO (zB Pin 13 von HMC5883L, Pins 1 und 3 von LSM9DS1). Es ist einfach so, dass Adafruit diese Pins mit VDD von LDO auf ihren Boards verbunden hat.

Da sie VDDIO mit dem internen 3,3-V-Regler verbunden haben, konnten sie nicht zulassen, dass Sie eine höhere Spannung an die I2C-Pins des Sensors anlegen. Also fügten sie ihren Platinen Level-Shifter hinzu, mit Pull-Ups auf 3,3 V auf der Sensorseite und Pull-Ups auf VIN auf der Steckerseite. Dies wiederum fixiert die externe I2C-Busspannung auf VIN. In diesem Fall definiert die VIN also die Busspannung , aber nur, weil die Adafruit-Ingenieure die Platinen auf diese Weise verdrahtet haben.

Zusammenfassen:

  • Wenn Sie nicht bereit sind, Sensorplatinen zu hacken, um Pegelumsetzer zu umgehen, bleiben Sie bei ihren Pull-Ups hängen, was bedeutet, dass die externe (dh an die MCU angeschlossene) I2C-Busspannung immer gleich VIN ist.
  • Daher sollten Sie VIN mit dem I/O-Logikpegel Ihrer MCU versorgen. Oder 5V bei Nano, 3,3V bei Portenta.
  • Es gibt keinen Grund, externe Pull-ups hinzuzufügen, es sei denn, es treten Kommunikationsfehler bei 400 kHz auf. Dann können Sie externe Pull-ups an VIN anschließen, aber versuchen Sie nicht, unter 10k zu gehen.
Wenn ich darf, bin ich immer noch verloren. Wenn Sie sich andere Module wie das LSM9DS1 ansehen, haben sie einen Regler, um auf 3,3 V herunterzuregeln. Der Schaltplan besagt, dass VIN mit 5 V oder 3,3 V verbunden werden soll. Was Sie in diesem Fall an VIN anschließen, hängt also vom I2C-Logikpegel der MCU ab? Beim Nano arbeitet er also mit 5 V. Also 5V von Nano zu VIN und meine Klimmzüge. Sagen wir jedoch, Portenta H7 arbeitet mit 3,3 V, 3,3 V von Portenta zu VIN ist der richtige Weg, es zu verdrahten, oder? Was wäre, wenn Sie stattdessen 5 V von der Portenta laufen lassen würden?
@BestQualityVacuum siehe ein Update.
Danke für das Update. Sehr glasklar. Schließen Sie also je nach MCU die entsprechende Spannung an VIN an und verwenden Sie nur 3V3 am Sensor für die Ausgabe. Habe es. Junge, ich habe es wirklich vermasselt.

Die Leute von Adafruit haben sich das für Sie ausgedacht. Wenn Sie auf die Adafruit-Site gehen, auf die Sie für den HMC5883L verlinkt sind, erfahren Sie Folgendes über die SDA- und SCL-Leitungen für I2C:

Geben Sie hier die Bildbeschreibung ein

Meine Interpretation davon ist also, dass Sie externe Pullup-Widerstände auf 5 V verwenden können.

Der Atmega hingegen hat ein digitales Hoch, das im Datenblatt als solches definiert ist:

Geben Sie hier die Bildbeschreibung ein

Bei einer 5-V-Quelle sind 0,7 * VDD 3,5 V. Ihre 3,3 V werden also nicht als Hochspannung registriert, wodurch der I2C nicht funktioniert. Sie müssen also 5 V für den I2C-Pullup verwenden.

Der Controller hat eine IO-Spannung von 5V. Es könnte mit einem 3V3-I2C-Bus laufen, aber Sie sollten besser bei 5 V bleiben. Verwenden Sie einfach die internen 5-V-I2C-Pullups des Sensorboards.