在嵌入式系统中,I2C总线作为一种简单、高效的串行通信方式,广泛应用于传感器数据采集等领域。本文基于ST的高性能微控制器STM32H743,设计并实现了一个I2C通信的完整案例,展示如何快速、高效地采集传感器数据。
项目背景STM32H743以其高达480MHz的主频、丰富的外设支持及低功耗特性,成为高性能应用的首选。在数据采集场景中,I2C的主从结构为连接多种传感器提供了极大的便利性。本文通过模拟温湿度传感器的通信过程,介绍STM32H743如何通过I2C获取传感器数据,并在终端输出。
硬件连接我们使用以下硬件完成实验:
- STM32H743 Nucleo开发板
- HTU21D温湿度传感器
- 若干连接线
将HTU21D的SCL、SDA分别连接至STM32H743的PB6和PB7(I2C1接口),并确保电源和地正确连接。
软件设计使用STM32CubeMX生成初始化代码,并在Keil MDK中编写主程序。以下是完整代码:
#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#define HTU21D_ADDRESS 0x40
#define TEMP_MEASURE_NO_HOLD 0xF3
void SystemClock_Config(void);
float Read_Temperature(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
while (1) {
float temperature = Read_Temperature();
char buffer[50];
sprintf(buffer, "Temperature: %.2f C\r\n", temperature);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
HAL_Delay(1000);
}
}
float Read_Temperature(void) {
uint8_t cmd = TEMP_MEASURE_NO_HOLD;
uint8_t data[2];
HAL_I2C_Master_Transmit(&hi2c1, HTU21D_ADDRESS << 1, &cmd, 1, HAL_MAX_DELAY);
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, HTU21D_ADDRESS << 1, data, 2, HAL_MAX_DELAY);
uint16_t raw_temp = (data[0] << 8) | data[1];
raw_temp &= 0xFFFC;
return -46.85 + 175.72 * ((float)raw_temp / 65536.0);
}
void SystemClock_Config(void) {
// CubeMX自动生成的时钟配置代码
}
代码解读- 初始化模块
系统初始化包括GPIO、I2C和UART模块的配置。STM32CubeMX工具自动生成这些代码,极大地减少了开发时间。
- I2C通信实现
- 使用HAL_I2C_Master_Transmit发送命令以启动温度测量。
- 等待数据准备好后,调用HAL_I2C_Master_Receive读取返回的两字节数据。
- 数据处理与输出
传感器返回的原始数据经过公式转换,计算出实际温度,并通过UART接口打印到串口终端。
注意事项- 硬件连接时注意I2C线的上拉电阻配置,通常为4.7kΩ。
- 如果出现通信问题,可通过逻辑分析仪查看波形,检查时序是否正确。
- 温湿度传感器通常需要短暂延时等待数据稳定,实际项目中可根据数据手册调整延时。
扩展应用本文的实现可直接拓展至更多I2C传感器,例如压力传感器、气体传感器等。同时,STM32H743的强大性能也适合复杂的实时控制和数据处理任务,如FFT分析和图像处理。
|