- ¿Qué es el protocolo de comunicación I2C?
- ¿Cómo funciona la comunicación I2C?
- ¿Dónde utilizar la comunicación I2C?
- I2C en Nuvoton N76E003 - Requisito de hardware
- Interfaz AT24LC64 con Nuvoton N76E003 - Diagrama de circuito
- Pines I2C en Nuvoton N76E003
- Comunicación I2C en N76E003
- Programación de N76E003 para comunicación I2C
- Destellando el código y la salida
En el vasto sistema de aplicaciones integradas, ningún microcontrolador puede realizar todas las actividades por sí mismo. En algún momento, tiene que comunicarse con otros dispositivos para compartir información, existen muchos tipos diferentes de protocolos de comunicación para compartir esta información, pero los más utilizados son USART, IIC, SPI y CAN. Cada protocolo de comunicación tiene sus propias ventajas y desventajas. Centrémonos en la parte IIC por ahora, ya que eso es lo que vamos a aprender en este tutorial. Si es nuevo aquí, consulte los Tutoriales de Nuvoton donde hemos discutido todos los periféricos del Microcontrolador N76E003 desde el tutorial básico de introducción. Si desea aprender a usar I2C con otros microcontroladores, puede consultar los enlaces a continuación.
- Cómo usar I2C en Arduino: comunicación entre dos placas Arduino
- Comunicación I2C con el microcontrolador PIC PIC16F877
- Interfaz LCD 16X2 con ESP32 usando I2C
- Comunicación I2C con MSP430 Launchpad
- Interfaz de LCD con NodeMCU sin usar I2C
- Cómo manejar múltiples comunicaciones (I2C SPI UART) en un solo programa de Arduino
I2C es un importante protocolo de comunicación desarrollado por Philips (ahora NXP). Con este protocolo I2C, una MCU se puede conectar con varios dispositivos e iniciar la comunicación. I2C funciona con solo dos cables, a saber, SDA y SCL. Donde SDA significa Serial data y SCL significa Serial Clock. Sin embargo, estos dos pines requieren resistencias pull-up al nivel de voltaje VCC y con una resistencia pull-up adecuada, el bus podría admitir 127 dispositivos con una dirección única.
¿Qué es el protocolo de comunicación I2C?
El término IIC significa " Circuitos Inter integrados ". Normalmente se denota como I2C o I al cuadrado C o incluso como protocolo de interfaz de 2 cables (TWI) en algunos lugares, pero todo significa lo mismo. I2C es un protocolo de comunicación síncrono, lo que significa que ambos dispositivos que comparten la información deben compartir una señal de reloj común. Tiene solo dos cables para compartir información, de los cuales uno se usa para la señal del reloj y el otro se usa para enviar y recibir datos.
¿Cómo funciona la comunicación I2C?
La comunicación I2C fue introducida por primera vez por Phillips. Como se dijo anteriormente, tiene dos cables, estos dos cables se conectarán a través de dos dispositivos. Aquí, un dispositivo se llama maestro y el otro dispositivo se llama esclavo. La comunicación debe ocurrir y siempre ocurrirá entre dos, un maestro y un esclavo. La ventaja de la comunicación I2C es que se puede conectar más de un esclavo a un maestro.
La comunicación completa se lleva a cabo a través de estos dos cables, a saber, Serial Clock (SCL) y Serial Data (SDA).
Serial Clock (SCL): comparte la señal de reloj generada por el maestro con el esclavo
Datos en serie (SDA): envía los datos hacia y desde el maestro y el esclavo.
En un momento dado, solo el maestro podrá iniciar la comunicación. Dado que hay más de un esclavo en el bus, el maestro debe referirse a cada esclavo utilizando una dirección diferente. Cuando se trata, solo el ungüento con esa dirección en particular responderá con la información mientras que los demás se quedan callados. De esta forma, podemos usar el mismo bus para comunicarnos con múltiples dispositivos.
¿Dónde utilizar la comunicación I2C?
La comunicación I2C se utiliza solo para comunicaciones de corta distancia. Ciertamente, es confiable hasta cierto punto, ya que tiene un pulso de reloj sincronizado para hacerlo inteligente. Este protocolo se utiliza principalmente para comunicarse con el sensor u otros dispositivos que deben enviar información a un maestro. Es muy útil cuando un microcontrolador tiene que comunicarse con muchos otros módulos esclavos utilizando un mínimo de solo cables. Si está buscando una comunicación de largo alcance, debe probar RS232 y si está buscando una comunicación más confiable, debe probar el protocolo SPI.
I2C en Nuvoton N76E003 - Requisito de hardware
Como el requisito de este proyecto es aprender la comunicación I2C usando N76E003, usaremos una EEPROM que se conectará con la línea de datos I2C. Almacenaremos algunos datos en la EEPROM y también los leeremos y los mostraremos usando la pantalla UART.
Como el valor almacenado se imprimirá en la UART, se requiere cualquier tipo de convertidor de USB a UART. También puede consultar el tutorial sobre UART con Nuvoton si es nuevo en la comunicación UART en N76E003. Para nuestra aplicación, usaremos el conversor CP2102 UART a USB. Aparte de lo anterior, también requerimos los siguientes componentes:
- EEPROM 24C02
- 2 resistencias de 4.7k
Sin mencionar que, además de los componentes anteriores, necesitamos una placa de desarrollo basada en microcontroladores N76E003, así como el programador Nu-Link. Además, la placa de pruebas y los cables de conexión también son necesarios para conectar todos los componentes.
Interfaz AT24LC64 con Nuvoton N76E003 - Diagrama de circuito
Como podemos ver en el esquema a continuación, la EEPROM está conectada en la línea I2C junto con dos resistencias pull up. En el extremo izquierdo, se muestra la conexión de la interfaz de programación.
Usé una placa de pruebas para el AT24LC64 IC y conecté el IC a mi placa programadora nuvoton usando cables de puente. Mi configuración de hardware junto con el programador nu-ink se muestra a continuación.
Pines I2C en Nuvoton N76E003
El diagrama de pines de N76E003 se puede ver en la siguiente imagen:
Como podemos ver, cada pin tiene especificaciones diferentes y cada pin se puede utilizar para múltiples propósitos. Sin embargo, el pin 1.4 se usa como pin I2C SDA, perderá el PWM y otras funciones. Pero eso no es un problema ya que no se requiere otra funcionalidad para este proyecto. Lo mismo pasará con el P1.3 es el pin SCL de I2C.
Dado que los pines I2C actúan como GPIO, es necesario configurarlo. Todos los pines GPIO se pueden configurar en el modo que se describe a continuación.
De acuerdo con la ficha técnica, PxM1.n y PxM2. n son dos registros que se utilizan para determinar la operación de control del puerto de E / S. En la hoja de datos, se indica que para usar la funcionalidad I2C, los modos de E / S deben usarse como drenaje abierto para comunicaciones relacionadas con I2C.
Comunicación I2C en N76E003
El periférico I2C es importante para cualquier unidad de microcontrolador que admita funciones I2C. Muchos tipos de microcontroladores diferentes vienen con un periférico I2C incorporado. Sin embargo, en algunos casos, I2C se puede configurar manualmente usando el control de software donde el soporte de hardware relacionado con I2C no está disponible (por ejemplo, muchos microcontroladores 8051). Sin embargo, el nuvoton N76E003 viene con soporte periférico I2C.
M76E003 admite cuatro tipos de operaciones en los modos I2C: transmisor maestro, receptor maestro, transmisor esclavo y receptor esclavo. También admite velocidades estándar (100 kbps) y rápidas (hasta 400 kbps) para la línea I2C. I2C funciona con pocas reglas genéricas en las líneas de señal SCL y SDA.
Condición de inicio y parada:
Es algo importante en la comunicación I2C. Cuando se transfieren datos a la línea I2C, comienza con la condición de inicio y termina con una condición de parada.
La condición de inicio es la transición de alto a bajo en el SDA cuando la línea SCL es alta y la condición de parada es la transición de bajo a alto en el SDA cuando la línea SCL es alta. Estas dos condiciones son generadas por el maestro (la MCU o cualquier cosa que controle los otros dispositivos esclavos). La línea de bus permanece ocupada en este estado cuando se inicia la condición de inicio y permanece libre nuevamente cuando se inicia la condición de parada.
La condición de arranque y parada se muestra excelentemente en la perspectiva de la señal en la hoja de datos N76E003-
Dirección de 7 bits con formato de datos:
N76E003 admite una dirección de 7 bits y un formato de datos. Una vez iniciada la condición de inicio, el dispositivo maestro debe enviar los datos a la línea I2C. El primer dato es importante. Si estos datos no se crean o transmiten correctamente, el dispositivo conectado no se identificará y no se podrán realizar más comunicaciones.
Los datos constan de una dirección esclava de 7 bits de longitud, denominada SLA. Esta dirección de 7 bits debe ser única para cada dispositivo si hay varios dispositivos conectados en el bus. Después de la dirección de 7 bits, el octavo bit es el bit de dirección de datos. Eso significa que, dependiendo del octavo bit, el maestro envía la información al dispositivo esclavo sobre si los datos se escribirán en el dispositivo esclavo o si los datos se leerán desde el dispositivo esclavo. El octavo bit es el bit R / W denominado notificador de lectura o escritura. Como todos sabemos, la información de 8 bits puede ser de 128 tipos, por lo que admite 128 dispositivos, pero I2C admite 127 tipos de dispositivos en el mismo bus, pero no 128. Porque la dirección 0x00 es una dirección reservada que se denomina dirección de llamada general. Si el maestro quiere enviar información a todos los dispositivos,se dirigirá a 0x00 y cada dispositivo se reproducirá de la misma manera que las configuraciones de software individuales.
Por lo tanto, la transmisión de datos se ve a continuación:
Reconocer:
En la imagen de dirección de datos anterior, el noveno bit seguido por el bit R / W se denomina bit de reconocimiento. Es importante porque al usar este bit, el maestro o esclavo responde al transmisor de datos bajando la línea SDA. Para obtener el bit de reconocimiento, el transmisor necesita liberar la línea SDA.
Programación de N76E003 para comunicación I2C
El programa completo utilizado en este tutorial se puede encontrar al final de esta página. La explicación de segmentos importantes en el código es la siguiente:
Establezca los pines como drenaje abierto y configúrelos para I2C:
Comencemos primero con la sección de pines I2C. Como se describió anteriormente, los puertos I2C SCL y SDA deben configurarse y establecerse como configuración de drenaje abierto. Para ello, estamos utilizando un archivo de cabecera I2C.h junto con un archivo de origen I2C.c . El fragmento de código se ve así:
hacer {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} mientras (0)
El código anterior establece el P13 y P14 como pin de drenaje abierto y clr_I2CPX se usa para seleccionar el P13 y P14 como pin SCL en P1.3 y pin SDA en P1.4.
Este I2CPX es el bit 0 del registro de control I2C I2CON. Si este I2C_PX se establece como 1, los pines se cambian a P0.2 como SCL y P1.6 como SDA. Sin embargo, usaremos P13 y P14. Aquí no se utilizan pines alternativos.
Registro de control I2C I2CON:
El registro de control I2C I2CON se utiliza para controlar las operaciones I2C. El primer bit es el bit de selección de pin I2C. Al establecerlo en 0, se configura el pin I2C como P13 y P14.
El bit AA es la bandera de confirmación de reconocimiento, si la bandera AA está activada, se devolverá un ACK durante el pulso de reloj de confirmación de la línea SCL. Si se borra, se devolverá un NACK (nivel alto en SDA) durante el pulso de reloj reconocido de la línea SCL.
El siguiente bit es SI, que es la interrupción de estado I2C. Si la interrupción de estado I2C está habilitada, el usuario debe verificar el registro I2STAT para determinar qué paso se ha pasado y debe tomar la acción.
STO es la bandera de PARADA que se configura en el modo maestro. STO se borra automáticamente por hardware una vez que se ha detectado la condición de STOP .
El siguiente bit es el bit STA. Si esta bandera está activada, I2C genera una condición de ARRANQUE si el bus está libre. Si el bus está ocupado, el I2C espera una condición de PARADA y genera una condición de ARRANQUE a continuación. Si STA se establece mientras el I2C ya está en el modo maestro y se han transmitido o recibido uno o más bytes, el I2C genera una condición de INICIO repetida. El STA debe borrarse manualmente mediante el software.
El último, I2CEN es el bit de habilitación o deshabilitación del bus I2C.
EEPROM 24C02:
Ahora, llegando al 24C02. El paquete de soporte de placa del N76E003 tiene un código I2C para el 24LC64 y se puede modificar fácilmente. Sin embargo, usaremos un método simple para comprender la función I2C.
Si alguien quiere usar una interfaz detallada con EEPROM 24C02, entonces se puede usar el programa EEPROM en el BSP.
Solo conectaremos el 24C02 en I2C donde el N76E003 será maestro y la EEPROM será esclavo. Por lo tanto, escribiremos cualquier dato en la dirección EEPROM y lo leeremos.
La distribución de pines EEPROM 24C02 se muestra a continuación:
A0, A1 y A2 son tres pines de selección de dirección. Los pines WP son pines de protección contra escritura y deben conectarse con VSS para permitir la escritura en la EEPROM.
La funcionalidad Byte Write se muestra en la siguiente imagen:
El ciclo de escritura completo ocurre con un bit de inicio. Después de eso, es necesario enviar el byte de control. En el byte de control, se requieren las siguientes cosas:
Después del bit de inicio, consta de la dirección del esclavo. 1010 es la estática y A0, A1 y A2 son la dirección basada en la conexión de hardware. Si los tres pines están conectados con GND o VSS, se leerá como 0. De lo contrario, si está conectado con VCC, se leerá como 1. En nuestro caso, todos los A0, A1 y A2 están conectados con VSS. Por lo tanto, todos estos serán 0.
Gasto en la condición de lectura o escritura. El valor de la dirección con el bit de lectura o escritura será - 0xA0 para escritura y 0xA1 para lectura. El siguiente es el bit de reconocimiento y después de eso, se transmitirá una dirección de 8 bits donde se deben almacenar los datos y, finalmente, los datos que se almacenarán en la ubicación respectiva. Estas cosas se hacen en un formato paso a paso en la función principal.
Función principal y bucle while:
void main (vacío) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Importante, use la función prinft debe establecer TI = 1; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n El valor leído es% x", c & 0xff); }; }
La función principal es simple, continuamente escribe valores en la EEPROM en la dirección 1 y lee los datos. Luego, los datos se imprimen utilizando la función printf. Printf está imprimiendo el valor en hexadecimal.
La función de escritura EEPROM consta de las siguientes cosas que se describieron en la sección EEPROM:
void EEPROM_write (dirección de caracteres sin firmar, valor de caracteres sin firmar) {I2C_start (); I2C_write (0xA0); I2C_write (dirección); I2C_write (valor); I2C_stop (); }
La función de inicio I2C consta de las siguientes cosas:
void I2C_start (void) {tiempo int firmado = tiempo de espera; set_STA; clr_SI; while ((SI == 0) && (tiempo> 0)) {tiempo--; }; }
En esta función, se comprueba el estado de SI junto con el período de tiempo de espera predefinido (definido en I2C.h, donde el tiempo predefinido se establece en 1000). La función de inicio comienza con configurar el STA y borrar el SI.
void I2C_stop (void) {tiempo int firmado = tiempo de espera; clr_SI; set_STO; while ((STO == 1) && (tiempo> 0)) {tiempo--; }; }
Se utiliza la misma que la función Start, stop. La función de parada se inicia configurando el STO seguido de borrar el SI. La siguiente función es la función de lectura I2C:
unsigned char I2C_read (unsigned char ack_mode) {tiempo int firmado = tiempo de espera; valor de carácter sin signo = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {tiempo--; }; valor = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {tiempo--; }; } valor de retorno; }
El ack_mode y I2C_NACK , ambos se definen en el archivo de encabezado I2C como 0 y 1 respectivamente.
Del mismo modo, se crea la función de escritura:
void I2C_write (valor de carácter sin firmar) {tiempo int firmado = tiempo de espera; I2DAT = valor; clr_STA; clr_SI; while ((SI == 0) && (tiempo> 0)) {tiempo--; }; }
Destellando el código y la salida
El código devolvió 0 advertencia y 0 errores y el Keil lo mostró utilizando el método de parpadeo predeterminado. Si es nuevo, consulte el tutorial de introducción a nuvoton para comprender cómo cargar código. La información de compilación del código se puede encontrar a continuación.
Generar destino 'I2C_EEPROM' compilando I2C_EEPROM.c… compilando I2C.c… vinculando… Tamaño del programa: datos = 59.2 xdata = 0 código = 2409 creando archivo hexadecimal desde ". \ Output \ I2C_EEPROM"… ". \ Salida \ I2C_EEPROM "- 0 Error (s), 0 Advertencia (s). Tiempo de compilación transcurrido: 00:00:04 Resumen de compilación por lotes: 1 se realizó correctamente, 0 falló, 0 se omitió - Tiempo transcurrido: 00:00:04
El hardware se está configurando en una placa de pruebas y funciona como se esperaba. Como puede ver en la imagen a continuación, pudimos escribir un valor en EEPROM y leerlo de la memoria y mostrarlo en el monitor en serie.
Vea el video que se muestra a continuación para obtener una demostración completa de cómo funciona la placa para este código. Espero que hayas disfrutado del tutorial y hayas aprendido algo útil. Si tienes alguna pregunta, déjala en la sección de comentarios a continuación. También puede utilizar nuestros foros para publicar otras preguntas técnicas.