使用STM32完成基于I2C协议的AHT20温湿度传感器的数据采集
一、I2C协议简介
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
(1)、I2C协议物理层及协议层
1、I2C物理层 I2C通讯设备之间的常用连接图: 物理层特点: ①、它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线 中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。 ②、一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。 ③、 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。 ④、总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。 ⑤、多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。 ⑥、具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。 ⑦、 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。 2、I2C协议层
I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
①、通讯的起始和停止信号
- 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。起始和停止信号一般由主机产生。
- S 表示由主机的 I2C 接口产生的传输起始信号(S),这时连接到 I2C 总线上的所有从机都会接收到这个信号。P表示停止传输信号。
②、数据有效性 - I2C 使用 SDA 信号线来传输数据,使用 SCL信号线进行数据同步。
- SDA 数据线在 SCL的每个时钟周期传输一位数据。传输时,SCL为高电平的时候 SDA表示的数据有效,即此时的 SDA为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL为低电平时,SDA的数据无效,一般在这个时候 SDA进行电平切换,为下一次表示数据做好准备。
③、地址及数据方向 - I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE_ADDRESS)来查找从机。I2C 协议规定设备地址可以是 7 位或 10 位,实际中 7 位的地址应用比较广泛。紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/W非),第 8 位或第 11 位。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
④、响应 传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信(ACK)。
(2)、I2C特性及构架
1、软件I2C 直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态。直接控制 STM32的两个 GPIO 引脚,分别用作 SCL及 SDA,按照上述信号的时序要求(SDL和SDA的电平转换控制),直接像控制 LED 灯那样控制引脚的输出(若是接收数据时则读取 SDA 电平),就可以实现 I2C 通讯。 2、硬件I2C STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发,不需要内核控制。 3、软件I2C和硬件I2C的区别
- 硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
- 一般来说,软件模拟I2C稳定性要比硬件I2C更加稳定,硬件I2C不稳定,容易卡死,想要写得稳定程序就非常复杂;但是软件I2C可能会因为中断的影响造成数据读取不准确。
- 对于硬件I2C来说,由于芯片I2C外设的IO口已经确定,无法随意更改其他IO口,因而可移植性较差;但是由于软件I2C是通过IO口模拟I2C通信时序实现的通信,因而可移植性比较好,在任何单片机上都可以使用,只需要修改一下通信时间以及配置好IO口就可以实现I2C通信。
二、AHT20温湿度传感器简介
AHT20,新一代温湿度传感器在尺寸与智能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚SMD封装,底面 3 x 3mm ,高度1.0mm。传感器输出经过标定的数字信号,标准 I2 C 格式。AHT20 配有一个全新设计的 ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,其性能已经大大提升甚至超出了前一代传感器的可靠性水平,新一代温湿度传感器,经过改进使其在恶劣环境下的性能更稳定。
技术参数:
三、温湿度采集程序实现
1、程序代码 此处在固件库版的空白工程上进行添加代码,并实现以下功能:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机。 主要函数如下: main.c
#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
int main(void)
{
delay_init();
uart_init(115200);
IIC_Init();
while(1)
{
printf("温度湿度显示");
read_AHT20_once();
delay_ms(2000);
}
}
AHT20芯片函数read_AHT20_once();
void read_AHT20_once(void)
{
delay_ms(10);
reset_AHT20();
delay_ms(10);
init_AHT20();
delay_ms(10);
startMeasure_AHT20();
delay_ms(80);
read_AHT20();
delay_ms(5);
}
具体代码过程可见工程。
2、硬件连接 因为本实验采用的是软件I2C实现的,根据代码定义:#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB-CRL|=(u32)8<<28;} #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} #define IIC_SCL PBout(6) //SCL #define IIC_SDA PBout(7) //SDA 代码定义的GPIO引脚连接为 SDL->PB6;SDA->PB7;VCC->3.3V ;GND->GND。 本实验也可采用硬件I2C,STM32芯片有多个 I2C外设,它们的 I2C 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,关于 GPIO引脚的复用功能,以规格书为准。 3、实验结果显示 ①、硬件连接好后,采用烧录软件烧录 ②、采用串口调试查看助手查看结果
四、实验总结
本次实验为基于I2C协AHT20芯片的温湿度采集实验过程,整个实验过程因为在网上搜索了很多资料,看了很多大佬的实验过程,只能说实验过程还算顺利,又阅读了野火的资料对于I2C总线协议有了一个大概的了解,具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线,用来传输数据或发送数据,我的理解是这样。它的工作过程有很多,对于I2C总线协议的理解和深入学习有点困难,是一个漫长的过程需要多花时间。在实验过程中,可能会遇到串口无显示的情况,可能是传感器坏了。如有错误,请指正。
五、参考文献
【1】零死角玩转STM32–指南针第24章I2C协议 【2】STM3通过I2C接口实现温湿度采集 【3】https://blog.csdn.net/hhhhhh277523/article/details/111397514 【4】AHT20产品手册 【5】工程代码
|