目录
实验目的:基于I2C硬件协议的AHT20温湿度传感器的数据采集,每隔2秒钟采集一次温湿度数据,并将采集到的温度、湿度通过串口输出到上位机(win10)。
实验环境:Windows10,串口调试助手,AHT20温湿度传感器,STM32F103RCT6-MINI开发板
参考资料:【野火®】零死角玩转STM32—F103-MINI.pdf,AHT20产品手册a2.pdf
一、什么是“软件I2C”和“硬件I2C”
1.什么是I2C
I2C 通讯协议(Inter-Integrated Circuit),因为它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
它的物理层有如下特点:
- 它是一个支持设备的总线。
- 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。
- 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
- 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
-多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。 - 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。
协议层:I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
2.软件I2C
软件I2C即软件模拟I2C,直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。例如,先控制作为 SCL 线的 GPIO 引脚输出高电平,
然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。
3.硬件I2C
硬件 I2C 是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的I2C 外设则可以方便地通过外设寄存器产生 I2C 协议方式的通讯,如初始化好 I2C 外设后,只需要把某寄存器位置 1,那么外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,而不需要内核直接控制引脚的电平。
4.软件I2C和硬件I2C对比
- 硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。
- 不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。
在STM32—F103-MINI开发板中,由于 STM32RCT6 芯片引脚较少,资源比较紧张,在设计硬件时不方便使用硬件 I2C 指定的引脚连接外部设备(EEPROM 存储器芯片),所以在控制程序上只能使用软件模拟 I2C 的方式。
二、步骤
1.实验主要代码
int main(void)
{
u32 CT_data[2]={0};
volatile float hum=0,temp=0;
USART_Config(); //USART1初始化
LED_GPIO_Config(); //LED端口初始化
delay_init(); //延时函数初始化
temphum_init(); //初始化温湿度传感器
while(1)
{
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据
hum = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
temp = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
printf("湿度:%.1f%%\r\n",(hum/10));
printf("温度:%.1f度\r\n",(temp/10));
printf("\r\n");
/*绿灯闪烁提示串口发送状态*/
green_led_on;
delay_ms(1000);
green_led_off;
delay_ms(1000);
}
}
2.下载到开发板
编译并将hex文件通过串口下载到开发板上。
3.实验设备连接和设置
stm32开发板 |AHT20温湿度传感器
3.3V------------VCC
GND-----------GND
PC6------------SCL
PC7------------SDA
4.运行结果
三、其它
本篇:qrs14_1基于I2C协议的AHT20温湿度数据采集
下一篇:qrs14_2Ardunio 完成STM32板子的串口通信