I2C总线通信协议、STM32F103与AHT20温湿度传感器数据采集
一、I2C总线通信协议
I2C(Inter-Integrated Circuit)总线是一种用于连接微控制器和外围设备的串行通信协议。它具有高集成度、低成本、简单易用等优点,因此在许多嵌入式系统中得到广泛应用。
二、STM32F103与I2C通信
STM32F103是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设接口和强大的处理能力。通过STM32F103的I2C接口,可以方便地与AHT20温湿度传感器进行通信,实现数据的采集和控制。
三、AHT20温湿度传感器
AHT20是一款高精度、低功耗的温湿度传感器,采用I2C通信协议。通过与STM32F103的I2C接口连接,可以方便地获取温度和湿度值。
四、数据采集与输出
初始化I2C接口:首先需要对STM32F103的I2C接口进行初始化,包括设置通信速率、数据传输格式等。
启动传感器:通过I2C接口向AHT20发送启动命令,启动传感器进行数据采集。
读取数据:AHT20采集到温度和湿度值后,会通过I2C接口将数据发送给STM32F103。STM32F103读取数据后,可以进行必要的处理或存储。
输出数据:将处理后的温度和湿度值通过串口输出,可以通过串口调试工具或上位机软件查看数据。
如下图所示:
数据格式与应答
I2C数据以字节(即8bits)为单位传输,每个字节传输完后都会有一个ACK应答信号。应答信号的时钟是由主设备产生的。
应答(ACK):拉低SDA线,并在SCL为高电平期间保持SDA线为低电平
非应答(NOACK):不要拉低SDA线(此时SDA线为高电平),并在SCL为高电平期间保持SDA线为高电平
在传输期间,如果从设备来不及处理主设备发送的数据,从设备会保持SCL线为低电平,强迫主设备等待从设备释放SCL线,直到从设备处理完后,释放SCL线,接着进行数据传输。
如下图所示:
4、数据传输通讯
1)写数据
开始数据传输后,先发送一个起始位(S),主设备发送一个地址数据(由7bit的从设备地址,和最低位的写标志位组成的8bit字节数据,该读写标志位决定数据的传输方向),然后,主设备释放SDA线,并等待从设备的应答信号(ACK)。每一个字节数据的传输都要跟一个应答信号位。数据传输以停止位(P)结束,并且释放I2C总线。
2)读数据
开始通讯时,主设备先发送一个起始信号(S),主设备发送一个地址数据(由7bit的从设备地址,和最低位的写标志位组成的8bit字节数据),然后,主设备释放SDA线,并等待从设备的应答信号(ACK),从设备应答主设备后,主设备再发送要读取的寄存器地址,从设备应答主设备(ACK),主设备再次发送起始信号(Sr),主设备发送设备地址(包含读标志),从设备应答主设备,并将该寄存器的值发送给主设备;
读取单字节数据:
主设备要读取的数据,如果是只有一个字节的数值,就要结束应答,主设备要先发送一个非应答信号(NOACK),再发送结束信号(P);
读取多字节数据:
主设备要读取的数据,如果是大于一个字节的多个数据,就发送ACK应答信号(ACK),而不是非应答信号(NOACK),然后主设备再次接收从设备发送的数据,依次类推,直到主设备读取的数值是最后一个字节数据后,需要主设备给从设备发送非应答信号(NOACK),再发送结束信号(P),结束I2C通讯,并释放I2C总线。
注意:所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定不变。如下图所示:
二、使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集
1、什么是AHT20芯片
对于AHT20芯片的解释的链接如下:
DHT20产品规格书(中文版)_A1.cdr (aosong.com)
https://www.aosong.com/userfiles/files/media/AHT20%E4%BA%A7%E5%93%81%E8%A7%84%E6%A0%BC%E4%B9%A6(%E4%B8%AD%E6%96%87%E7%89%88)%20B1.pdf
要是想了解更深一些,请移步到奥松电子ASAIR官方网址:
软件下载-温湿度传感器 温湿度芯片 温湿度变送器模块 气体传感器 流量传感器 广州奥松电子股份有限公司 (aosong.com)
http://www.aosong.com/class-36.html
二、代码实现
这里也是使用Keil uVision5。具体代码请参考链接:
(39条消息) AHT20温度采集_hhhhhh277523的博客-优快云博客
https://blog.youkuaiyun.com/hhhhhh277523/article/details/111397514
部分代码展示:
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
IIC_SCL=1;
IIC_SDA=1;
}
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack); //IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
void read_AHT20_once(void);
void reset_AHT20(void);
void init_AHT20(void);
void startMeasure_AHT20(void);
void read_AHT20(void);
uint8_t Receive_ACK(void);
void Send_ACK(void);
void SendNot_Ack(void);
void I2C_WriteByte(uint8_t input);
uint8_t I2C_ReadByte(void);
void set_AHT20sendOutData(void);
void I2C_Start(void);
void I2C_Stop(void);
要是想了解串口通信相关知识,请移步
(40条消息) 练习串口传输文件_afadgfansfa的博客-优快云博客
https://blog.youkuaiyun.com/afadgfansfa/article/details/121320433?spm=1001.2014.3001.5502
四、总结
通过使用STM32F103和AHT20温湿度传感器,可以方便地实现基于I2C协议的数据采集。在实际应用中,需要根据具体需求进行相应的硬件和软件配置,以确保数据采集的准确性和稳定性。此外,还需要注意数据处理的算法和效率,以提高整个系统的性能和响应速度。