I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集

  • 一实验要求
  • 二、12C总线通信协议
    • 1、12C介绍
    • 2、I2C物理层
    • 3、I2C协议层
    • 4、软件IIC和硬件IIC
  • 三、STM32基于I2C协议的温湿度传感器的数据采集
    • 1、题目要求
    • 2、前期准备
    • 3、代码撰写
      • (1)AHT20芯片的使用过程 read_AHT20_once函数
      • (2)AHT20芯片读取数据 read_AHT20函数
    • 4、电路连接
      • (1)温湿度传感器接法
      • (2)SCL连接PB6,SDA连接PB7
    • 5、上位机显示
  • 四、总结

一实验要求

1、学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节)
2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
2. 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:

  1. 显示自己的学号和姓名;

  2. 显示AHT20的温度和湿度;

  3. 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

二、12C总线通信协议

1、12C介绍

IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。
在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps 以上。

注意IIC是为了与低速设备通信而发明的,所以IIC的传输速率比不上SPI

最重要的功能包括:

  • 只需要两条总线;
  • 没有严格的波特率要求,例如使用RS232,主设备生成总线时钟;
  • 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
  • 是真正的多主设备总线,可提供仲裁和冲突检测;
  • 传输速度;

标准模式:Standard Mode = 100 Kbps
快速模式:Fast Mode = 400 Kbps
高速模式: High speed mode = 3.4 Mbps
超快速模式: Ultra fast mode = 5 Mbps

  • 最大主设备数:无限制;
  • 最大从机数:理论上是127。

2、I2C物理层

I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,SCL和SDA被上拉电阻Rp拉高,使SDA和SCL线都保持高电平。

I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart通信为全双工。

主机和从机的概念:
主机就是负责整个系统的任务协调与分配,从机一般是通过接收主机的指令从而完成某些特定的任务,主机和从机之间通过总线连接,进行数据通讯。
发布主要命令的称为主机,接受命令的称为从机。

3、I2C协议层

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

4、软件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由于不受管脚限制,接口比较灵活。

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

三、STM32基于I2C协议的温湿度传感器的数据采集

1、题目要求

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

2、前期准备

温湿度传感器AHT20
串口调试助手

了解AHT20芯片的相关信息,具体信息请到官方下载对应产品介绍文档
资料链接:http://www.aosong.com/class-36.html

3、代码撰写

(1)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);
}

(2)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");
}

编译调试成功无误烧录即可

4、电路连接

(1)温湿度传感器接法

本程序采用的软件I2C实现,GPIO引脚PB6,PB7。具体定义代码如下

#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
#define IIC_SCL PBout(6)//SCL
#define IIC_SDA PBout(7)//SDA
#define READ_SDA PBin(7)

(2)SCL连接PB6,SDA连接PB7

如果采用硬件I2C进行实现,可以查看关于STM32的原理图,可以看到硬件I2C接口,野火stm32mini开发板的I2C接口是PA2,PA3,要实现硬件I2C读取数据,就根据上面介绍的方式进行配置,即可完成通讯。

5、上位机显示

这里我利用的是XCOM串口调试助手,设置好波特率115200,打开串口即可观察到数据。

温湿度

用手握住传感器即可看到其温度得到了明显升高
环境湿度改变后同样湿度也有了变化

四、总结

I2C总线上允许连接多个微处理器以及各种外围设备,如存储器、LED及LCD驱动、A/D及D/A转换器等。为了保证数据可靠地传送,任一时刻总线只能由某一台主机控制,各微处理器应该在总线空闲时发送数据。

通过本次实验,详细了解到了I2C总线协议,以及AHT20温湿度传感器的使用,受益匪浅!

I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集相关推荐

  1. I2C总线学习—查缺补漏—S3C2440的I2C控制器

    I2C总线学习-查缺补漏-S3C2440的I2C控制器                  学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440 ...

  2. STM32通过I2C接口实现温湿度(AHT20)的采集与OLED显示及显示姓名学号

    文章目录 一.了解I2C总线协议 二.实现AHT20采集程序 三.温湿度采集--OLED显示 三.总结 四.参考链接 一.了解I2C总线协议 1.什么是I2C协议 I2C 通讯协议(Inter-Int ...

  3. STM32基于I2C温湿度采集

    目录 一.题目要求 二.关于I2C 1.什么IIC 2.IIC的主要特点 3.IIC协议数据传输过程 三.关于DHT20 1.概述 2.引脚参数 四.DHT20温湿度采集 1.程序代码分析 2.实验效 ...

  4. [STM32学习]——一文搞懂I2C总线

    目录 I2C总线的概念 I2C最重要的功能包括: I2C的物理层 I2C主要特点: I2C的高阻态 I2C物理层总结: I2C的协议层 初始(空闲)状态 开始信号: 停止信号 数据有效性 应答信号 I ...

  5. SylixOS 基于STM32平台的GPIO模仿I2C总线的驱动开发流程

    2019独角兽企业重金招聘Python工程师标准>>> 概述 本文档以STM32F767平台为例,详细介绍SylixOS上GPIO模仿I2C总线的驱动开发流程. 初始化 GPIO模仿 ...

  6. STM32通过I2C接口采集温湿度

    目录 一.I2C总线协议 1. I2C总线简介 1.1 物理接口 1.2 通讯特征 1.3 I2C总线状态 2. I2C总线通信协议 2.1 起始位和结束位 2.2 数据格式与应答 2.3 数据传输通 ...

  7. stm32通过I2C实现温湿度(AHT20)采集

    目录 一.I2C总线通信协议 1.1 I2C介绍 1.2 I2C物理层 1.3.I2C协议层 1.4.软件IIC和硬件IIC 1.5 IIC数据传送 1.6 IIC发送数据 1.7 IIC读数据: 二 ...

  8. I2C 总线原理与架构

    一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串行时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须 ...

  9. 干货总结:I2C总线详细要点

    [导读] 前文总结了单片机串口个人认为值得注意的一些要点,本文来梳理一下 I2C 总线的一些要点.这个题目有点大,本文对于 I2C 其实很多地方也没整清楚,只为了与前文形成系列,如果大家有补充欢迎留言 ...

最新文章

  1. 自己在UWP程序上调用usb转串口的路程
  2. 提取地图中道路_逼疯谷歌地球!我用神器一键提取各种肌理,还能生成3D模型!...
  3. asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2
  4. c语言算ex自定义函数,用C语言写定积分的通用函数:sin(x),cos(x),eX.
  5. 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.9
  6. docfx组件介绍--MarkdownLite
  7. hdu 1203 I NEED A OFFER!
  8. 福利 | 廖雪峰官方Python教程,拿走不谢!
  9. 计算原矩阵Jaccard相似度和签名矩阵的Jaccard相似度
  10. Html5 JumpStart学习笔记2:CSS Selectors and Style Properties
  11. 何川L3管理课_模块4_成果管理
  12. js高级学习笔记(b站尚硅谷)-10-instanceof
  13. vim 快捷键 总结-编辑文件
  14. 在字符串s的第n个字符后面插入字符串t
  15. js_中国大陆加港澳台手机正则验证
  16. codeforces 1526B I Hate 1111
  17. 动态网站作业4-JSP中实现数据库的增删改查的操作
  18. python富翁与穷人_穷人和富人最根本的区别
  19. 彻底解决Word中子标题变黑块问题
  20. 单片机实验四-七段数码管及键盘控制

热门文章

  1. Mac窗口置顶软件Afloat
  2. Float Point Exception
  3. 中国半导体分立器件市场发展潜力巨大
  4. 低延时直播流媒体传输技术评谈
  5. UC Berkeley在线免费课程
  6. 软件测试(测试工具)
  7. 加载3dtile研究
  8. Acm+java各种数据结构_Acm竞赛算法——数据结构算法分类
  9. 300 款经典 FC 游戏直击童年回忆杀!
  10. 线性代数——LU分解