0% encontró este documento útil (0 votos)
12 vistas14 páginas

Protocolo I2C y UART en Microcontroladores

Este documento presenta información sobre protocolos de comunicación I2C y serial. Describe el funcionamiento del módulo I2C incluyendo las señales SDA y SCL, y el protocolo maestro-esclavo. También explica el funcionamiento de la UART incluyendo la transmisión y recepción de datos asíncronos.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
12 vistas14 páginas

Protocolo I2C y UART en Microcontroladores

Este documento presenta información sobre protocolos de comunicación I2C y serial. Describe el funcionamiento del módulo I2C incluyendo las señales SDA y SCL, y el protocolo maestro-esclavo. También explica el funcionamiento de la UART incluyendo la transmisión y recepción de datos asíncronos.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Informe Practica 3

Estudiantes:

Pedro Luis Acosta Díaz


Carlos Humberto Diaz De Luque
Tatiana Isabel Cusguen Jaramillo

Introducción.
Desarrollo de la práctica.
Mire las secciones de la guía de la práctica y responda cada una de manera detallada, no olvide
incluir esquemáticos y PCB.
Objetivo General: Conocer y aplicar los protocolos de comunicación I2C y serial en un
microcontrolador.
Objetivos Específicos
1. Diseñar una máquina de estados para dar solución a un problema de comunicación serial,
detectando errores.
2. Identificar el protocolo i2C a nivel de protocolo software y hardware.
3. Implementar la solución propuesta en un microcontrolador mediante lenguaje C.
4. Utilizar herramientas de depuración hardware-software.
Pre- requisitos
Módulo I2C (Inter-Integrated circuit)

Ilustración 1 Bloques Modulo I2C


El módulo I2C proporciona una interfaz síncrona entre el microcontrolador y otro dispositivo
compatible con bus serial I2C de dos hilos. Los dispositivos se comunican en un entorno de
host/client, la interfaz en hardware soporta Modo Master, Modo esclavo con byte NACKing y
Modo Multi-Master.
El bus I2C presenta dos conexiones de señal: Reloj Serial (SCL) y Datos en serie (SDA). Ambas
conexiones son bidireccionales líneas de drenaje abierto, requieren resistencias pull-up en la
alimentación. Dejar la línea abierta se considera un uno y cerrada un cero. Cada transacción en el
bus tiene que ser iniciada por el host.
Para iniciar una comunicación I2C el dispositivo host envia un bit de inicio seguido por el byte
de dirección del usuario con el cual se quiere comunicar, seguido de un bit de lectura o escritura
el cual indica si el host quiere transmitir o recibir datos del usuario. El usuario solicitado
responderá con un bit de reconocimiento (ACK), luego el host continuará transfiriendo datos
hasta finalizar con un bit de stop. La comunicación es de datos de 8bits más un bit de
reconocimiento.
Para configurar los pines SDA Y SCL TRIS ODCON Registros de control RXY12C

Ilustración 2 Condiciones de inicio y parada


El tiempo de espera del pin SDA se configura por SDAHT [1:0] del registro I2CXCON2. Es el
tiempo que el SDA es válido después del flanco descendente del SCL, La condición de inicio se
da con el flanco de bajada del SDA mientras el SCL está en alto, esta condición es generada por
el host. Host espera bit BFRE de 12CxSTAT0 antes de afirmar condición de inicio. La condición
de para se da con el flanco de subida de SDA mientras el SCL está en alto. La condición de
restart es válida cuando ya se ha realizado una condición de inicio.
Ilustración 3 Condiciones de restart
El noveno ciclo de reloj en toda transferencia de datos se dedica al bit de reconocimiento, para
ello el transmisor debe liberar el control de la línea en ese tiempo para cambiar la respuesta, el
bit ACK es activo en bajo, debido a que las dos líneas se mantienen en alto mientras no haya
transmisión, este valor se asigna al bit ACKSTAT del registro 12C1CON1. Si alguno de los
RXRE, TXWE, RXO o los bits TXU están configurados, la respuesta del hardware se fuerza a
NACK.
UART
 Funcionamiento:
La transmisión consta de un bit de inicio seguido de 7 u 8 bits de datos uno de paridad o
dirección y uno o más bits de parada. Cada bit transmitido persiste durante un periodo de
1/(Baud Rate). La UART transmite y recibe el bit menos significativo LSB primero, el transmisor
y receptor son funcionalmente independiente, pero comparten el mismo formato de datos y
baud rate.
El funcionamiento del módulo UART está controlado a través de diecinueve registros:
- Tres registros de control (UxCON0-UxCON2)
- Habilitación y estado de error (UxERRIE, UxERRIR, UxUIR)
- Estado del buffer UART y su control (UxFIFO)
- Tres de 8 bits para los parámetros de protocolo (UxP1-UxP3)
- Generador de velocidad en baudios de 16 bits (UxBRGH:L)
- Transmisión del buffer de escritura (UxTXB)
- Recibir el buffer de lectura (UxRXB)
- Recibir checksum (UxRXCHK)
- Transmitir Checksum (UxTXCHK)
La transmisión comienza al escribir un dato en el registro UxTXB, si es el primer dato, será
transferido inmediatamente al registro de desplazamiento (TSR) ya que se conectan en paralelo,
pero si existe un dato anterior que no se ha transmitido por completo por el TSR, el nuevo dato
se mantiene en UXTXB y se transmitira apenas se terminen todos los bits de parada del dato
anterior. Cuando el TSR está ocupado y hay un dato en espera en el UXTXB el bit UXTXIF será
0, mientras que será 1 cuando el UXTXB esté vacio. El UXTXIF es un bit de solo lectura.
Cuando se requiere enviar más de un dato se habilita UXTXIE para enviar la interrupción y se
limpia cuando el UXTXB esté lleno.
El bit TXMTIF indica el estado del TSR, será 1 cuando el TSR esté vacio e inactivo, se hayan
enviado todos los bits de parada y el UXTXB esté vacio y 0 cuando cuando se transfiera un dato
de la UXTXB al TSR.
Para configurar la transmisión se debe seguir:
1. Inicializar el par de registros UXBRGH, UXBRGL y el bit BRGS con ON=0.
UXBRGH=0x0 UXBRGL=0x1 y BRG =1.
2. Establecer los bits MODE [3:0] en el modo asincrónico. [0000] Para modo
asíncrono de 8 bits
3. Habilitar el puerto serie asíncrono con el bit ON.
4. Habilitar el transmisor con el bit TXEN de control, para habilitar la interrupción
con el bit UXTXIF
5. Para interrupciones habilitar UXTXIE en el registro PIE y GIE en el registro
INTCON0
6. Escribir un byte en el registro UXTXB para comenzar la transmisión
7. Esperar que UXTXIF sea 1 para para enviar el byte posterior. A continuación, se
muestra el diagrama de bloques del transmisor UART.

A continuación, se muestra el diagrama de bloques del transmisor UART.


Ilustración 4: Diagrama de bloques transmisión de UART

Ilustración 5: Diagrama de tiempo de comunicación UART


Para la recepción asíncrona se reciben los datos por el pin TX, puede recibir dos paquetes de
datos de 8 bits, debido a que son transferidos a una memoria de dos caracteres tipo FIFO first
input first output, se puede acceder a los datos recibidos por el registro UXRXB.
El circuito de recuperación de datos del receptor inicia en el flanco descendiente del bit de inicio,
que debe ser siempre un 0. Cuando se considera un bit de inicio no valido el sistema de
recepción aborta la recepción al generar un error y reanuda la búsqueda del flanco descendiente
del bit de inicio.
El circuito de recuperación de datos cuenta los relojes BRG en Highspeed hay cuatro relojes
BRG por bit y se toma una muestra por bit, en Normal speed hay 16 relojes BRG por bit y se
toman 3 muestras por bit. El flanco descendiente inicia el generador de velocidad en baudios
BRG, la entrada se muestre en el primero y segundo reloj BRG, si ambas muestras son altas se
considera un error y vuelve al bit de inicio sin generar error, si una de las muestras es baja
contina contando y toma muestras en los relojes 7, 8 y 9. Si menos de dos muestras son bajos el
bit de inicio se considera invalido y aborta la recepción.
Cuando el bit de inicio es válido el contador de reloj BRG continua y se reinicia en 16.
Después de que se recibieron los últimos bits de parada, el carácter en el RSR se transmite al
registro FIFO de recepción y se establece la bandera de interrupción UXRXIF, Cuando se lee el
dato de la UXRXB el dato superior del FIFO se transferirá al UXRXB.
Para configurar la recepción asíncrona se debe:
1. Inicializar el par de registros UXBRGH, UXBRGL y el bit BRGS (multiplicador BRGS=1
X4 ; BRGS=0 X16) para lograr el baud rate deseado. Siendo este de 16 bits, solo pueden ser
escritos con ON=0.
2. Configurar el registro RXPPS para el RX deseado
3. Borrar el bit ANSEL para el pin RX
4. Establezca los bits MODE [3: 0] Recepción asincrónica de 8 bits [0000]
5. Habilitar el puerto serial con el bit ON
6. Para interrupciones establecer el bot UXRXIE en el registro PIEX y los bits GIE en el
registro INTCON0
7. Habilitar la recepción ajustando el bit RXEN
8. Lea el registro UxERRIR para obtener el error de las banderas.
9. Leer el registro UXRXB para obtener el byte recibido
10. En caso de overflow borrar el bit RXFOIF

El bit de bandera de interrupción UxRXIF se establecerá cuando el carácter se transfiere del RSR
al recibir búfer. Se generará una interrupción si también se establece el bit de habilitación de
interrupciones UxRXIE.
Se muestra el diagrama de bloques del proceso de recepción

Ilustración 6: Diagrama de bloques del receptor


Ilustración 7: Diagrama de tiempo a recepción asíncrona
Modo Host – 7 bit Address

Ilustración 8: I2C HOST, 7 – BIT address, transmission

Para realizar una comunicación en este caso de escritura (ilustración 8), se debe enviar el byte
con la dirección del cliente más el bit de R/W = 0, seguido de la dirección en memoria a la que se
desea leer, que en este caso empleará 2 bytes, el primero enviado corresponderá a los bits más
significativos y el siguiente byte los 8 menos significativos y por el ultimo el byte con el dato a
guardar en memoria. Para lo cual se deben configurar los registros de control como el bit EN, S,
ADB, luego se asigna el primer byte en el I2CXTXB y se debe esperar a que el bit TXBE quede
en alto, lo cual nos indica que el buffer de transmisión está vacío y seguidamente para verificar
que la transmisión haya sido recibida con el cliente se verifica si hubo ACK por medio del bit
ACKDT, también se puede la transmisión de los 9 bits con el decremento del contador
I2CXCTN, para lo cual se debe ajustar al incio con la cantidad de bytes-1 a enviar durante la
transmisión en este caso 3, se realiza el mismo procedimiento de envió para los otros bytes,
luego de enviado el cuarto byte se procede a ajustar la condición de stop cuando I2CXCTN=0.
Ilustración 2: I2C HOST, 7 BIT ADDRESS, RECEPTION

 Memoria EEPROM 24LC256

Ilustración 3: Diagrama general de bloques de memoria 24LC256


La memoria posee un tamaño de 32K con palabras de 8 bits, trabaja a una frecuencia máxima de
400kHz, posee tres entradas configurables como dirección (A0, A1, A2) un pin de protección de
escritura WP, donde el pin en alto impide la escritura en memoria y emplea el protocolo I2C.
Como se observa en la ilustración 11.
Ilustración 4: Byte de control

Ilustración 13: Secuencia de dirección en memoria


De acuerdo con la ilustración 11, el primer byte de dirección enviado por el host debe contener
código de control 1010 seguido de los 3 bits configurables de 8 formas distintas. Sí se desea
acceder a una posición en memoria debe seguir el formato presentado en la ilustración 12, en la
cual el siguiente byte enviado representa los 7 bits más significativos de la posición (2^15), y el
siguiente comando enviado representa los 8 menos significativos.

Ilustración 14: Secuencia escritura en memoria.


Ilustración 15: Secuencia lectura en posición actual
Después de enviada los bytes con la dirección a acceder en memoria el contador de la memoria quedará
cargado con este valor, para escritura lo que se debe hacer seguidamente es mandar el dato en el
siguiente byte, mientras que para lectura existen 3 formas de las cuales una es lectura de la posición
actual, donde se leerá la ultima posición a la que haya sido cargado el contador Ilustración 14, por lo
cual solo debe enviar el byte de control con el bit R/W en 0, el otro caso Ilustración 15, se deberá poner
el bit R/W=1 luego deben enviarse los dos bytes con la dirección con el fin de que el contador termine
apuntando a ésta, se realiza un reset y se lee de misma forma que ilustración 14

Resultados.

Máquina de estados
Previo a la práctica se debe diseñar una máquina de estados que se ejecuta con cada dato recibido
por el puerto seria, dando solución al problema que utilizando una memoria (24LC256) unos
datos binarios que se envían.
Tal como se aprecia en la máquina de estados finitos expuesta en la Ilustración 14, podemos ver
que se cuenta con bifurcaciones similares a árboles de decisiones, donde dependiendo de qué
reciba inicialmente la máquina, procederá a hacer lectura o escritura. Activando funciones y
evaluando condicionales que permitan realizar dichos procesos de manera efectiva.
Ilustración 16 Máquina de estados

Ahora, una vez concebida la máquina de estados e implementado el código, se procede a realizar
una prueba estructurada de estos mismos, donde primero escribimos el comando
WB(acompañado de la dirección y valor a escribir en dicha posición), que como se ve en la
Ilustración 16, procederá e enviarnos al estado 6, realizará acciones de escritura y luego
procederá a volver al estado uno.

Ilustración 17 Prueba comando escribir byte

En la Ilustración 17 podemos ver cómo se hace el proceso de escritura por medio de


comunicación I2C.
Ilustración 18 Datos I2C WB
En la ilustración 20, procedemos evidenciar cómo quedó guardada la posición seleccionada
previamente.

Ilustración 19 Prueba comando leer byte

En la Ilustración 18 podemos ver cómo se hace el proceso de lectura por medio de comunicación
I2C.
Ilustración 20 Datos I2C RB
En la ilustración 19, procedemos evidenciar el funcionamiento de la lectura de varios bytes.

Ilustración 21 Prueba comando leer varios bytes


Conclusiones.

 El valor de la resistencia de pull-up que se coloca en las líneas de datos SDA y SCL es
muy importante pues son las que conectan el circuito y deja de ser un circuito abierto, de
igual manera estas resistencias influyen en las frecuencias que se estén manejando. Se
recomienda trabajar con resistencias de 4,7 a 1K para trabajar de manera óptima.
 Empleando el protocolo I2C se tiene una confirmación trans cada transferencia de datos
realizada casi inmediatamente, lo cual nos permite saber si el receptor está funcionando
correctamente, esto debido a que existe un único bus de datos bidireccional, siendo esta a
su vez una ventaja con respecto a otros protocolos como el SPI que requiere de más
conexiones y se vuelve más complejo a la hora de conectar muchos esclavos.
Referencias
[1]"I2C - Puerto, Introducción, trama y protocolo - HETPRO/TUTORIALES",
HETPRO/TUTORIALES, 2022. [Online]. Available:
[Link] [Accessed: 18- May- 2022].
[2]R. International, "Qué es UART", [Link], 2022. [Online]. Available:
[Link]
que-es-uart_254524.html. [Accessed: 18- May- 2022]..

También podría gustarte