I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集
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接口实现以下功能:
显示自己的学号和姓名;
显示AHT20的温度和湿度;
上下或左右的滑动显示长字符,比如“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)采集相关推荐
- I2C总线学习—查缺补漏—S3C2440的I2C控制器
I2C总线学习-查缺补漏-S3C2440的I2C控制器 学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440 ...
- STM32通过I2C接口实现温湿度(AHT20)的采集与OLED显示及显示姓名学号
文章目录 一.了解I2C总线协议 二.实现AHT20采集程序 三.温湿度采集--OLED显示 三.总结 四.参考链接 一.了解I2C总线协议 1.什么是I2C协议 I2C 通讯协议(Inter-Int ...
- STM32基于I2C温湿度采集
目录 一.题目要求 二.关于I2C 1.什么IIC 2.IIC的主要特点 3.IIC协议数据传输过程 三.关于DHT20 1.概述 2.引脚参数 四.DHT20温湿度采集 1.程序代码分析 2.实验效 ...
- [STM32学习]——一文搞懂I2C总线
目录 I2C总线的概念 I2C最重要的功能包括: I2C的物理层 I2C主要特点: I2C的高阻态 I2C物理层总结: I2C的协议层 初始(空闲)状态 开始信号: 停止信号 数据有效性 应答信号 I ...
- SylixOS 基于STM32平台的GPIO模仿I2C总线的驱动开发流程
2019独角兽企业重金招聘Python工程师标准>>> 概述 本文档以STM32F767平台为例,详细介绍SylixOS上GPIO模仿I2C总线的驱动开发流程. 初始化 GPIO模仿 ...
- STM32通过I2C接口采集温湿度
目录 一.I2C总线协议 1. I2C总线简介 1.1 物理接口 1.2 通讯特征 1.3 I2C总线状态 2. I2C总线通信协议 2.1 起始位和结束位 2.2 数据格式与应答 2.3 数据传输通 ...
- 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读数据: 二 ...
- I2C 总线原理与架构
一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串行时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须 ...
- 干货总结:I2C总线详细要点
[导读] 前文总结了单片机串口个人认为值得注意的一些要点,本文来梳理一下 I2C 总线的一些要点.这个题目有点大,本文对于 I2C 其实很多地方也没整清楚,只为了与前文形成系列,如果大家有补充欢迎留言 ...
最新文章
- 自己在UWP程序上调用usb转串口的路程
- 提取地图中道路_逼疯谷歌地球!我用神器一键提取各种肌理,还能生成3D模型!...
- asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2
- c语言算ex自定义函数,用C语言写定积分的通用函数:sin(x),cos(x),eX.
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.9
- docfx组件介绍--MarkdownLite
- hdu 1203 I NEED A OFFER!
- 福利 | 廖雪峰官方Python教程,拿走不谢!
- 计算原矩阵Jaccard相似度和签名矩阵的Jaccard相似度
- Html5 JumpStart学习笔记2:CSS Selectors and Style Properties
- 何川L3管理课_模块4_成果管理
- js高级学习笔记(b站尚硅谷)-10-instanceof
- vim 快捷键 总结-编辑文件
- 在字符串s的第n个字符后面插入字符串t
- js_中国大陆加港澳台手机正则验证
- codeforces 1526B I Hate 1111
- 动态网站作业4-JSP中实现数据库的增删改查的操作
- python富翁与穷人_穷人和富人最根本的区别
- 彻底解决Word中子标题变黑块问题
- 单片机实验四-七段数码管及键盘控制