STM32应用开发进阶--IIC总线(SHT20温湿度+HAL库_硬件I2C)

实现目标

1、掌握IIC总线基础知识;

2、会使用软件模拟IIC总线和使用STM32硬件IIC总线;

3、 学会STM32CubeMX软件关于IIC的配置;

4、掌握SHT20温湿度传感器的驱动;

5、具体目标:(1)用STM32硬件IIC驱动SHT20,上位机串口助手打印温湿度;(2)用软件模拟IIC驱动SHT20,上位机串口助手打印温湿度(只提供代码)。


一、IIC概述

1.1 IIC定义

IIC , 即  I²C,全称 Inter-Integrated Circuit,是I²C Bus简称,中文叫集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。

1.2 IIC通信连接

IIC总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。IIC总线通过上拉电阻接正电源(上拉电阻常用是4.7K,一般在4.7k-10k之间),要求两根线都使用 开漏输出接上拉电阻 的配置。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

1.3 IIC特点

  • 简单和灵活的连接:占用空间小,芯片管脚的数量少,无需片选信号,价格低。。
  • 总线的长度可达7.6m,传送速度:快速 400kbps ,标准 100kbps,高速3.4Mbps。
  • 最大主设备数:无限制;最大从机数:理论上是127。
  • 信方式为同步半双工,同一时间只可以单向通信。
  • 双线制:I2C使用两根信号线进行通信,包括时钟线(SCL)和数据线(SDA)。
  • 多从机:多个从机设备可以连接到同一条I2C总线上,每个从机都有唯一的地址。
  • 多主机:多个主机设备可以通过I2C总线进行并行通信,通过仲裁机制实现多主机冲突的解决。

1.4 硬件IIC和软件IIC的区别

硬件IIC和软件IIC都是I2C总线通信的方式,但它们实现的方式有所不同:

硬件IIC:硬件IIC是通过专门的硬件模块实现的,通常是通过IIC控制器或者外部IIC芯片来实现的,具有高可靠性、传输速度快、占用CPU资源少等优点。硬件IIC协议实现比较简单,只需要在芯片上添加I2C控制器就可以实现IIC通信,适用于传输数据量较大、传输速度要求较高的场景。

软件IIC:软件IIC是通过软件模拟实现的,通常是在单片机的GPIO上实现的,具有低成本、可扩展性强等优点。软件IIC的实现需要占用CPU资源,因此传输速度相对较慢,可靠性也不如硬件IIC。软件IIC适用于传输数据量较小、传输速度要求不高的场景。

二、IIC协议层

        在IIC总线上每一位数据都由一个同步时钟所对应,也就是在SCL串行时钟的配合下,数据在SDA上从高位向低位一次串行传送每一位数据。IIC通信时序图如下:

2.1 数据有效性

  IIC 的数据读取动作都在 SCL为高 时产生,SCL为低时是数据改变的时期,无论SDA如何变化都不影响读取。所以,传输数据的过程中,当SCL为高时,数据应当保持稳定,避免数据的采集出错。

2.2 开始信号、结束信号

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

2.3 字节格式

SDA数据线上的每个字节必须是8位,对于每次传输的字节数没有限制。每个字节(8位)数据传送完后紧跟着应答信号(ACK,第9位)。数据的先后顺序为:高位在前 。

2.4 应答信号

应答信号:主/从机在之后的数据通信中,数据接收方(可能是主机也可能是从机)收到传输的一个字节数据后,需要给出响应,此时处在第九个时钟,发送端释放 SDA 线控制权,将 SDA 电平拉高,由接收方控制。应答信号分为两种:
1)当第9位(应答位)为 低电平 时,为 ACK  (Acknowledge)   信号
2)当第9位(应答位)为 高电平 时,为 NACK(Not Acknowledge)信号

2.5 数据传输(以地址7bit为例)

一个完整的7-bit通信过程如图所示:

在START信号后的首字节由7位从机地址和1位读写位组成,结构如下图:

发送完这个字节之后,主机释放SDA总线等待从机给出ACK应答。如果从机给出了ACK应答,表示从机地址正确(有从机响应)并且已知晓是读还是写,便可以开始读写数据。如果从机没有给出ACK应答,则说明接收设备可能没有收到数据(如寻址的设备不存在或是设备正在忙碌)或无法解析收到的数据,如果是这样,则由master来决定如何处理(STOP或ReSTART)。

2.5.1. 主机写-从机收,传输方向不变

  主机对从机发送数据时,主机对从机发送一个开始字节,然后即可一直发送数据。以示例来讲解,其第一帧数据为要操作的寄存器地址,所以为:“[1-Byte]开始字节(写) + [1-Byte]寄存器地址 + [1-Byte]寄存器数据”。

2.5.2. 主机读-从机发,传输方向改变

  主机对向从机读取数据时,方式同发送数据有所不同,要多一次通信过程。
  主机需要先向从机发送一次信号,告诉从机”我要读取数据“,然后重开一次通信,等待从机主动返回数据。以示例来讲解,发送 “[1-Byte]开始字节(写) + [1-Byte]要读取的寄存器的地址”,之后结束通信,或者重开始,来进入到第二次通信中,先发送 [1-Byte]开始字节(读),然后等待读取从机发送过来的 [1-Byte]数据 即可。

三、SHT20概述

3.1 SHT20简介

SHT20, 新一代 Sensirion 湿度和温度传感器。标准 I 2 C 格式。SHT20 配有一个全新设计的 CMOSens®芯片、一个经过改进的电容式湿度传感元件和一个标准的能隙温度传感元件。SHT20的分辨率可以通过输入命令进行改变(8/12bit乃至12/14bit的 RH/T),传感器可以检测到电池低电量状态,并且输出校验和,有助于提高通信的可靠性。

3.2  SHT20 引脚

3.3 SHT20采用的I2C通信,基本命令

开始传输后,随后先传输首字节包括I2C设备地址(7bit)和一个SDA方向位(R:1, W:0)。一个时钟发送一个位,在第8个下降沿之后,通过拉低SDA引脚(ACK位 为0),只是传感器数据接收正常。在发出测量命令之后(‘1110’‘0011’代表温度测量,‘1110’‘0101’代表相对湿度测量 ,这种为主机模式),MCU必须等待测量完成。

3.4 保持主模式测量时序图

 测量过程中,SCL线被封锁(由传感器控制),在测量时,SHT2x将SCL拉低强制主机进入等待状态。当释放SCL线,表示传感器内部工作接收,可以继续进行数据传送。

首先发送写地址,再发送命令,然后是读地址,随后等待测量即可,测量时间如下图,传感器内部设置的默认分辨率为相对湿度 12位和温度 14位。45发送NACK时可取消校验。

3.5 无保持主模式测量时序图

量过程中,SCL线是开发状态,可进行其它通信,可以在总线上处理其它I2C总线通信任务。 

3.6 软复位

软复位命令是用于无需关闭和再次打开电源的情况下,重新启动传感器系统,重新初始化并恢复默认设置状态。所需要的时间不超过15ms。由MCU发起软复位命令为1111 1110

3.7  温湿度计算

传感器内部设置的默认分辨率为相对湿度12位和温度14位。SDA的输出数据被转换成两个字节的数据包,高字节MSB在前(左对齐)。每个字节后面都跟随一个应答位。两个状态位,即 LSB的后两位在进行物理计算前须置0。

(1)湿度

(2)温度

四、原理图设计

五、STM32CubeMX 配置

5.1 串口USART1配置

USART1:异步模式,波特率115200,功能:用于打印调试信息

5.2 IIC1配置

配置1:主模式特性  和  从模式特性 配置

Master features  主模式特性
I2C Speed Mode: IIC模式设置 快速模式和标准模式。
I2C Clock Speed: I2C传输速率,默认为100KHz

Slave features  从模式特性
Clock No Stretch Mode: 时钟没有扩展模式

IIC时钟拉伸(Clock stretching)
clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.
clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟.

Primary Address Length selection: 从设备地址长度 设置从设备的地址是7bit还是10bit 大部分为7bit
Dual Address Acknowledged: 双地址确认
Primary slave address:  从设备初始地址 

配置2:开启IIC中断

六、程序设计

6.1 串口重定向

#include "stdio.h"int fputc(int ch, FILE *f) 
{HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, 0xFFFF);return ch;
}

6.2 移植sht20.h文件至工程

#ifndef _SHT20_H_
#define _SHT20_H_/*SHT20 设备操作相关宏定义,详见手册*/
#define SHT20_ADDRESS  0X40
#define SHT20_Write_Add 0x80
#define SHT20_Read_Add	0x81
#define SHT20_Measurement_RH_HM  0XE5
#define SHT20_Measurement_T_HM  0XE3
#define SHT20_Measurement_RH_NHM  0XF5  //非主机模式地址
#define SHT20_Measurement_T_NHM  0XF3   //非主机模式地址
#define SHT20_READ_REG  0XE7
#define SHT20_WRITE_REG  0XE6
#define SHT20_SOFT_RESET  0XFEtypedef struct
{float tempreture;float humidity;
} SHT20_INFO;extern SHT20_INFO sht20_info;
void SHT20_GetValue(void);#endif

6.3 移植sht20.c文件至工程

//头文件
#include "stm32f1xx_hal.h"
#include "sht20.h"
#include "i2c.h"const int16_t POLYNOMIAL = 0x131;
SHT20_INFO sht20_info;//	函数功能:	SHT20复位
void SHT20_reset(void)
{	HAL_I2C_Mem_Write(&hi2c1, SHT20_Write_Add, SHT20_SOFT_RESET, I2C_MEMADD_SIZE_8BIT,(void*)0, 1, 1000);HAL_Delay(15);	
}//函数功能:	SHT20读取用户寄存器
unsigned char  SHT20_read_user_reg(void)
{	unsigned char val = 0;	HAL_I2C_Mem_Read(&hi2c1, SHT20_Read_Add, SHT20_READ_REG, I2C_MEMADD_SIZE_8BIT,&val, 1, 1000);	return val;	
}//函数功能:	检查数据正确性
char SHT2x_CheckCrc(char data[], char nbrOfBytes, char checksum)
{	char crc = 0;char bit = 0;char byteCtr = 0;	//calculates 8-Bit checksum with given polynomialfor(byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr){crc ^= (data[byteCtr]);for ( bit = 8; bit > 0; --bit){if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;else crc = (crc << 1);}}	if(crc != checksum)return 1;elsereturn 0;	
}//*	函数功能:	温度计算
float SHT2x_CalcTemperatureC(unsigned short u16sT)
{float temperatureC = 0;            // variable for resultu16sT &= ~0x0003;           // clear bits [1..0] (status bits)//-- calculate temperature [℃] --temperatureC = -46.85 + 175.72 / 65536 * (float)u16sT; //T= -46.85 + 175.72 * ST/2^16	return temperatureC;	
}//	函数功能:	湿度计算
float SHT2x_CalcRH(unsigned short u16sRH)
{float humidityRH = 0;              // variable for resultu16sRH &= ~0x0003;          // clear bits [1..0] (status bits)//-- calculate relative humidity [%RH] --//humidityRH = -6.0 + 125.0/65536 * (float)u16sRH; // RH= -6 + 125 * SRH/2^16humidityRH = ((float)u16sRH * 0.00190735) - 6;	return humidityRH;
}//函数功能:	测量温湿度
float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)
{char  checksum = 0;  //checksumchar  data[2];    //data array for checksum verificationunsigned char addr = 0;unsigned short tmp = 0;float t = 0;HAL_I2C_Mem_Read(&hi2c1, SHT20_Read_Add, cmd, I2C_MEMADD_SIZE_8BIT,data,2, 0xFFFF);SHT2x_CheckCrc(data, 2, checksum);tmp = (data[0] << 8) + data[1];if(cmd == SHT20_Measurement_T_HM){t = SHT2x_CalcTemperatureC(tmp);}else{t = SHT2x_CalcRH(tmp);}	if(pMeasurand){*pMeasurand = (unsigned short)t;}	return t;	
}
//函数功能:	获取温湿度数据
void SHT20_GetValue(void)
{sht20_info.tempreture = SHT2x_MeasureHM(SHT20_Measurement_T_HM, (void *)0);HAL_Delay(70);	sht20_info.humidity = SHT2x_MeasureHM(SHT20_Measurement_RH_HM, (void *)0);HAL_Delay(25);SHT20_reset();
}

6.4 在main.c中打印温湿度值

  while (1){SHT20_GetValue();printf( "Temperature:%0.1fC,  Humidity:%0.1f%%\r\n", sht20_info.tempreture,                 sht20_info.humidity);HAL_Delay(1000);	  /* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

七、实验效果

八、仿真实现


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

49 序列化和反序列化

本章重点 理解应用层的作用&#xff0c;初识http协议 理解传输层的作用&#xff0c;深入理解tcp的各项特性和机制 对整个tcp/ip协议有系统的理解 对tcp/ip协议体系下的其他重要协议和技术有一定的了解 学会使用一些网络问题的工具和方法 目录 1.应用层 2.协议概念 3. 网络计…

CSRF跨站请求伪造实战

目录 一、定义 二、与XSS的区别 三、攻击要点 四、实战 一、定义 CSRF (Cross-site request forgery&#xff0c;跨站请求伪造)&#xff0c;攻击者利用服务器对用户的信任&#xff0c;从而欺骗受害者去服务器上执行受害者不知情的请求。在CSRF的攻击场景中&#xff0c;攻击…

C++数据结构——哈希桶HashBucket

目录 一、前言 1.1 闭散列 1.2 开散列 1.3 string 与 非 string 二、哈希桶的构成 2.1 哈希桶的节点 2.2 哈希桶类 三、 Insert 函数 3.1 无需扩容时 3.2 扩容 复用 Insert&#xff1a; 逐个插入&#xff1a; 优缺点比对&#xff1a; 第一种写法优点 第一种写法…

gfast:基于全新Go Frame 2.3+Vue3+Element Plus构建的全栈前后端分离管理系统

gfast&#xff1a;基于全新Go Frame 2.3Vue3Element Plus构建的全栈前后端分离管理系统 随着信息技术的飞速发展和数字化转型的深入&#xff0c;后台管理系统在企业信息化建设中扮演着越来越重要的角色。为了满足市场对于高效、灵活、安全后台管理系统的需求&#xff0c;gfast应…

OpenUI 可视化 AI:打造令人惊艳的前端设计!

https://openui.fly.dev/ai/new 可视化UI的新时代&#xff1a;通过人工智能生成前端代码 许久未更新, 前端时间在逛github&#xff0c;发现一个挺有的意思项目&#xff0c;通过口语化方式生成前端UI页面&#xff0c;能够直观的看到效果&#xff0c;下面来给大家演示下 在现代…

SAP FS00如何导出会计总账科目表

输入T-code : S_ALR_87012333 根据‘FS00’中找到的总账科目&#xff0c;进行筛选执行 点击左上角的列表菜单&#xff0c;选择‘电子表格’导出即可

echarts-地图

使用地图的三种的方式&#xff1a; 注册地图(用json或svg,注册为地图)&#xff0c;然后使用map地图使用geo坐标系&#xff0c;地图注册后不是直接使用&#xff0c;而是注册为坐标系。直接使用百度地图、高德地图&#xff0c;使用百度地图或高德地图作为坐标系。 用json或svg注…

GpuMall智算云:meta-llama/llama3/Llama3-8B-Instruct-WebUI

LLaMA 模型的第三代&#xff0c;是 LLaMA 2 的一个更大和更强的版本。LLaMA 3 拥有 35 亿个参数&#xff0c;训练在更大的文本数据集上GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Llama 3 的推出标志着 Meta 基于 Llama 2 架构推出了四个新…

Qt pro工程文件编写汇总(区分debug和release、32位和64位的方法,编译输出目录等)

前言&#xff1a; 从事qt开发已经好几年了&#xff0c;但有关pro编写的一些细节问题一直没有一个很好的梳理汇总——因为实际工作开发中&#xff0c;往往只需要编译特定版本的软件&#xff08;例如32位release版本&#xff09;&#xff0c;项目创建好后并设置好编译路径&#x…

ML307R OpenCPU GPIO使用

一、GPIO使用流程图 二、函数介绍 三、GPIO 点亮LED 四、代码下载地址 一、GPIO使用流程图 这个图是官网找到的&#xff0c;ML307R GPIO引脚电平默认为1.8V&#xff0c;需注意和外部电路的电平匹配&#xff0c;具体可参考《ML307R_硬件设计手册_OpenCPU版本适用.pdf》中的描…

零基础PHP入门(一)选择IDE和配置环境

配置环境 官网下载安装包&#xff0c;windows https://windows.php.net/download#php-8.3 我是下载的最新版&#xff0c;也可以切换其他版本 https://windows.php.net/downloads/releases/archives/ 下载好压缩文件后&#xff0c;双击解压到一个目录 D:\soft\php 复制ph…

成都爱尔眼科医院《中、欧国际近视手术大数据白皮书2.0》解读会圆满举行

2024年5月12日&#xff0c;爱尔眼科联合中国健康促进基金会健康传播与促进专项基金、新华社新媒体中心与中南大学爱尔眼科研究院、爱尔数字眼科研究所重磅发布《中、欧国际近视手术大数据白皮书2.0》。这是继2021、2022年在国内相继发布《国人近视手术白皮书》、《2022中、欧近…

模型蒸馏笔记

文章目录 一、什么是模型蒸馏二、如何蒸馏三、实践四、参考文献 一、什么是模型蒸馏 Hinton在NIPS2014提出了知识蒸馏&#xff08;Knowledge Distillation&#xff09;的概念&#xff0c;旨在把一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型上&#xff0…

【SpringBoot】SpringBoot中防止接口重复提交(单机环境和分布式环境)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f33c;前言 &#x1f512;单机环境下防止接口重复提交 &#x1f4d5;导入依赖 &#x1f4c2;项目结构 &#x1f680;创建自定义注解 ✈创建AOP切面 &#x1f697;创建Conotroller &#x1f4bb;分布…

构建高效的在线培训机构CRM应用架构实践

在当今数字化时代&#xff0c;在线培训已成为教育行业的重要趋势之一。为了提供更好的学习体验和管理服务&#xff0c;在线培训机构需要构建高效的CRM&#xff08;Customer Relationship Management&#xff09;应用架构。本文将探讨在线培训机构CRM应用架构的设计与实践。 一、…

绿色智能:AI机器学习在环境保护中的深度应用与实践案例

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

在vps的centos系统中用Python和青龙检测网页更新

环境&#xff1a;vps&#xff0c;centos7&#xff0c;python3.8.10&#xff0c;青龙面板&#xff08;用宝塔安装&#xff09; 任务&#xff1a;用python代码&#xff0c;监控一个网站页面是否有更新&#xff08;新帖子&#xff09;&#xff0c;若有&#xff0c;则提醒&#xf…

【数据结构】二叉树的认识与实现

目录 二叉树的概念&#xff1a; 二叉树的应用与实现&#xff1a; 二叉树实现接口&#xff1a; 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 二叉树节点个数​编辑 二叉树叶子节点个数 二叉树第k层节点个数 二叉树查找值为x的节点​编辑 二叉树前序遍…

XSS+CSRF攻击

一、前言 在DVWA靶场的XSS攻击下结合CSRF攻击完成修改密码 也就是在具有XSS漏洞的情况下实施CSRF攻击 二、实验 环境配置与上一篇博客一致&#xff0c;有兴趣可以参考CSRF跨站请求伪造实战-CSDN博客 首先登录DVWA&#xff0c;打开XSS模块 name随便输入&#xff0c;message…

HQL面试题练习 —— 合并数据

题目来源&#xff1a;京东 目录 1 题目2 建表语句3 题解 1 题目 已知有数据 A 如下&#xff0c;请分别根据 A 生成 B 和 C。 数据A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…