目录
一、题目要求
1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:
1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)
2)阅读DHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机
二、关于I2C
1、什么IIC
IIC(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。
在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
IIC一共有只有两个总线: 一条是双向的串行数据线SDA,一条是串行时钟线SCL
SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的
SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的
软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。
硬件IIC :一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
2、IIC的主要特点
通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。
· IIC主设备功能:主要产生时钟,产生起始信号和停止信号
· IIC从设备功能:可编程的IIC地址检测,停止位检测
· IIC的一个优点是它支持多主控(multimastering), 其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
· 支持不同速率的通讯速度,标准速度(最高速度100kHZ),快速(最高400kHZ)
· SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。
· IIC是半双工,而不是全双工 ,同一时间只可以单向通信
· 为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。这一点在等下我们会讲解
3、IIC协议数据传输过程
主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输0
和1
的串行数据。串行数据序列的结构可以分为,开始条件,地址位,读写位,应答位,数据位,停止条件。
开始条件
当主设备决定开始通讯时,需要发送开始信号,需要执行以下动作:
· 先将SDA线从高压电平切换到低压电平;
· 然后将SCL从高电平切换到低电平;
在主设备发送开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位。
从机应答/非应答
· 主机每次发送完数据之后会等待从设备的应答信号ACK
· 在第9个时钟信号,如果从设备发送应答信号ACK,则SDA会被拉低若没有应答信NACK,则SDA会输出为高电平,这过程会引起主设备发生重启或者停止
结束条件
当主设备决定结束通讯时,需要发送停止信号,需要执行以下动作
· 先将SDA线从低电压电平切换到高电压电平
· 再将SCL线从高电平拉到低电平
三、关于DHT20
1、概述
DHT20采用I2C通讯协议,响应迅速,配有一个全新设计的ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,是一款全新升级的智能温湿度传感器模块,在测量精度、供电电压、测量范围等方面的性能参数都有大幅提升,超出了前一代传感器的可靠性水平,即使在恶劣环境下也能保持性能稳定。每一款产品出厂时都经过严格的校准和测试。由于对传感器做了改良和微型化改进,因此它的性价比更高。
2、引脚参数
四、DHT20温湿度采集
1、程序代码分析
read_DHT20_once(); //I2C读取传感器温度
void read_DHT20_once(void)
{
delay_ms(10);
reset_DHT20(); //复位DHT20
delay_ms(10);
init_DHT20(); //初始化DHT20
delay_ms(10);
startMeasure_DHT20(); //准备开始测量DHT20温湿度
delay_ms(80);
read_DHT20(); //通过IIC读取DHT20采集的温湿度
delay_ms(5);
}
main() ; 函数
int main(void)
{
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化
IIC_Init(); //IIC协议初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0);
while(1)
{
printf("温度湿度显示");
read_DHT20_once(); //I2C读取传感器温度
OLED_Clear(0);
delay_ms(1500);
}
}
工程代码文件传送门:工程代码
2、实验效果展示
温湿度采集实验
五、总结
温湿度采集实验是一个很有趣的实验,通过温湿度采集基本了解了IIC通信协议的相关知识,以及学会了如何运用IIC协议读取数据,很有帮助;实验过程也遇到了一些问题,对于温湿度采集传感器的供电特别注意,需要5v供电可能才能正常读取采集数据,一开始3.3v供电怎么都读取不了温度。