摘要:
本文先介绍一下对I2C学习的理解,然后用I2C实现AHT20进行温湿度采集
文章目录
-
-
- 摘要:
- 一、I2C简介
- 二、硬件I2C与软件I2C的区别
- 三、实现I2CAHT20温湿度传感器的数据采集
-
- 1、AHT20简介
- 2、配置函数库,编写函数
- 4、最终结果展示
- 四、总结
-
一、I2C简介
IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控I2C之间、I2C与I2C之间进行双向传送,高速IC总线一般可达400kbps以上。 I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
- 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
- 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结東传送数据。
- 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接
收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为 受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
⭐️ stm32(正点原子
)的SLC和SDA的连接如下:
二、硬件I2C与软件I2C的区别
️ 硬件I2C
硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的
️ 软件I2C
软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C的端口是固定的,所以会有所区别。
区分他们:
- 可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC
- 可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
根据代码量判断,模拟的代码量肯定比固件的要大。
三、实现I2CAHT20温湿度传感器的数据采集
1、AHT20简介
AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。
由于AHT10/15/20 具有国产化、体积小、精度高、成本低等特点,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,单芯片价格在¥2~3,体积小巧很轻松嵌入到产品上
参数如下:
AHT20 | |
---|---|
供电电压 | 2.0-5.5V |
工作电流(休眠) | 0.25uA |
工作电流(测量) | 23uA |
测量范围(湿度) | 0~100%RH |
测量范围(温度) | -40~+85℃ |
温度精度 | ±2%RH(25℃) |
湿度精度 | ±0.3℃ |
分辨率 | 温度: 0.01℃ 湿度: 0.024%RH |
信号输出 | I²C信号 |
防护 | 无 |
封装大小 | 3x3x1.0mm(DFN) |
2、配置函数库,编写函数
参考 正点原子STM32开发板第27章 IIC实验
step0:驱动代码(官网下载),下载AHT20.c和AHT20.h,官网都有,另外最重要的还是I2C可以参考原子的代码
在myiic下就是关于i2c的代码。
对于正点原子的精英版,其SCL和SDL分别对应的就是PB6和PB7,我们用普通IO口来模拟I2C的功能,来实现功能。
step1:用例程原子I2C例程
!基本函数库的基本框架不用变,因为做的串口通信,所以就不需要lcd与key的系列函数了,并且加入我们的代码。
这里你可以把上面的两个代码复制在HARDWARE问件夹下
点击manage project items
在HARDWRE下加入上面.c文件。
然后点击魔术棒
,C/C++,路径添加AHT20文件夹
step2:编写主函数
1、检测AHT20是否采集到数据,如果采到就处理数据
2、根据如下两个公式
c1 = AHT20.HT[0]10010/1024/1024; //湿度
t1 = AHT20.HT[1]20010/1024/1024-500;//温度计算公式
来计算得出温度。
3、通过指示灯翻转标识正常工作
4、AHT20函数中,有定义结构体,根据结构体来得到相关值
下面是主函数:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usmart.h"
#include "24cxx.h"
#include "AHT20.h"
struct m_AHT20 AHT20;
int main(void)
{
volatile int c1,t1;
float c2,t2;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置中断优先级
LED_Init(); //初始化LED
delay_init(); //延时初始化
IIC_Init(); //IIC初始化
uart_init(115200); //串口初始化为115200
AHT20.alive=!AHT20_Init(); //AHT20初始化
while(1)
{
if(AHT20.alive)//是否存活
{
//读取其原始数据
AHT20.flag = AHT20_ReadHT(AHT20.HT);
c1 = AHT20.HT[0]*100*10/1024/1024; //湿度
t1 = AHT20.HT[1]*200*10/1024/1024-500;//温度计算公式
//结果都放大了10倍
c2=c1/10.0;
t2=t1/10.0;
printf("湿度:\r\n%f\r\n",c2);
printf("温度:\r\n%f\r\n\r\n",t2);
//正常工作双灯翻转
LED0=!LED0;
LED1=!LED1;
}
delay_ms(2000);
}
}
step3:编译连接,烧入程序
硬件如下
分别对应
SCL–>PB6
SDA–>PB7
共地
给3.3V电
4、最终结果展示
四、总结
这次的学习我了解了什么是硬件I2C什么是软件I2C,通过对AHT20的配置与实验更加了解了如何使用I2C。获益匪浅。
参考
https://blog.csdn.net/weixin_42048417/article/details/80683556
http://www.aosong.com/products-61.html
https://zhidao.baidu.com/question/693765215942559364.html
https://blog.csdn.net/toopoo/article/details/80053929