Académique Documents
Professionnel Documents
Culture Documents
ÍNDICE DE TABLAS
Tabla 1 Materiales y equipos ..................................................................................................... 5
LABORATORIO 6
COMUNICACIÓN MEDIANTE INTERFAZ I2C
1. INTRODUCCIÓN
La interfaz I2C, diseñada por Philips Semiconductor (ahora NXP Semiconductors), ofrece una
solución versátil y de bajo costo para establecer conexiones seriales entre múltiples dispositivos
en un sistema. Su arquitectura maestro-esclavo, combinada con su capacidad para soportar
múltiples dispositivos en el mismo bus, la convierte en una opción atractiva para aplicaciones
que requieren una comunicación fiable y eficiente.
En este informe, exploraremos a fondo los fundamentos de la interfaz I2C, analizando sus
características, protocolo de comunicación, ventajas y desafíos asociados. Además,
examinaremos casos de uso prácticos y ejemplos de implementación, destacando cómo la
interfaz I2C ha contribuido significativamente al desarrollo de sistemas embebidos modernos.
Este informe busca proporcionar una comprensión sólida de la interfaz I2C, su aplicación en el
mundo real y su relevancia continua en el ámbito de la electrónica y la ingeniería de sistemas.
2. OBJETIVOS
2.1. OBJETIVO GENERAL
• Diseñar e implementar un sistema de comunicación eficiente utilizando la interfaz I2C en
microcontroladores ARM Cortex-M3 de 32 bits, integrando sensores, configurando el
periférico de Conversión Analógico a Digital (ADC) y gestionando los puertos del
microcontrolador, con el propósito de lograr una comunicación fluida y confiable entre
dispositivos periféricos.
3. FUNDAMENTO TEÓRICO
3.1. Interfaz I2C
La Interfaz I2C (Inter-Integrated Circuit) es un protocolo de comunicación seriale diseñado
para la interconexión de microcontroladores, sensores, memoria y otros periféricos en
sistemas embebidos. Desarrollada por Philips Semiconductor (ahora NXP Semiconductors),
I2C opera sobre dos líneas: SDA (Serial Data Line) y SCL (Serial Clock Line), permitiendo
la comunicación simultánea de múltiples dispositivos en un mismo bus. Su estructura
maestro-esclavo y capacidad para soportar múltiples dispositivos hacen que sea una
elección común en sistemas embebidos.
4. MATERIALES Y EQUIPOS
MATERIAL CANTIDAD
Stm32F103C8T6 1
Protoboard 1
ST-LINK V2 1
Pantalla OLED 1
Tabla 1 Materiales y equipos
5.2. CÓDIGO
PASO 4. GENERAR CÓDIGO
main.c
/* Natalia Berrocal Gamez Header */
/**
**************************
* @file : main.c
**************************
* @attention
* This software is licensed under terms that can be found in the LICENSE file
**************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "gpio.h"
#include "fonts.h"
#include "ssd1306_oled.h"
#include "stdio.h"
void SystemClock_Config(void);
float tCelsius = 0;
float tFahrenheit = 0;
float RH = 0;
uint8_t TFI = 0;
uint8_t TFD = 0;
char strCopy[15];
__HAL_TIM_SET_COUNTER(&htim1, 0);
uint8_t Response = 0;
GPIO_InitStructPrivate.Pin = DHT11_PIN;
GPIO_InitStructPrivate.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructPrivate.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStructPrivate.Pull = GPIO_NOPULL;
GPIO_InitStructPrivate.Mode = GPIO_MODE_INPUT;
GPIO_InitStructPrivate.Pull = GPIO_PULLUP;
microDelay (40);
microDelay (80);
pMillis = HAL_GetTick();
cMillis = HAL_GetTick();
cMillis = HAL_GetTick();
return Response;
uint8_t a,b;
for (a=0;a<8;a++)
pMillis = HAL_GetTick();
cMillis = HAL_GetTick();
cMillis = HAL_GetTick();
else
b|= (1<<(7-a));
pMillis = HAL_GetTick();
cMillis = HAL_GetTick();
cMillis = HAL_GetTick();
return b;
int main(void)
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM1_Init();
HAL_TIM_Base_Start(&htim1);
SSD1306_Init();
while (1)
if(DHT11_Start())
// Can use RHI and TCI for any purposes if whole number only needed
RH = (float)RHI + (float)(RHD/10.0);
sprintf(strCopy,"LABO I2C");
SSD1306_UpdateScreen();
HAL_Delay(2000);
void SystemClock_Config(void)
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
Error_Handler();
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
Error_Handler();
}
/**
* @retval None
*/
void Error_Handler(void)
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* @retval None
*/
/* User can add his own implementation to report the file name and line number,
#endif /* USE_FULL_ASSERT */
I2C.c
/**
**************************
* @file i2c.c
* @attention
* This software is licensed under terms that can be found in the LICENSE file
**************************
*/
/* Includes ------------------------------------------------------------------*/
#include "i2c.h"
I2C_HandleTypeDef hi2c1;
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
if(i2cHandle->Instance==I2C1)
__HAL_RCC_GPIOB_CLK_ENABLE();
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_RCC_I2C1_CLK_ENABLE();
if(i2cHandle->Instance==I2C1)
__HAL_RCC_I2C1_CLK_DISABLE();
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
6. CONCLUSIONES
• Se ha adquirido la capacidad de realizar conversiones de señales analógicas a digitales
de manera efectiva, utilizando la configuración apropiada del I2C. Esto nos permite
obtener datos digitales de alta calidad de las señales analógicas que deseamos medir.
• En resumen, hemos alcanzado con éxito los objetivos planteados para el manejo de
puertos I2C en un STM32 Blue Pill. Hemos adquirido un sólido fundamento teórico y
práctico que nos permite configurar, utilizar y aprovechar eficazmente el I2C de este
microcontrolador en diversas aplicaciones electrónicas.
7. BIBLIOGRAFÍA
• https://www.carlospes.com/curso_de_lenguaje_c/01_09_01_02_especificadores_de_for
mato.php
• https://imt4blog.files.wordpress.com/2019/10/adc.pdf
• https://www.digikey.com/en/maker/projects/getting-started-with-stm32-working-with-adc-
and-dma/f5009db3a3ed4370acaf545a3370c30c