/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
int main(void)
{
/* MCU Configuration----------------------------------------------------------*/
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
//----------------------------
uint8_t valor1[10];
uint8_t valor2[10];
uint8_t dato1[1];
uint8_t dato2[1];
dato1[0]=0x2E;
dato2[0]=0x34;
while (1)
{
HAL_I2C_Mem_Write(&hi2c1, 0XEE, 0XF4, 16, dato1,1, 50);
HAL_Delay(5);
HAL_I2C_Mem_Read(&hi2c1, 0XEF, 0XF6, 16, valor1,2, 50);
UT=valor1[0]<<8|valor1[1];
HAL_I2C_Mem_Write(&hi2c1, 0XEE, 0XF4, 16, dato2,1, 50);
HAL_Delay(5);
HAL_I2C_Mem_Read(&hi2c1, 0XEF, 0XF6, 16, valor2,2, 50);
UP = (valor2[0] << 8 | valor2[1] ) >> (8);
}
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/**Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 50;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
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_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/* I2C1 init function */
static void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
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(__FILE__, __LINE__);
}
}
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void _Error_Handler(char * file, int line)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
while(1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
//---------------------------------------------------------------------------------------------Por otra parte, quisiera saber si estoy usando correctamente las funciones HAL_I2C_Mem_Write y HAL_I2C_Mem_Read, en especial el segundo parámetro (dirección del sensor) y el quinto (puntero para el buffer de datos)
uint8_t temp[2] = {0};
uint8_t pressure[3] = {0};
uint8_t datos[22] = {0};
uint16_t UT = 0;
uint16_t UP = 0;
uint8_t oversampling_setting = 0;
uint8_t dato1 = 0x2E;
uint8_t dato2 = 0x34 + (oversampling_setting << 6);
while (1)
{
HAL_I2C_Mem_Read(&hi2c1, 0xEF, 0xAA, 1, datos, sizeof(datos), 50); //Leer datos de calibración
HAL_I2C_Mem_Write(&hi2c1, 0xEE, 0xF4, 1, &dato1, 1, 50);
HAL_Delay(5);
HAL_I2C_Mem_Read(&hi2c1, 0xEF, 0xF6, 1, temp, sizeof(temp), 50); //Leer temperatura
UT= (temp[0] << 8) | temp[1];
HAL_I2C_Mem_Write(&hi2c1, 0xEE, 0xF4, 1, &dato2, 1, 50);
HAL_Delay(5);
HAL_I2C_Mem_Read(&hi2c1, 0xEF, 0xF6, 1, pressure, sizeof(pressure), 50); //Leer presión
UP = ((pressure[0] << 16) | (pressure[1] << 8) | pressure[2]) >> (8 - oversampling_setting);
/* resto del algoritmo */
}