IIC协议读取温湿度数据

题目:1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务: 1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节) 2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
参考:


I2C总线通信协议
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路间的通讯。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps 以上。
在这里插入图片描述

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

I²C最重要的功能包括:

1.只需要两条总线;
2.没有严格的波特率要求,例如使用RS232,主设备生成总线时钟;
3.所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
4.I²C是真正的多主设备总线,可提供仲裁和冲突检测;
5.传输速度;
标准模式:Standard Mode = 100 Kbps
快速模式:Fast Mode = 400 Kbps
高速模式: High speed mode = 3.4 Mbps
超快速模式: Ultra fast mode = 5 Mbps
6.最大主设备数:无限制;
7.最大从机数:理论上是127。

  • I2C的物理层
    在这里插入图片描述
    I2C是一个支持设备的总线。可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。对于I2C 总线,只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。
    I2C 通讯设备常用连接方式(引用野火资料中的图)

  • I2C的协议层
    主要是定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。
    在这里插入图片描述

1.什么是软件“I2C”和硬件“I2C”

软件“I2C”:直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。需要在控制产生 I2C 的起始信号时,控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号

硬件“I2C”:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。

两者比较:硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。对于硬件I2C用法比较复杂,软件I2C的流程更清楚一些。如果要详细了解I2C的协议,使用软件I2C可能更好的理解这个过程。在使用I2C过程,硬件I2C可能通信更加快,更加稳定。

2.编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)

1.首先进行CubeMX配置
(1)RCC配置
在这里插入图片描述
(2)SYS配置
在这里插入图片描述
(3)USART1配置
在这里插入图片描述
(4)I2C1
在这里插入图片描述
(5)NVIC配置
在这里插入图片描述

(6)生成文件后进行系统配置

在这里插入图片描述
(7)更改代码
在main函数中进行如下修改

#include "AHT20-21_DEMO_V1_3.h" 
#include<stdio.h>
int fputc(int ch, FILE *f)
 
{
 
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
 
  return ch;
  	  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.实验效果

在这里插入图片描述
最终编译成功

在这里插入图片描述

在这里插入图片描述
SCL接SCL
SDA接SDA
TXD接RXD
RXD接TXD
在这里插入图片描述

通过本次实验我深入理解了AHT20和I2C总线协议的相关知识点。实验中,我体验了AHT20传感器和I2C总线协议的实际应用。AHT20是一种高精度温湿度传感器,它能够测量温度和湿度,并且可以通过I2C总线协议与微控制器进行通信。这个实验的目标是理解并掌握AHT20传感器和I2C总线协议的基本操作。总的来说,这个实验让我对AHT20传感器和I2C总线协议有了更深入的理解,并提高了我的实践能力和编程技巧。我相信这些经验和知识将对我的未来的学习和工作有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值