Introducción a la comunicación I2C
I2C alternativamente conocido como I2C o IIC es un protocolo de comunicación de esclavo maestro sincrónico donde un dispositivo maestro de señal puede controlar un número múltiple de dispositivos de esclavos sobre un solo cable (línea SDA).
I2C Combine el funcionamiento de los protocolos UART y SPI, por ejemplo, SPI admite múltiples dispositivos de esclavos control sobre un solo maestro, I2C también admite esto, por otro lado, UART usa TX y RX de dos líneas para la comunicación I2C también usa SDA y SCL de dos líneas para comunicación.
Aquí podemos ver que hemos usado resistencias de extracción con las líneas SDA, SCL. Esto se debe a que, por defecto, I2C solo genera dos niveles de circuito bajo o abierto. Por defecto, I2C en todos los chips está en modo de circuito abierto, por lo que para tirar de ellos en alto utilizamos una resistencia pull-up.
El siguiente es las dos líneas que usa I2C:
Interfaces de bus ESP32 I2C
ESP32 presenta dos interfaces de bus I2C utilizando las cuales la comunicación I2C se realiza como maestro o esclavo dependiendo del dispositivo que se interrogue con ESP32. Según la hoja de datos ESP32, la interfaz I2C de la placa ESP32 admite la siguiente configuración:
Conectando dispositivos I2C con ESP32
Los dispositivos de interfaz con ESP32 usando el protocolo I2C son muy simples, al igual que UART, solo necesitamos dos líneas para conectar SDA y la línea de reloj SCL.
ESP32 se puede configurar como en modo maestro y esclavo.
Modo maestro ESP32 I2C
En este modo, ESP32 genera una señal de reloj que inicia la comunicación con dispositivos de esclavos conectados.
Los dos pines GPIO en ESP32 que están predefinidos para la comunicación I2C:
Modo esclavo ESP32 I2C
En modo esclavo, el reloj es generado por el dispositivo maestro. Master es el único dispositivo que impulsa la línea SCL en la comunicación I2C. Los esclavos son los dispositivos que responden al maestro pero no pueden iniciar una transferencia de datos. En ESP32 I2C Bus solo el maestro puede iniciar la transferencia de datos entre dispositivos.
La imagen muestra dos tableros ESP32 en la configuración del esclavo maestro.
A partir de ahora, hemos entendido el funcionamiento del modo I2C en ESP32, ahora podemos encontrar fácilmente la dirección I2C de cualquier dispositivo cargando el código dado.
Cómo escanear la dirección I2C en ESP32 usando Arduino IDE
Encontrar la dirección I2C de dispositivos conectados con ESP32 es importante porque si estamos utilizando dispositivos con la misma dirección I2C, entonces no podemos comunicarnos con ellos a través de una sola línea de bus.
Cada dispositivo I2C debe contener una dirección única y el rango de direcciones de 0 a 127 o (0 a 0x7f) en hex. Por ejemplo, si estamos utilizando dos pantallas OLED del mismo número de modelo o producto, ambos tendrán la misma dirección I2C, por lo que no podemos usar ambos en la misma línea I2C en ESP32.
Para encontrar una dirección IC, tomemos un ejemplo.
Esquemático
A continuación, la imagen muestra el diagrama esquemático de la interfaz de pantalla OLED con la placa ESP32 utilizando el protocolo de comunicación I2C.
La conexión de ESP32 con OLED incluye:
Pantalla OLED | Alfiler |
---|---|
VCC | 3v3/vin |
Gnd | Gnd |
SCL | GPIO 22 |
SDA | GPIO 21 |
Código
Abra el editor de Arduino y cargue el código de escaneo I2C dado en el tablero ESP32. Asegúrese de que ESP32 esté conectado y se selecciona el puerto COM.
/*****************
******************
Linuxhint.comunicarse
******************
****************/
#include /*biblioteca de alambre incluida* /
setup () void
Cable.comenzar(); /*La comunicación I2C comienza*/
De serie.comenzar (115200); /*Tasa de baudios definida para la comunicación en serie*/
De serie.println ("\ Ni2c Scanner"); /*Imprimir escáner en Serial Monitor*/
bucle void ()
Error de byte, dirección;
int ndevices;
De serie.println ("escaneo ..."); /*ESP32 comienza a escanear dispositivos I2C disponibles*/
ndevices = 0;
para (dirección = 1; dirección < 127; address++ ) /*for loop to check number of devices on 127 address*/
Cable.beginTransmission (dirección);
error = cable.Endtransmission ();
if (error == 0) /*if i2c Device encontrado* /
De serie.imprimir ("dispositivo I2C encontrado en la dirección 0x");/*Imprima esta línea si el dispositivo I2C encontró*/
if (dirección<16)
De serie.imprimir ("0");
De serie.println (dirección, hex); /*Imprime el valor hexadecimal de la dirección I2C*/
ndevices ++;
else if (error == 4)
De serie.imprimir ("Error desconocido en la dirección 0x");
if (dirección<16)
De serie.imprimir ("0");
De serie.println (dirección, hex);
if (ndevices == 0)
De serie.println ("No se encontraron dispositivos I2C \ n"); /*Si no se adjunta el dispositivo I2C, imprima este mensaje*/
demás
De serie.println ("hecho \ n");
retraso (5000); /*Retraso dado para verificar el bus I2C cada 5 segundos*/
El código anterior escaneará los dispositivos I2C disponibles. Código iniciado llamando a la biblioteca de cables para la comunicación I2C. La próxima comunicación en serie se inicia con la tasa de baudios.
En la parte del bucle del código de exploración I2C dos nombres de variables, error y DIRECCIÓN están definidos. Estas dos variables almacenan la dirección I2C de dispositivos. A continuación, se inicializa un bucle for for que escanee la dirección I2C a partir de 0 a 127 dispositivos.
Después de leer la dirección I2C, la salida se imprime en el monitor en serie en formato hexagonal.
Hardware
Aquí podemos ver el OLED 0.La pantalla I2C de 96 pulgadas está conectada a la placa ESP32 en los pines GPIO 21 y 22. VCC y GND de la pantalla están conectados con ESP32 3V3 y PIN GND.
Producción
En la salida podemos ver la dirección I2C de la pantalla OLED conectada a la placa ESP32. Aquí la dirección I2C es 0x3c, por lo que no podemos usar ningún otro dispositivo I2C con la misma dirección para que debemos cambiar primero la dirección I2C de ese dispositivo.
Hemos obtenido con éxito la dirección I2C de la pantalla OLED conectada con la placa ESP32.
Conclusión
Encontrar una dirección I2C al conectar múltiples dispositivos con ESP32 es importante ya que los dispositivos que comparten la misma dirección I2C no pueden conectarse a través de un solo bus I2C. El uso del código anterior puede identificar la dirección I2C y si la dirección de dos dispositivos coincide, se puede cambiar en consecuencia dependiendo de las especificaciones del dispositivo.