BEARBEITEN: Ich habe ein i2c-Bus-Scan-Programm ausgeführt und es hat ein Gerät bei 0x70 (dem Mux) erkannt. Ich habe das Gerät, mit dem ich eine Verbindung herstellen möchte, direkt mit dem i2c-Bus verbunden und diesen Code ausgeführt, und es hat genau wie erwartet funktioniert. Aber immer noch, wenn ich diesen Code mit dem an einen der Mux-Kanäle angeschlossenen Gerät ausführe, funktioniert es nicht. Ich bin ratlos!
Ich versuche, ein I²C-Gerät über einen Multiplexer auf einem ESP8266 zu steuern. Unten ist die Schaltung, die ich verwende, und der Code. Dieser genaue Code funktioniert, wenn ich das direkt an SDA und SCL anzuschließende Gerät ändere (unter Umgehung des Multiplexers). Leider gibt der Code bei einer Verbindung über den Multiplexer "No TCS34725 found" aus. Ich habe dies auf zwei verschiedenen Boards mit den gleichen Ergebnissen auf beiden versucht.
Reset (N$5) wird über einen 10k-Widerstand auf 3,3 V hochgezogen.
#include <Wire.h>
#include <Adafruit_TCS34725.h>
#define TCAADDR 0x70
uint16_t clear, red, green, blue;
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_2_4MS, TCS34725_GAIN_1X);
void setup() {
Wire.begin();
Serial.begin(115200);
delay(10);
Serial.println("\r\n");
tcaselect(6);
if (tcs.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1); // halt!
}
}
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
Irgendwelche Ideen, warum das nicht funktioniert?
Das erste, was zu überprüfen ist, ist, dass der !RESET-Pin des Mux ordnungsgemäß vom Widerstand hochgezogen und nicht von der Master-MCU niedrig gehalten wird. Und ich meine, wirklich prüfen, nicht einfach davon ausgehen, dass es in Ordnung ist, weil es so sein soll. Der Mux bestätigt möglicherweise immer noch im Reset, wenn Sie den Bus scannen, aber er wählt den Ausgangskanal nicht auf Befehl aus.
Wenn dies nicht der Fall ist, finden Sie hier ein einfaches Verfahren zur Diagnose des Problems. Sie benötigen ein weiteres I2C-Gerät "B", zum Beispiel das von Ihnen erwähnte VL53L0X. Sie haben bereits einige der folgenden Schritte ausgeführt, sodass Sie diese überspringen können. Stellen Sie außerdem sicher, dass Geräte mit wählbaren IDs in den Tests immer identisch verdrahtet sind.
Sie können weiter diagnostizieren, indem Sie Spannungen und Pull-ups auf dem Hauptbus und den Mux-Ausgangskanälen vergleichen. Gehen Sie auch die Datenblätter durch und überprüfen Sie die unterstützten Geschwindigkeiten erneut und berechnen Sie die erforderlichen Pull-up-Widerstandswerte für Mux-Kanäle neu (sie hängen von Geschwindigkeit und Buskapazität ab).
Es gibt etwas, das Sie sorgfältig prüfen müssen. In der I2C- und SMBus-Welt gab es schon immer die verwirrende Verwendung einer Mischung aus 7-Bit-Adresswerten und 8-Bit-Slave-Adresswerten. Das Datenblatt des TCA9548A nennt die I2C-Slave-Adresse für den MUX-Teil als 7-Bit-Adresse, die sich in den oberen 7 Bits des übertragenen Adressbytes befindet.
In Ihrem Code haben Sie die Definition für TCAADDR auf 0x70 gesetzt, was für die Instanz richtig ist, dass Sie die A0-, A1- und A2-Pins auf dem MUX-Teil alle mit GND verbunden haben. Denken Sie daran, dass dieser 0x70-Wert eine 7-Bit-Slave-Adresse ist.
Viele Softwarebibliotheken für die Kommunikation auf I2C und SMBus verwenden eine 8-Bit-Darstellung für die Slave-Adresse und dann einfach oder in einem 0x01 zum niedrigen Bit für eine Operation vom Typ READ. Wenn der Bibliothekscode einen 7-Bit-Slave-Adresseneingang verwendet, muss der Code diesen Wert um eine Stelle nach links verschieben, damit das auszusendende Byte korrekt ist.
Sie müssen also überprüfen, wie der Bibliothekscode die Slave-Adresse behandelt. Wenn es im 8-Bit-Modus funktioniert, müssen Sie Ihre TCAADDR auf 0xE0 setzen.
Fühlen Sie sich nicht schlecht, wenn dies das Problem ist, das Sie hier eingeholt hat. Unzählige Personen wurden von diesem Problem gebissen.
Chris Stratton
Murey Tasroc
brhans
Murey Tasroc
Glen Willen