El bus I2C (Inter-Integrated Circuit), es un bus de datos serial diseñado por Philips en la actualidad NXP Semiconductors para la comunicación de circuitos integrados o módulos, este bus diferentes dispositivos intercambian datos e instrucciones, con solo dos cables lo cual simplifica de manera considerable los circuitos. El protocolo I2C es empleado por gran cantidad de dispositivos como memorias, sensores y otros circuitos integrados. Permite interconectar hasta 112 dispositivos a la vez, cada dispositivo se identificara con una direccion de memoria única. Debe existir un dispositivo maestro y uno o más esclavos. la velocidad puede variar, aunque esta entre 100 y 400 KHz.
Las dos lineas que se usan en el protocolo I2C son SDA que es la línea por donde se transmiten los datos y la línea SCL, que es la que transmite la señal de reloj, en este protocolo el que controla el bus es el dispositivo maestro y los controlados por el maestro son los dispositivos esclavos.

Conexión dispositivos bus I2C

Descripción del protocolo

  • Cuando la línea de datos (SDA) y la señal de reloj (SCL) tienen un valor alto, el bus no se encuentra ocupado.
  • El cambio de estado de la línea SDA de un valor alto a un valor bajo, cuando la línea SCL esta en un valor alto, define el inicio de la transferencia de los datos.
  • EL cambio de estado de la línea SDA de un valor bajo a alto, cuando la linea SCL esta en un valor alto, define el paro de la transferencia de datos.
  • Los datos se transmiten entre el inicio y la señal de paro.
  • Después del inicio de transferencia de datos, la línea SDA es estable durante los periodos altos de la señal SCL, pero puede cambiar durante los periodos bajos de la señal SCL.
  • Sóo hay un pulso de la señal SCL por cada bit de datos transmitido sin límite en el número de bytes de datos que es posible entre las condiciones de inicio y fin, después de cada byte de datos, el receptor envía un reconocimiento a través del noveno bit.
  • El bit de reconocimiento es de nivel alto colocado en el bus por el transmisor, un valor bajo colocado por el receptor.

    Condiciones I2C

    La información a transmitir dentro de las tramas irá en paquetes que contienen la dirección del dispositivo al que va dirigida dicha información y paquetes que configuran o comandan el dispositivo de acuerdo a sus especificaciones, la primera trama de información que se transmite, contiene solo siete bits y corresponderá a la dirección del esclavo que debe recibirla; en el octavo bit, le indicará la operación a realizar un “1” para lectura y un “0” para escritura.

Ejemplo escaner I2C

Para este ejemplo usaremos como maestro la placa nodemcu-v1.0 y como esclavo un módulo GY-521 que es IMU con 6 grados de libertad, el cual combina un acelerómetro de 3 ejes y un giroscopio de 3 ejes.

Esquema de montaje
#include <Arduino.h>
#include <Wire.h>

void setup()
{

  pinMode(D0, OUTPUT);
  Serial.begin(115200);
  Wire.begin(D2, D1); /* I2C bus  SDA=D2 and SCL=D1 */
}

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

  Serial.println("Escaneando...");
  Serial.println("**************");

  nDevices = 0;
  for (address = 1; address < 127; address++)
  {

    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("Encontrado dispositivo I2C dirección 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
      nDevices++;
    }
  }
  Serial.println("**************");
  delay(2000); 
}

En la siguiente imagen se puede observar la salida por el puerto serie, y la captura de la trama del protocolo I2C capturada con la ayuda de un analizador lógico.

Salida monitor serie
Salida analizador lógico

Descargas

Código