目录
1.解释什么是“软件I2C”和“硬件I2C”?
2.编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:
1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)
在I2C总线通信中,"软件I2C"和"硬件I2C"是两种实现方式。
1)软件I2C:
软件I2C是通过控制通用输入输出引脚(GPIO)的状态变化来模拟I2C总线的时钟和数据线。简单来说,软件I2C是通过软件代码来实现I2C通信协议。通过使用这种方式,可以使用任意的GPIO引脚实现I2C通信。
软件I2C的实现需要考虑如下几个方面:
- 时钟信号(SCL):通过软件控制GPIO引脚使其在指定的时间间隔内切换高电平和低电平信号,以模拟I2C总线上的时钟信号。
- 数据信号(SDA):通过软件控制GPIO引脚的状态来传输数据,包括开始位、停止位、数据位和应答位。
软件I2C的优点是灵活性更高,可以使用任意的GPIO引脚来实现,适用于低速设备或资源受限的应用。但是,由于软件控制引起的延迟和不稳定性,通信速度较慢。
2)硬件I2C:
硬件I2C是通过专门的硬件模块来处理I2C总线的时钟和数据线。硬件I2C通常集成在微控制器或其他芯片中,以提供更高的精确性和速度。
硬件I2C的实现通常具备以下特点:
- 时钟信号(SCL):硬件I2C模块(如STM32F103中的I2C1和I2C2)内部通过硬件定时器生成时钟信号,无需CPU干预。
- 数据信号(SDA):硬件I2C模块提供了寄存器用于接收和发送数据。
硬件I2C的优点是速度更快且稳定,因为通信交由硬件模块负责,而不会受到软件延迟的影响。但是,硬件I2C的灵活性较低,只能使用指定的引脚来实现。
总的来说,软件I2C和硬件I2C都是实现I2C总线通信协议的方式,其选择取决于应用的具体要求和资源限制。在STM32F103中,您可以选择使用硬件I2C(I2C1或I2C2)来连接AHT20温湿度传感器并进行数据采集。
2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
为了实现每隔2秒钟采集一次AHT20温湿度数据,并通过串口发送到上位机(Win10),您可以按照以下步骤进行:
-
首先,阅读AHT20数据手册,根据其通信协议和寄存器配置,编写驱动程序完成I2C总线访问和AHT20温湿度传感器的数据读取。
-
在主函数中,初始化串口通信和I2C总线,并设置AHT20的I2C地址、寄存器地址等参数。
-
编写循环代码,在其中使用I2C总线访问AHT20温湿度传感器,并读取温度和湿度值。
-
将读取的温度和湿度值转换为实际的温度和湿度值,并将其保存到变量中。
-
将温度和湿度值格式化为字符串,并通过串口发送到上位机。
以下是一个示例代码,实现了每隔 2 秒采集一次温湿度数据,并通过串口发送到上位机(Windows 10):
#include "stm32f10x.h"
#include "stdio.h"
#define AHT20_ADDRESS 0x38 // AHT20 温湿度传感器的 I2C 地址
void I2C_Init(void);
void USART_Configuration(void);
void USART_SendString(const char* str);
void AHT20_Init(void);
void AHT20_StartMeasurement(void);
void AHT20_ReadMeasurement(uint16_t* data);
int main(void)
{
I2C_Init();
USART_Configuration();
AHT20_Init();
while (1) {
AHT20_StartMeasurement();
Delay(2000);
uint16_t temperature, humidity;
AHT20_ReadMeasurement(&temperature, &humidity);
char buf[64];
snprintf(buf, sizeof(buf), "Temperature: %d.%02d C, Humidity: %d.%02d %%\r\n",
temperature / 100, temperature % 100, humidity / 100, humidity % 100);
USART_SendString(buf);
}
}
void I2C_Init(void)
{
// 配置 I2C 端口、时钟等
// ...
}
void USART_Configuration(void)
{
// 配置 USART 串口通信
// ...
}
void USART_SendString(const char* str)
{
while (*str) {
while (!(USART1->SR & USART_FLAG_TXE));
USART_SendData(USART1, *str++);
}
}
void AHT20_Init(void)
{
// AHT20 初始化配置
// ...
}
void AHT20_StartMeasurement(void)
{
// 启动 AHT20 温湿度测量
// ...
}
void AHT20_ReadMeasurement(uint16_t* temperature, uint16_t* humidity)
{
// 读取 AHT20 温湿度测量结果
// ...
}
上述部分参考自 ---WeTab AL Pro