目录

  • 一、I2C总线通信协议的介绍
    • 1.I2C简介
    • 2.I2C总线时序图
    • 3.五种速率
    • 4.四种信号
    • 5.I2C的优缺点
    • 6.软件IIC和硬件IIC
  • 二、创建工程
    • 1.实验目的
    • 2.工具的选择
    • 3.相关代码分析
  • 三、线路的连接
  • 四、结果实现
  • 五、总结
  • 参考文献

一、I2C总线通信协议的介绍

1.I2C简介

I2C 是很常见的一种总线协议, I2C 是 NXP 公司设计的, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),若不接上拉电阻,这两个引脚为悬空状态,由于悬空状态引脚的电平是无法确定的,所以这两条数据线需要接上拉电阻,一般是4.7K,总线空闲的时候SCL 和 SDA都处于高电平。
I2C 总线标准模式下速度可以达到 100Kb/S快速模式下可以达到 400Kb/S。 I2C 总线工作是按照一定的协议来运行的,I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备 了,一个 I2C 总线连接多个 I2C 设备。

2.I2C总线时序图

3.五种速率

I2C协议可以工作在以下5种速率模式下,不同的器件可能支持不同的速率。
标准模式(Standard):100kbps
快速模式(Fast):400kbps
快速模式+(Fast-Plus):1Mbps
高速模式(High-speed):3.4Mbps
超快模式(Ultra-Fast):5Mbps(单向传输)

4.四种信号

I2C协议最基础的几种信号:起始、停止、应答和非应答信号。
起始信号
I2C协议规定,SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。
停止信号
I2C协议规定,SCL处于高电平,SDA由低到高变化,这种信号是停止信号。

5.I2C的优缺点

优点:仅使用两根信号线,支持多个主设备和多个从设备,ACK / NACK位用于确认每个帧都已成功传输,硬件没有UART复杂。
缺点:数据传输速率比SPI慢,数据帧的大小限制为8位,硬件设计比SPI复杂。

6.软件IIC和硬件IIC

IIC分为软件IIC和硬件IIC

软件IIC:
软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

工作方式:直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。

使用: 需要在控制产生 I2C 的起始信号时,控制作为SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

硬件IIC:
一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

工作方式:直接利用 STM32 芯片中的硬件 I2C 外设。

使用: 只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。

两者区别:
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。

二、创建工程

1.实验目的

每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机。

2.工具的选择

温湿度传感器AHT20
串口调试助手
STM32最小核心板
杜邦线若干

3.相关代码分析

根据其他公司提供的示例代码进行修改与代码添加。(如正点原子或者野火)

在官网自行对照阅读进行查看相关AHT20资料

AHT20芯片的使用过程read_AHT20_once函数:

void  read_AHT20_once(void)
{delay_ms(10);reset_AHT20();//重置AHT20芯片delay_ms(10);init_AHT20();//初始化AHT20芯片delay_ms(10);startMeasure_AHT20();//开始测试AHT20芯片delay_ms(80);read_AHT20();//读取AHT20采集的到的数据delay_ms(5);
}

AHT20芯片读取数据 read_AHT20函数:

void read_AHT20(void)
{uint8_t   i;for(i=0; i<6; i++){readByte[i]=0;}I2C_Start();//I2C启动I2C_WriteByte(0x71);//I2C写数据ack_status = Receive_ACK();//收到的应答信息readByte[0]= I2C_ReadByte();//I2C读取数据Send_ACK();//发送应答信息readByte[1]= I2C_ReadByte();Send_ACK();readByte[2]= I2C_ReadByte();Send_ACK();readByte[3]= I2C_ReadByte();Send_ACK();readByte[4]= I2C_ReadByte();Send_ACK();readByte[5]= I2C_ReadByte();SendNot_Ack();//Send_ACK();I2C_Stop();//I2C停止函数//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理if( (readByte[0] & 0x68) == 0x08 ){H1 = readByte[1];H1 = (H1<<8) | readByte[2];H1 = (H1<<8) | readByte[3];H1 = H1>>4;H1 = (H1*1000)/1024/1024;T1 = readByte[3];T1 = T1 & 0x0000000F;T1 = (T1<<8) | readByte[4];T1 = (T1<<8) | readByte[5];T1 = (T1*2000)/1024/1024 - 500;AHT20_OutData[0] = (H1>>8) & 0x000000FF;AHT20_OutData[1] = H1 & 0x000000FF;AHT20_OutData[2] = (T1>>8) & 0x000000FF;AHT20_OutData[3] = T1 & 0x000000FF;}else{AHT20_OutData[0] = 0xFF;AHT20_OutData[1] = 0xFF;AHT20_OutData[2] = 0xFF;AHT20_OutData[3] = 0xFF;printf("读取失败!!!");}printf("\r\n");//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);printf("\r\n");
}

编译成功及核心代码展示
完整代码在温湿度传感器的数据采集分支下

三、线路的连接


分析代码可知,关于温度传感器的解法如图所示

SCL–>PB6
SDA–>PB7

四、结果实现

打开串口调试助手,将手放在温度器上,可以看到温度和湿度都发生了变化,则实验成功。

基于I2C协议进行温湿度传感器的数据采集

五、总结

在本次的实践过程中,我发现了许多问题,如温度传感器发送回的数据不显示,温度一致在测量,无测量值等问题,在排除接线故障以及代码错误的问题后,发现基础工程文件中的代码数据没有完全匹配,在进行修改后,顺利进行。
注意:在对温度传感器进行串接时,一定要仔细核对引脚的解法,否则可能引起一些严重的后果!!
为完成本次实践的操作,查询了大量资料以及I2C协议,在动手实践的的过程中受益匪浅,也希望可以帮助到看到这篇文章的你!

参考文献

I2C总线协议简介
I2C通信协议详解
IIC原理超详细讲解—值得一看
I2C协议靠这16张图彻底搞懂(超详细)
AHT20芯片的相关信息

基于I2C协议利用STM32进行温湿度传感器的数据采集相关推荐

  1. AHT20温湿度传感器的数据采集

    目录 一.AHT20温度传感器数据采集 1.目的 2.准备条件 3.1实现代码 3.2连接器件 3.3编译烧录 3.4运行结果 二.OLED屏显和汉字点阵编码 1.目的 使用STM32F103的SPI ...

  2. STM32F103基于I2C协议的AHT20温湿度传感器的数据采集

    目录 一.I2C 1.I2C 协议简介 2.I2C 物理层 3.协议层 通讯的起始和停止信号 数据有效性 响应 4. 软件I2C"和"硬件I2C 二.实现AHT20采集程序 1.A ...

  3. STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出

    文章目录 前言 一.I2C总线通信协议 1.I2C总线 2.工作原理 3.I2C特点 4.I2C模式选择 5.软件I2C和硬件I2C 二.串口输出温湿度传感器的数据 1.核心代码分析 2.硬件实操连接 ...

  4. STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集

    文章目录 一.I2C总线通讯协议 1.I2C总线简介 2.I2C 协议的物理层和协议层 2.1物理层 2.2协议层 3.I2C的两种方式--硬件I2C和软件I2C 3.1硬件I2C 3.2软件I2C ...

  5. 基于I2C协议的AHT20温湿度传感器的数据采集

    文章目录 一.I2C相关 1.I2C总线简介 工作原理 总线特征 2.I2C协议简介 软件I2C 硬件I2C 二者比较 二.基于I2C的AHT20温湿度采集实验 AHT20简介 1.实验要求 2.实验 ...

  6. 基于I2C的AHT20温湿度传感器的数据采集

    一.I2C简介 二.软件I2C和硬件I2C 三.AHT20简介 四.基于stm32的AHT20温湿度传感器的数据采集 五.总结 一.I2C简介 I2C(芯片间)总线接口连接微控制器和串行I2C总线.它 ...

  7. stm32+HTU21D温湿度传感器通过usart1发送温湿度数据在串口助手显示

    stm32+HTU21D温湿度传感器 这里就不拍实物图了,我用的是下面这款HTU21D ic是stm32f103vet6 工程代码是io口模拟i2c和传感器通讯 PB6-SCL,PB7-SDA usa ...

  8. 基于I2C协议的EEPROM驱动控制

    基于I2C协议的EEPROM驱动控制 `timescale 1ns / 1ps module i2c_ctrl #(parameter DEVICE_ADDR = 7'b1010_000,//i2c设 ...

  9. FPGA进阶(2):基于I2C协议的EEPROM驱动控制

    文章目录 第49讲:基于I2C协议的EEPROM驱动控制 理论部分 设计与实现 i2c_ctrl i2c_rw_data eeprom_byte_rd_wr tb_eeprom_byte_rd_wr ...

最新文章

  1. sysbench的安装和做性能测试
  2. nginx 反向代理和负载均衡策略实战案例
  3. 从简单到高并发服务器(一)
  4. 鸟哥的Linux私房菜基础学习篇(第二版)第二章课后习题与答案
  5. ubuntu mysql增加用户_Ubuntu中给mysql添加新用户并分配权限
  6. 在html页面中怎么打印区域,在HTML中指定打印区域进行打印机打印
  7. 559. N 叉树的最大深度
  8. argmax函数_Python科学计算库numpy——统计函数
  9. SQL Server 2012 管理新特性:AlwaysOn
  10. python中元组的概念_初步讲解Python中的元组概念
  11. world wide web publishing无法启动 127错误
  12. 11.GitLab webhooks
  13. OPPO推送:推送消息的字串,用于参数
  14. 计算机10大经典算法
  15. win98万能显卡驱动_win98万能显卡驱动-万能显卡驱动精灵
  16. android 刷机 3e,华为nova 3e官方出厂固件rom刷机包下载_nova3e完整版升级包
  17. 【bzoj3034】Heaven Cow与God Bull
  18. 达梦数据库监控-DEM 部署
  19. 在C#中使用MSMQ的方法
  20. 泰拉瑞亚pc版最新服务器,服务端工具 - Terraria1.4.0.5-RPG开服端v0.2 | Terraria(泰拉瑞亚)中文论坛...

热门文章

  1. 《大数据之路:阿里巴巴大数据实践》第二篇 数据模型篇-读书笔记
  2. OBS注册与OSC配置
  3. 计算机游戏用英语怎么读,网络游戏用英语怎么,网络游戏用英语怎么读
  4. rust门卡有什么用_地球末日门禁卡A卡 | 手游网游页游攻略大全
  5. SpringBoot实现输入三条边长,如果能构成三角形就计算周长和面积
  6. NeurIPS 2022高分论文!DeRy:让知识迁移像拼积木一样简单高效!
  7. 几种常用的噪声估计算法(一)
  8. python pip安装报错_python pip安装扩展报错
  9. 亿级音乐服务容器化实践
  10. android全网通手机,全网通手机怎么用?全网通手机网络制式是什么意思?