一、I2C总线协议
1.1、I2C简介
I2C协议,引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现被广泛的使用在系统内多个集成电路(IC)间的通讯。
对于通讯协议,我们也
以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有
机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,
统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,
协议层则规定我们用中文还是英文来交流。
1.2、硬件I2C
常见的I2C通讯系统:
它的物理层有如下特点:
(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
(6) 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
1.3、协议层
I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
1.3.1 I2C通讯复合格式
1.3.2 通讯的起始和停止信号
1.3.3 数据有效性
1.3.4 地址及数据方向
1.3.5 响应
二、IIC协议读取温湿度数据
2.1 实验内容与AHT20
实验内容: 使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。实现每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
AHT20: 标准 I2C 格式的温湿度传感器
AHT20工作范围
由下图可知,AHT20工作在20℃到60℃左右时测量空气中的温度效果最好,传感器需要与空气充分接触。
AHT20接口定义
温湿度转换公式
相对湿度 RH 都可以根据 SDA 输出的相对湿度信号 SRH 通过如下公式计算获得(结果以 %RH 表示):
温度 T 都可以通过将温度输出信号 ST 代入到下面的公式计算得到(结果以温度 ℃ 表示):
在AHT20产品手册中还有电器特性,包含输入输出特性、发送命令等,在实验寄存器编写代码或标准库时可能会用到,但我使用的HAL库,没有用到这些,此处就不展示了,可以在链接中找到
2.2 CubeMX配置
2.2.1 系统时钟(RCC配置)
2.2.2 SYS配置
2.2.3 USART1配置
2.2.4 GPIO配置
2.2.5 I2C1配置
点击ADD添加,选择RX和TX
2.2.6 NVIC配置
2.2.7 时钟配置
2.2.8 生成项目
然后点击右上角的GENERATE CODE,生成keil文件
2.2 Keil实现
2.2.1 添加模块代码文件
将模块的AHT20-21_DEMO_V1_3.h和AHT20-21_DEMO_V1_3.c文件复制到MDK-ARM下的AHT20文件夹下,没有此文件夹就需新建此文件夹
在项目中添加文件
**将刚才的AHT20文件夹加入到此处的Include Path下
2.2.2 更改代码main.c
1、基于HAL库的重定向输出函数
#include<stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
2、添加AHT20的头文件
#include "AHT20-21_DEMO_V1_3.h"
3、实现功能的主函数:在while循环下添加下列代码
printf("start read...\r\n");
/* USER CODE END WHILE */
AHT20_Read_CTdata(CT_data);//没有CRC校验,直接读取AHT20的温度和湿度数据
HAL_Delay(1500);//延时等待本次读取
c1 = CT_data[0]*1000/1024/1024; //计算得到湿度值c1(放大了10倍)
t1 = CT_data[1]*2000/1024/1024-500;//计算得到温度值t1(放大了10倍)
printf("temperature:%d%d.%d ",t1/100,(t1/10)%10,t1%10);
printf("humidity:%d%d.%d\r\n",c1/100,(c1/10)%10,c1%10);
printf("waiting next...\r\n");
printf("\n");
HAL_Delay(500);//延时0.5s等待,下一次的测量
/* USER CODE BEGIN 3 */
三、实验效果
3.1 Keil编译结果
3.2 FlyMCU烧录结果
需要先将boot0置为0,才能烧录,使用串口传输数据时,将boot0置为1,可以按下复位键。
3.3 物理连接
片上引脚如图,按图所示引脚对应模块的引脚连接
芯片 | AHT20 | UAB20转TTL |
---|---|---|
PA9(TXD) | 白线(RXD) | |
PA10(RXD) | 绿线(TXD) | |
PB6 (SCL) | SCL | |
PB7 (SDA) | SDA |
3.4 运行效果
AHT20手册和用到的头文件
链接:https://pan.baidu.com/s/1cExUzq0cE4S6gmsqplPxGw?pwd=8ruc
提取码:8ruc