AHT20温湿度采集(I2C协议)

本文深入解析I2C通讯协议的基本原理,包括起始/停止信号、数据有效性、应答/非应答信号等内容,并通过STM32与AHT20温湿度传感器的实际案例,详细阐述软件模拟I2C与硬件I2C的实现方法。


前言

本例使用I2C协议读取AHT20温湿度传感器的值,并将读取到的数据通过串口打印出来。

一、I2C简介

(一)I2C协议简介

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

I2C总线主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
 
I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

1.I2C物理层

在这里插入图片描述

  • 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。

  • 一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

  • 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

  • 总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

  • 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。

引用来源(野火参考资料)

2.I2C协议层

I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

  • I2C基本读写过程
  • 通讯的起始和停止信号
  • 数据有效性
  • 地址及数据方向
  • 响应

其中,按照是否使用I2C基本外设可分为

软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。

硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。

本例我们主要软件I2C为例,详细分析I2C的通讯格式。

3.AHT20简介

产品外型
在这里插入图片描述
引脚定义
在这里插入图片描述
传感器读取流程

  1. 上电后要等待不少于100ms, 读取温湿度值之前, 通过发送0x71获取一个字节的状态字,如果状态字和0x18相与后不等于0x18,初始化0x1B、 0x1C、 0x1E寄存器, 详细初始化流程请参照官网例程; 如果相等,执行下一步
  2. 等待10ms发送0xAC命令(触发测量), 此命令参数有两个字节, 第一个字节为0x33,第二个字节为0x00
  3. 等待80ms待测量完成,如果读取状态字Bit[7]为0, 表示测量完成, 然后可以连续读取六个字节; 否则继续等待
  4. 当接收完六个字节后, 紧接着下一个字节是CRC校验数据, 用户可以根据需要读出, 如果接收端需要CRC校验,则在接收完第六个字节后发ACK应答, 否则发NACK结束,CRC初始值为0XFF,CRC8校验多项式为:

CRC[7:0]=1+x4+x5+x8AHT20

  1. 计算温湿度值。 注: 在第一步的校准状态检验只需要上电时检查, 在正常采集过程无需操作。

在这里插入图片描述

  1. 原始数据处理

在这里插入图片描述

二、模拟I2C

本例是以AHT20温湿度传感器读取数据为例,主要分析在I2C通讯协议的起始与停止信号、应答/非应答信号,数据有效性、数据读写操作等。
AHT20例程
在这里插入图片描述

关于AHT20例程文件的移植的详细讲解,可参考

STM32基于IIC的温湿度采集(AHT20)

(一)起始/停止信号

在这里插入图片描述

起始信号

void IIC_Start(void)
{
   
   
	SDA_OUT();     //配置SDA线输出为通用推挽输出,输出速度为50Mhz
	IIC_SDA=1;	   //SDA线输出高电平
	IIC_SCL=1;     //SCL线输出高电平
	delay_us(4);
 	IIC_SDA=0;   	//SCL线为高电平时,SDA线由高变低(下降沿),表示通信的开始
	delay_us(4);
	IIC_SCL=0;		//钳住I2C总线,准备发送或接收数据 
}	  

可以看到,当SCL线是高电平时,SDA线从高电平向低电平切换,表示通讯的开始。

停止信号

void IIC_Stop(void)
{
   
   
	SDA_OUT();  	//配置SDA线输出为通用推挽输出,输出速度为50Mhz
	IIC_SCL
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值