EDITAR: ejecuté un programa de escaneo de bus i2c y detectó un dispositivo en 0x70 (el mux). Conecté el dispositivo con el que intento conectarme directamente al bus i2c, ejecuté este código y funcionó exactamente como se esperaba. Pero aún cuando ejecuto este código con el dispositivo conectado a uno de los canales mux, no funciona. ¡Estoy perplejo!
Estoy tratando de controlar un dispositivo I²C a través de un multiplexor en un ESP8266. A continuación se muestra el circuito que estoy usando y el código. Este código exacto funciona si cambio el dispositivo para que se conecte directamente a SDA y SCL (sin pasar por el multiplexor). Desafortunadamente, si se conecta a través del multiplexor, el código muestra "No se encontró TCS34725". He probado esto en dos tableros distintos con los mismos resultados en ambos.
El reinicio (N $ 5) se eleva a 3.3v a través de una resistencia de 10k.
#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();
}
¿Alguna idea de por qué esto no funciona?
Lo primero que debe verificar es que el pin !RESET del mux se levante correctamente por la resistencia y no se mantenga bajo por la MCU maestra. Y me refiero a verificar realmente no solo asumir que está bien porque se supone que debe ser así. El mux aún puede ACK en el reinicio cuando escanea el bus, pero no seleccionará el canal de salida en el comando.
Si ese no es el caso, aquí hay un procedimiento simple para diagnosticar el problema. Necesitaría otro dispositivo I2C "B", por ejemplo VL53L0X que ha mencionado. Ya ha realizado algunos de los pasos a continuación, por lo que puede omitirlos. También asegúrese de que los dispositivos con identificaciones seleccionables siempre estén cableados de manera idéntica en las pruebas.
Puede diagnosticar aún más comparando voltajes y pull-ups en el bus principal y en los canales Mux de salida. También revise las hojas de datos y vuelva a verificar las velocidades admitidas y vuelva a calcular los valores de resistencia pull-up requeridos para los canales Mux (dependen de la velocidad y la capacitancia del bus).
Hay algo que debes revisar cuidadosamente. En el mundo I2C y SMBus siempre ha existido el uso confuso de una combinación de valores de dirección de 7 bits y valores de dirección de esclavo de 8 bits. La hoja de datos del TCA9548A indica la dirección del esclavo I2C para la parte MUX como una dirección de 7 bits que reside en los 7 bits superiores del byte de dirección transmitido.
En su código, ha establecido la definición de TCAADDR en 0x70, lo que será correcto para la instancia en la que ha vinculado los pines A0, A1 y A2 en la parte MUX a GND. Tenga en cuenta que este valor 0x70 es una dirección esclava de 7 bits.
Muchas bibliotecas de software para comunicarse en I2C y SMBus usarán una representación de 8 bits para la dirección esclava y luego simplemente o en un 0x01 al bit bajo para una operación de tipo LECTURA. Si el código de la biblioteca usa una entrada de dirección esclava de 7 bits, el código debe cambiar ese valor un lugar a la izquierda para que el byte que se envíe sea correcto.
Entonces, la verificación que debe hacer es cómo el código de la biblioteca trata la dirección esclava. Si funciona en el modo de 8 bits, deberá configurar su TCAADDR en 0xE0.
No te sientas mal si este es el problema que te ha atrapado aquí. Innumerables personas han sido mordidas por este problema.
chris stratton
Murey Tasroc
brahans
Murey Tasroc
glen willen