No hay salida de señal en el bus I2C

0

Tengo un ESP-WROOM-32 (maestro I2C) y un ATmega328p (esclavo I2C, dirección 0x03) ensamblado en un PCB prototipo usando pull-ups externos 6k8.

Estoy usando los pines I2C 21 (SDA) y 22 (SCL) predeterminados del ESP como siempre lo hice, pero cuando ejecuto el escáner I2C a continuación, no observo ninguna comunicación en el bus. SDA permanece en alto, SCL en bajo.

El mismo boceto funciona como se esperaba cuando lo envié a otro ESP32 individual (ahí veo la comunicación en el bus y el esclavo se reconoce en la dirección 0x03).

Estoy muy confundido por eso!

Estoy bastante seguro de que no hay ningún problema de hardware en el PCB, porque lo verifiqué en una placa de pruebas antes de entregárselo al fabricante y también probé los circuitos con un multímetro después del ensamblaje. También alternar los pines 21 y 22 en software con alta frecuencia funciona según lo previsto.

Cuando conecto el otro ESP32 al mismo hardware, la señal tiene suficiente calidad y está (al menos) allí.

Como no hay nada mágico en mi PCB (las líneas SCL / SDA tienen aproximadamente 1 "de largo sin esclavos ensamblados, nada más), no creo que publicar mi diseño sea necesario (y también me preocupa la publicación públicamente, ya que es propiedad de mi empresa).

No tengo idea de cómo podría estar el problema en mi PCB, pero como mi tema anterior se cerró en la sección de software de SE como "fuera de tema", espero encontrar algunas respuestas aquí.

¿Alguien ha adquirido la experiencia de que los pull-ups demasiado altos suprimen la transmisión de la señal completamente ?

Es razonable que destruyera parcialmente el ESP mediante soldadura (usando una estación de reflujo hecha por nosotros mismos que hasta ahora hizo un gran trabajo). Como no tuve ningún problema con otras funciones, no parece probable.

Al menos parte de la información que proporcioné en la sección de software.

Antes de depurar con mi osciloscopio y creer en un fallo de software, presenté bocetos que usan Wire.h, drivers / i2c.hy /peripherals/i2c.h, donde I2C se configuró en diferentes pines (ahora mismo no tengo acceso a esos pines debido al blindaje, por lo que no puedo verificar si hay una salida de señal).

¿Parece que la interfaz ni siquiera fue inicializada? No puedo imaginar que tenga un chip defectuoso ...

¿Alguna idea?

Este es el escáner I2C que utilicé (pero reproduje el problema con cualquier cosa que hice con Wire.h, drivers / i2c o periféricos / i2c.h):

#include <Wire.h>

#define SDA_PIN 21
#define SCL_PIN 22

void setup () {
  Wire.begin(SDA_PIN, SCL_PIN);
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}

void loop () {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;

  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }

    else if (error==4) {
      Serial.print("Unknown error at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
    }    
  }

  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
  delay(1000);
}
    
pregunta Sim Son

1 respuesta

-1

El problema fue un gpio destruido. Para aquellos que enfrentan este problema: el comportamiento sospechoso en ese caso es el gpio preocupado que flota en estado ALTO a voltajes indefinidos muy por debajo del nivel alto. Obviamente un daño del transistor de salida.

    
respondido por el Sim Son

Lea otras preguntas en las etiquetas