一、I2C简介
IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。 在 CPU与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
- 开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
- 结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
- 应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
- 这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
- IIC 总线时序图如图所示:
二、“硬件I2C”与“软件I2C”
1、硬件I2C
硬件I2C是由I2C控制器实现各种时序和应答,是MCU内置的IIC硬件模块,接收发送都由硬件完成,占用MCU资源少,有中断处理对应芯片上的I2C外设,有专用的I2C管脚,有相应I2C驱动电路。
2、软件I2C
软件模拟I2C就意味着你要用软件模拟I2C的时序,并且要随时监控I2C总线上的各种状态并作出相应的回应,占用MCU资源,如果总线上的数据交换比较频繁,那cpu基本就不能做其他事情了,否则就会丢数据。
3、两者区别
-
硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
-
硬件IIC速度比软件快,并且可以用DMA
-
模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
三、AHT20温湿度传感器数据采集
1、任务要求
- 每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
2、实验器材
① STM32最小核心板(STM32F103C8T6)
②奥松AHT21B温湿度传感器
③USB转TTL(ch340芯片)
④ IDE:keil5
⑤ 实验所用串口:USART1
3、主要代码
- 完整代码是在正点原子的I2C实验的库函数版本与奥松的AHT20的读取示例程序两者结合而成
- main.c
#include "delay.h"
#include "AHT20tem.h"
#include "sys.h"
#include "usart.h"
int main(void)
{
u32 CT_data[2];
volatile float c1=0,t1=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
AHT20tem_init();
delay_ms(40);//刚上电,延时40ms才可以读取状态
while(1)
{
delay_ms(1000);
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 推荐每隔大于1S读一次
c1 = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
printf("湿度:%.1f\r\n",(c1/10));
printf("温度:%.1f度\r\n",(t1/10));
printf("\r\n");
delay_ms(1000);
}
}
4、烧录程序
- 将AHT21B温湿度传感器连接到stm32核心板上,对应接口如下:
AHT21B | stm32核心板 |
---|---|
SCL | PB6 |
SDA | PB7 |
VCC | 3.3V |
GND | GND |
- 效果展示
常温下:
用手捂住传感器后:
四、参考资料
1、https://blog.csdn.net/weixin_40774605/article/details/88399276
2、AHT20产品手册
3、正点原子I2C实验讲解视频
4、AHT20的读取示例程序
5、正点原子STM32F103最小系统板开发指南-库函数版本_V1.1