Determinar la dirección I2C sin hoja de datos

4

Al configurar las comunicaciones I2C, sé que es ideal tener las hojas de datos de los dispositivos y encontrar la dirección I2C de los dispositivos de esa manera. Sin embargo, en algunas aplicaciones de ingeniería inversa, no tiene una hoja de datos disponible. (O es posible que simplemente no puedas encontrarlo ...)

Sin la hoja de datos, ¿cómo determina la dirección I2C predeterminada de un dispositivo? Además, ¿qué herramientas / equipos necesita? (Por ejemplo, ¿es suficiente un microcontrolador con soporte I2C o necesitas un osciloscopio?)

    
pregunta apnorton

4 respuestas

10

Es bastante fácil escribir una utilidad de "ping" I2C para un microcontrolador. Todo lo que necesita hacer es escanear las ~ 128 direcciones y para cada una:

  1. Enviar condición de inicio I2C
  2. Envíe un solo byte que represente la dirección y obtenga el ACK / NAK
  3. Enviar la condición de parada.

Si hay un ACK (la línea de datos se mantiene baja en el noveno ciclo de reloj), entonces hay un dispositivo con esa dirección en el bus I2C. Si no hay ACK, entonces no hay ningún dispositivo presente.

No olvide que las direcciones I2C están en los 7 bits superiores del byte (el último bit es para lectura / escritura). Además, no olvide ignorar las direcciones I2C especiales en su escaneo: enlace

En cuanto al hardware, casi cualquier cosa funcionará. Incluso si su dispositivo no es compatible con I2C, es un protocolo lo suficientemente simple (y lo suficientemente lento) en el que puede golpearlo. Solo asegúrese de que lo que use nunca haga que las líneas I2C sean altas, solo bajas (según las especificaciones).

    
respondido por el srlm
7

Si no quieres hacerlo manualmente:

  • Conecta una Raspberry Pi
  • Ejecuta sudo i2cdetect -y 0
  • Si Ejecutar sudo i2cdetect -y 0 no funciona, Ejecute sudo i2cdetect -y 1
respondido por el Tom L.
2

Aquí hay un fragmento de código de Arduino que utilizo:

for (int address=1; address <= 126; address++) {
  Wire.beginTransmission(address); // Select address
  if (!Wire.endTransmission()) Serial.printf("Found device at: %02Xh\n", address); 
}
    
respondido por el jp314
1

Puede conectar SCL / SDA a una placa Arduino, encender el dispositivo I2C y luego ejecutar en la placa Arduino este código:

// i2c_scanner
 //
 // This program (or code that looks like it)
 // can be found in many places.
 // For example on the Arduino.cc forum.
 // The original author is not know.
 //
 // This sketch tests the standard 7-bit addresses
 // from 0 to 127. Devices with higher bit address
 // might not be seen properly.
 //
 // Adapted to be as simple as possible by Arduino.cc user Krodal

#include <Wire.h>

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

void loop()
{
    byte error, address;
    int nDevices;

    Serial.println("Scanning...");

    nDevices = 0;
    for(address = 0; 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("Unknow 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(30000);
 }
    
respondido por el Sorin Trimbitas

Lea otras preguntas en las etiquetas