使用STM32通过I2C接口采集温湿度数据(AHT20)

STM32通过I2C接口实现温湿度(AHT20)的采集

  • 一.学习任务
  • 二.I2C总线协议
  • 1.什么是12C总线协议
  • 2. I2C 协议的物理层和协议层
  • 2.1 12C物理层
  • 2.2 12C协议层
  • 3. I2C的两种方式——硬件I2C和软件I2C
  • 3.1 硬件12C
  • 3.2 软件12C
  • 3.3二者区别
  • 三.STM32基于I2C协议的温湿度传感器的数据采集
  • 1 .题目要求
  • 2.前期准备
  • 3.代码撰写
  • 4.结果展示
  • 一.学习任务

    1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

    1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节)

    2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

    二.I2C总线协议

    1.什么是12C总线协议

    I2C(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。它多用于主控制器和从器件间的主从通信,具有传输距离短、任意时刻只能有一个主机等特性。在CPU与被控IC之间、IC与IC之间进行双向传送,高速I2C总线一般可达400kbps 以上。

    I2C(Inter-Integrated Circuit)总线协议的功能主要包括:

    用于微控制器及其外围设备之间的通信。
    在主控制器和从器件之间进行数据传输。
    具有传输距离短、任意时刻只能有一个主机等特性。
    可以实现高速数据传输,一般可达400kbps 以上。

    此外,I2C还具有一些特定的功能,例如临时数据存储和读写操作、控制指令的发送和接收等。这些功能使得I2C在各种设备和系统中得到广泛应用。

    2. I2C 协议的物理层和协议层

    2.1 12C物理层

    12C物理层是I2C(Inter-Integrated Circuit)总线协议的物理层。I2C总线是一个用于连接微控制器及其外围设备的两线式串行总线。在12C物理层中,通过使用两条总线线路(一条双向串行数据线SDA和一条串行时钟线SCL)来实现微控制器与其外围设备之间的通信。每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。此外,12C物理层还具有支持多设备连接、数据传输同步、设备空闲状态下的高阻态输出以及利用仲裁方式决定设备占用总线等特性。

    I2C物理层具有以下特点:

    是一个支持多设备的总线,在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
    一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
    每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
    总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
    多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。连接到相同总线的IC数量受到总线的最大电容400pF限制。

    2.2 12C协议层

    12C协议层是I2C(Inter-Integrated Circuit)总线协议的协议层。它是一种由Phiilps公司开发的协议,由于引脚少、硬件实现简单、可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

    I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。I2C基本读写过程包括先看看I2C通讯过程的基本结构,它的通讯过程包括起始信号、从设备地址发送、数据发送、数据接收、停止信号等环节。

    此外,I2C协议还支持多设备连接,每个连接到总线的设备都有一个唯一的地址,微控制器可以通过该地址访问不同的设备。同时,I2C协议还具有数据传输同步、设备空闲状态下的高阻态输出以及利用仲裁方式决定设备占用总线等特性。

    总之,12C协议层是I2C总线协议的核心组成部分,它定义了通讯的基本结构和过程,使得微控制器和外围设备之间可以进行高效的数据传输和控制。

    3. I2C的两种方式——硬件I2C和软件I2C

    3.1 硬件12C

    硬件12C是指直接利用STM32芯片中的硬件I2C外设进行I2C通信。

    该硬件I2C外设跟USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。对于硬件I2C来说,它需要I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生I2C的通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。硬件12C的效率要远高于软件模拟的I2C,但是程序较为繁琐。

    3.2 软件12C

    软件12C是指使用GPIO(通用输入输出)管脚模拟I2C通信波形实现I2C通信。

    它将芯片的两个GPIO引脚分别用作SCL及SDA,按照I2C的时序要求,直接控制引脚的输出信号(若是接收数据时则读取SDA电平),就可以实现I2C通讯。由于是直接控制GPIO引脚的高低电平产生通讯时序,需要由CPU控制每个时刻的引脚状态,所以称为“软件模拟协议”方式即软件I2C方式。

    3.3二者区别

    硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。对于硬件I2C用法比较复杂,软件I2C的流程更清楚一些。如果要详细了解I2C的协议,使用软件I2C可能更好的理解这个过程。在使用I2C过程,硬件I2C可能通信更加快,更加稳定。

    三.STM32基于I2C协议的温湿度传感器的数据采集

    1 .题目要求

    每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机。

    2.前期准备

    温湿度传感器AHT20
    串口调试助手

    了解AHT20芯片的相关信息,具体信息请到官方下载对应产品介绍文档
    资料链接:http://www.aosong.com/class-36.html

    3.代码撰写

    (1)AHT20芯片的使用过程 read_AHT20_once函数

    void  read_AHT20_once(void)
    {
    	delay_ms(10);
    
    	reset_AHT20();//重置AHT20芯片
    	delay_ms(10);
    
    	init_AHT20();//初始化AHT20芯片
    	delay_ms(10);
    
    	startMeasure_AHT20();//开始测试AHT20芯片
    	delay_ms(80);
    
    	read_AHT20();//读取AHT20采集的到的数据
    	delay_ms(5);
    }
    
    
    

    (2)AHT20芯片读取数据 read_AHT20函数

    void read_AHT20(void)
    {
    	uint8_t   i;
    
    	for(i=0; i<6; i++)
    	{
    		readByte[i]=0;
    	}
    	I2C_Start();//I2C启动
    
    	I2C_WriteByte(0x71);//I2C写数据
    	ack_status = Receive_ACK();//收到的应答信息
    	readByte[0]= I2C_ReadByte();//I2C读取数据
    	Send_ACK();//发送应答信息
    
    	readByte[1]= I2C_ReadByte();
    	Send_ACK();
    
    	readByte[2]= I2C_ReadByte();
    	Send_ACK();
    
    	readByte[3]= I2C_ReadByte();
    	Send_ACK();
    
    	readByte[4]= I2C_ReadByte();
    	Send_ACK();
    
    	readByte[5]= I2C_ReadByte();
    	SendNot_Ack();
    	//Send_ACK();
    
    	I2C_Stop();//I2C停止函数
    	//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
    	if( (readByte[0] & 0x68) == 0x08 )
    	{
    		H1 = readByte[1];
    		H1 = (H1<<8) | readByte[2];
    		H1 = (H1<<8) | readByte[3];
    		H1 = H1>>4;
    
    		H1 = (H1*1000)/1024/1024;
    
    		T1 = readByte[3];
    		T1 = T1 & 0x0000000F;
    		T1 = (T1<<8) | readByte[4];
    		T1 = (T1<<8) | readByte[5];
    
    		T1 = (T1*2000)/1024/1024 - 500;
    
    		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
    		AHT20_OutData[1] = H1 & 0x000000FF;
    
    		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
    		AHT20_OutData[3] = T1 & 0x000000FF;
    	}
    	else
    	{
    		AHT20_OutData[0] = 0xFF;
    		AHT20_OutData[1] = 0xFF;
    
    		AHT20_OutData[2] = 0xFF;
    		AHT20_OutData[3] = 0xFF;
    		printf("读取失败!!!");
    
    	}
    	printf("\r\n");
    	//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
    	printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
    	printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
    	printf("\r\n");
    }
    
    
    

    编译调试成功无误烧录即可。

    4.结果展示


    通过本次实验,详细了解到了I2C总线协议,以及AHT20温湿度传感器的使用,受益匪浅!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32通过I2C接口采集温湿度数据(AHT20)

    发表回复