MICROPROCESADORES II
COMUNICACIÓN MEDIANTE INTERFAZ I2C
Grupo “B”
ESTUDIANTE:
SAMUEL EDGAR GOMEZ GERONIMO
Docente: ING. Gerson Perez Villarroel
Cochabamba 30 octubre del 2024
Gestión Il – 2024
1. Objetivos:
a. Comprender los conceptos básicos del protocolo I2C en el STM32
b. Configurar el STM32 para maneje el protocolo I2C tanto como maestro como
esclavo
2. Marco teórico:
a. Protocolo I2C:
I2C es un sistema de comunicación serial de dos cables utilizado entre circuitos
integrados que fue creado originalmente por Philips Semiconductors en 1982.
El I2C es un bus de comunicación serial multimaestro, multiesclavo, síncrono,
bidireccional y semidúplex. (stm32mcu, 2020)
• SDA (Serial Data) es la línea en la que el maestro y el esclavo envían o
reciben la información (secuencia de bits).
• SCL (Serial Clock) es la línea dedicada al reloj para la sincronización del
flujo de datos.
Figura 1. Protocolo I2C(stm32mcu, 2020)
• Modos de operación:
Modo estándar (Sm) con una tasa de bits de hasta 100 kbit/s
Modo rápido (Fm) con una tasa de bits de hasta 400 kbit/s
Fast-Mode Plus (Fm+) con una tasa de bits de hasta 1 Mbit/s
Figura 2. Operación del protocolo I2C (stm32mcu, 2020)
b. Funciones del I2C:
Basado en las funciones HAL de STM32Cube, la transferencia de datos I2C se
puede realizar en 3 modos: modo de bloqueo, modo de interrupción o modo
DMA.
• Modo de bloqueo:
La comunicación se realiza en modo de sondeo. El estado de todo el
procesamiento de datos lo devuelve la misma función una vez finalizada la
transferencia.
o Transmisión maestra HAL_I2C()
o Recepción maestra HAL_I2C()
o Transmisión esclava HAL_I2C()
o Recepción de esclavos HAL_I2C()
o Escritura de memoria HAL_I2C()
o Lectura de memoria HAL_I2C_Mem()
• Modos sin bloqueo
La comunicación se realiza mediante interrupciones o DMA. Estas funciones
devuelven el estado de inicio de la transferencia.
o Modo de interrupción:
▪ HAL_I2C_Master_Transmite_IT()
▪ HAL_I2C_Master_Recibir_IT()
▪ Transmisión esclava HAL_I2C_IT()
▪ HAL_I2C_Esclavo_Recibir_IT()
▪ Escritura de memoria HAL_I2C_IT()
▪ Lectura de memoria HAL_I2C_IT()
o Modo DMA:
▪ Transmisión maestra HAL_I2C_DMA()
▪ HAL_I2C_Master_Recepción_DMA()
▪ Transmisión DMA esclava HAL_I2C()
▪ HAL_I2C_Esclavo_Recibir_DMA()
▪ Escritura de memoria HAL_I2C_DMA()
▪ Lectura de memoria HAL_I2C_DMA()
3. Diseño del circuito:
3.1. Diseñar un programa aplicando la interfaz I2C e implementar el circuito que cumpla
la siguiente función: Se debe programar un Micro STM32F103C8T6 como maestro I2C
para controlar dos dispositivos esclavos I2C: Sensor de temperatura-I2C (DS1621) y un
LCD-I2C. El maestro debe recuperar la lectura de la temperatura ambiente del
dispositivo esclavo y reenviarlo a un LC-I2C para su visualización en tiempo real
Código :
#include "main.h"
#include "string.h"
#define DIR_ESCLAVO_LCD 0x27
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C2_Init(void);
/* USER CODE BEGIN PFP */
float vtemp;
uint8_t dato1=0x0E;
uint8_t dato2=0x20;
uint8_t temperatura[2];
uint8_t leer =0x11;
char men[16];
void lcd_enviar_com(char cmd);
void lcd_enviar_dato(char dato);
void lcd_init(void);
void lcd_enviar_string(char*str);
void lcd_enviar_in_t(int dato);
void lcd_a_xy(uint8_t x,uint8_t y);
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_I2C2_Init();
lcd_init();
lcd_enviar_com(0x01);
HAL_Delay(5);
lcd_enviar_com(0x80);
lcd_enviar_string("Temperatura: ");
while (1)
{
/* USER CODE END WHILE */
HAL_I2C_Master_Transmit(&hi2c2,0xD0,&dato1,1,HAL_MAX_DELAY);
HAL_Delay(100);
HAL_I2C_Master_Transmit(&hi2c2,0xD0,&dato2,1,HAL_MAX_DELAY);
HAL_Delay(100);
HAL_I2C_Master_Transmit(&hi2c2,0xD0,&leer,1,HAL_MAX_DELAY);
HAL_Delay(100);
HAL_I2C_Master_Receive(&hi2c2,0xD0,temperatura,2,HAL_MAX_DELAY);
HAL_Delay(100);
vtemp=(((temperatura[0])+(temperatura[1]>>6))/4.0);
lcd_a_xy(1,2);
sprintf(men,"%.2f C",vtemp);
lcd_enviar_string(men);
HAL_Delay(100);
}
}
El código trabaja mediante el protocolo I2C el donde el maestro es el STM32 y los
esclavos son el sensor de temperatura y la pantalla lcd con I2C incorporado
El cogigo consisten en cuando se de un cambio de temperatura el esclavo mandara
información que el maestro recibe para que luego se transmita esa informacion al
segundo esclavo el cual es la pantalla lcd con el modulo I2C.
4. Layout del circuito:
• Experiencia 1:
Figura 3. Layout del circuito
5. Resultados:
Figura 4. Pruebas realizadas en el laboratorio
6. Cuestionario:
a. Mencionar el criterio del algoritmo que se eligió para realizar la aplicación
designada.
R: lp primero que se hace es transmitir información al sensor y al lcd con I2c
para cada transmisión denemos que tener la dirección del integrado usado un
ejemplo del lcd era 0x27 asi igual con el sensor de temperatura y cada vez que
este tenga un valor de temperatura los datos se actualizaran en el lcd de manera
casi instantánea.
b. ¿Cuáles son las ventajas y desventajas de la interfaz I2C respecto a la interface
SPI?
R: serian:
o Ventajas de I2C:
o Utiliza solo dos pines (SDA y SCL) para la comunicación.
o Permite conectar varios dispositivos en el mismo bus.
o Cada dispositivo tiene una dirección única, lo que simplifica la
comunicación.
o Desventajas de I2C:
o Opera a velocidades más lentas (hasta 400 kHz en modo
estándar) en comparación con SPI.
o La gestión de direcciones y el protocolo de comunicación pueden
ser más complejos.
o Reducir la eficiencia en la transmisión de datos.
o Ventajas de SPI:
o Permite tasas de transferencia más altas.
o Funciona sin la necesidad de ingresar una dirección, lo que
facilita la implementación.
o Permite enviar y recibir datos simultáneamente.
o Desventajas de SPI:
o Requiere más pines para cada dispositivo (MOSI, MISO, SCK, y
CS).
o limitada cantidad de dispositivos conectables sin lógica adicional.
7. Conclusiones:
Al finalizar el laboratorio podemos ver como realmente trabaja el protocolo I2C en el
STM32 lo cual es muy simple al tener funciones especificas para iniciar el protocolo y
transmitir y recibir información pero la verificación del código es simplemente que el
código compile ya que no se puede simular correctamente usando proteus por lo que
únicamente sabremos que esta bien si implementamos el circuito. En el laboratorio el
código que realizamos si opera de manera adecuada pero nos trabamos un rato por el
sensor que no operaba de forma adecuada.
8. Bibliografía:
stm32mcu. (2020). https://wiki.st.com/stm32mcu/wiki/Getting_started_with_I2C