STM32F103使用硬件IIC驱动SHT30温湿度传感器

2023-10-31


前言

SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度传感器就是使用的SHT30,本文是已硬件IIC来驱动SHT30。


一、SHT30温湿度传感器原理图

主要看3脚的地址,我的地址是0,所以驱动的时候,使用的是0x44作为地址,IIC总线上接上拉电阻,因为使用是的UCOS系统编程,所以使用的硬件IIC总线。
==

二、代码部分

1.SHT30.c文件

代码如下(示例):

#include "sht30.h"
#include "includes.h"					//os 使用	  
#include "stm32f10x_i2c.h"

extern PM gPM;

void I2C_Configuration(void)			//IIC初始化,该IIC为了实时时钟提供
{

   I2C_InitTypeDef  I2C_InitStructure;
   GPIO_InitTypeDef  GPIO_InitStructure; 

	 /** CONNECT TO HDC1080, PA8-I2C3_SCL */ 

	/* CONNECT TO RX8025, PB6-I2C1_SCL, PB7-I2C1_SDA*/ 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//???????	
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;     
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  ///< ???????  
	GPIO_Init(GPIOB, &GPIO_InitStructure);		//声明IIC的引脚


  /** Enable I2C1 clock */   
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);  /** CODEC_I2C peripheral configuration */ 
	I2C_DeInit(I2C1);
	
	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;   
	I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;  
	I2C_InitStructure.I2C_OwnAddress1 = 0x64;  
	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;   
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;  
	I2C_InitStructure.I2C_ClockSpeed = 100000;  
	I2C_Init(I2C1, &I2C_InitStructure);
	I2C_Cmd(I2C1, ENABLE);						/** Enable the I2C peripheral */ 	

}
/*修改这个函数发送的值,可以配置成其他模式*/
void SHT30_WriteCmd(CPU_INT16U command)
{
		CPU_INT32U ErrCount=65535;
		I2C_SendData(I2C1,command>>8);
	ErrCount=65535;
	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
	{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
	}
		I2C_SendData(I2C1,0x2c06 & 0x00ff);
	ErrCount=65535;
	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
	{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
	}
	I2C_GenerateSTOP(I2C1, ENABLE);
}

/***********************
I2Cx为单片机的SPI号
addr为实时时钟读取的地址
buf为存放使劲的缓冲区
num为要读的位数
*************************/

CPU_INT08U I2C_Read(I2C_TypeDef *I2Cx,CPU_INT08U addr,CPU_INT08U *buf,CPU_INT16U num)
{
	OS_ERR err;
	CPU_INT32U ErrCount=65535;

	
    if(num==0)
	return 1;
	
	while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))
	{
			if(ErrCount>0)	ErrCount--;
			else 						break;
	}
		I2C_AcknowledgeConfig(I2Cx, ENABLE);
	/* ????? */
    I2C_GenerateSTART(I2Cx, ENABLE);
		ErrCount=65535;
    while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))/*等待状态*/	
		{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
		}
	
	I2C_Send7bitAddress(I2Cx, (addr<<1 | write), I2C_Direction_Transmitter);
		ErrCount=65535;
	while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
	{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
	}
	

	SHT30_WriteCmd(0x2c06);
	
	OSTimeDlyHMSM(0,0,0,50,OS_OPT_TIME_HMSM_STRICT,&err);
	 I2C_GenerateSTART(I2Cx, ENABLE);
		ErrCount=65535;
    while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))/*等待状态*/	
		{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
		}
	I2C_Send7bitAddress(I2Cx, (addr<<1 | read), I2C_Direction_Receiver);
		ErrCount=65535;
	while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
	{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
	}
    while (num)
    {
		if(num==1)
		{
     		I2C_AcknowledgeConfig(I2Cx, DISABLE);	/* ??????????? */
    		I2C_GenerateSTOP(I2Cx, ENABLE);			/* ????? */
		}
	  ErrCount=65535;  
		while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
		{
			if(ErrCount>0)	ErrCount--;//ErrCount超时退出
			else 						break;
		}
	    *buf = I2C_ReceiveData(I2Cx);
	    buf++;
	    /* Decrement the read bytes counter */
	    num--;
    }
	/* ???????? */
	I2C_AcknowledgeConfig(I2Cx, ENABLE);
	
	return 0;
}	


2.SHT30.h文件

代码如下(示例):

#ifndef __STH30_H
#define __STH30_H	 
#include "sys.h"
#include "stdio.h"	
#include "includes.h"		

#define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
#define read  1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令
		 				    
								
void I2C_Configuration(void);
CPU_INT08U I2C_Read(I2C_TypeDef *I2Cx,CPU_INT08U addr,CPU_INT08U *buf,CPU_INT16U num);
#endif

主函数调用部分

		I2C_Read(I2C1, 0X44,err, 6);
		tem = ((err[0]<<8) | err[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
		hum = ((err[3]<<8) | err[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接
	
		gPM.Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)
		gPM.Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)

总结

SHT30有好几种工作模式,我这里使用的是最常用的一种,没有配置其他模式的选项。使用硬件IIC在UCOS系统中不会占用特别多的资源,方便任务调度。觉得有用点个赞吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103使用硬件IIC驱动SHT30温湿度传感器 的相关文章

  • CSDN编程竞赛第六期

    CSDN编程竞赛报名地址 https edu csdn net contest detail 16 本次是我第二次参加CSDN举办的编程竞赛 这一次的题相比上一次简单不少 对编程新人或者刚开始学习算法的人很友好 前言 背景 本次CSDN编程
  • 服务器管理系统是什么

    服务器管理系统是什么 服务器管理系统 是在操作系统下对操作系统的服务器软件及其相关软件进行二次设置的管理软件 是运营商管理域名 服务器 企业邮局 数据库等服务器主机类产品的一个网站平台 以达到快捷实现域名 服务器主机 企业邮局 数据库等产品
  • C#连接数据库SQlServer+Form窗格实现简单动态增删查改操作

    C 连接数据库SQlServer Form窗格实现简单动态增删查改操作 一 数据库连接 数据库连接部分学习自该博主原创博客 点击即可跳转 再附上该博主的博客链接 https blog csdn net kiss soul article d
  • 深度学习去运动模糊----《DeblurGAN》

    前言 现实生活中 大多数图片是模糊不清的 试想一下 追剧时视频不清晰 看着都很捉急 何况现实中好端端的一幅美景 美女也可以 被抓拍得不忍直视 瞬间暴躁 拍照时手抖 或者画面中的物体运动都会让画面模糊 女友辛辛苦苦摆好的各种Pose也将淹没在

随机推荐

  • 海湾主机汉字注释表打字出_海湾报警主机(JB-QG-GST5000)操作手册

    报警主机正面示意图 报警主机内部结构图 控制器 模块总线 通讯总线 联动电源输出端子示意图 A1 B1 An Bn RS 485有极性通讯线端子 接火灾报警显示盘 GND 24V LD D02电源盘对外输出端子 保护地 此端子与机壳相连 接
  • NLP技术中的Tokenization

    作者 Gam Waiciu 单位 QTrade AI研发中心 研究方向 自然语言处理 前言 今天我们来聊一聊 NLP 技术中的 Tokenization 之所以想要聊这个话题 是因为 一方面在 NLP 技术中 Tokenization 是非
  • 网络知识:光纤收发器TX、RX介绍以及两者的区别

    当我们远距离传输时 通常会使用光纤来传输 因为光纤的传输距离很远 一般来说单模光纤的传输距离在10千米以上 而多模光纤的传输距离最高也能达到2千米 而在光纤网络中 我们常常会使用到光纤收发器 那么光纤收发器怎么连 我们一起来了解下 一 光纤
  • 自媒体月入过万的运营攻略,轻松上手

    很多自媒体新手羡慕大V月入过万 同是做自媒体运营 为什么自己不能实现营收过万呢 给大家分享一套月入过万的运营攻略 适合新手们去操作 收藏起来直接套用到运营哦 1 账号定位 清晰的定位是影响后期变现的关键因素 选一个后期容易变现的领域能帮自己
  • ajax net::err_connection_refused,javascript - How to handle net::ERR_CONNECTION_REFUSED in jquery aj...

    It appears that when jqXHR readyState i e the readyState field of the first parameter to the ajax fail method is 0 that
  • 调用织梦搜索功能

    织梦默认的搜索框
  • 使用C对TOML文件的解析

    使用C对TOML文件的解析 toml书写语法 解析toml文件 测试输出内容如下 TOML是前GitHub CEO Tom Preston Werner 于2013年创建的语言 其目标是成为一个小规模的易于使用的语义化配置文件格式 TOML
  • HJT212协议

    HJ T212是由国家环保行业制定的数据传输标准协议 目前广泛使用的是HJ T212 2005通信协议 该协议在2005年制定 并于2006年2月1日正式实施 HJ T212标准不规定数据采集传输仪与监控仪器仪表的通讯方式 可以采用RS23
  • Mali GPU OpenGL ES 应用性能优化--基本概念

    1 基本概念 1 1 Mali GPU家族 Mali GPU家族都包含以下通用的硬件 基于分块的延迟渲染 Mali GPU把framebuffer分成许多块 16 x 16像素 然后一块一块地进行渲染 基于分块的渲染是有效的 因为像素值使用
  • matlab中if elseif语句,Matlab if…elseif…elseif…else…end语句

    if语句后面可以有一个 或多个 可选elseif 和一个else语句 这对于测试各种条件非常有用 当使用if elseif else语句时 请记住几点 if可以有零个或一个else 它必须在elseif之后 if可以有零到多个elseif
  • (python编程)k-shell的实现

    一 k shell 算法 改错 他发的代码报错 def kshell graph importance dict ks 1 while graph nodes temp node degrees dict for i in graph de
  • python之标准库使用

    目录 一 标准库 二 字符串操作 三 字符串类型 四 时间操作 五 文件基本方法及操作 文件基本方法 文件操作 一 标准库 Python 标准库非常庞大 所提供的组件涉及范围十分广泛 正如以下内容目录所显示的 这个库包含了 Python中的
  • Activiti7 监听器【十四】

    Activiti 7系列文章目录 文章代码下载 Activiti7 工作流设计器 一 Activiti7 创建表 二 Activiti7 表结构介绍 三 Activiti7 设计器创建流程 四 Activiti7 部署流程 五 Activi
  • maven打包出错:Failed to execute goal org.sp

    Failed to execute goal org springframework boot spring boot maven plugin 2 2 13 RELEASE repackage default on project bla
  • 数学建模——数据分析方法

    一 常见数据分析软件 Excel office三件套之一 R语言 Eviews origin 图形分析工具 SPSS 统计分析与数据挖掘 MATLAB 墙裂推荐 python 墙裂推荐 SAS 二 统计性描述 均值 mean x
  • 第一次参加蓝桥杯的心得

    随着我的4道题的答案提交后 蓝桥杯第十届比赛落下帷幕 这其中我也是参赛者 对于这次比赛 虽然我是一位小白 但是我也有不少的感悟 因为这一次也是我从小到大参加的第一次大型竞赛 所以我做了以下的总结 这次的比赛是在长沙理工大学比赛 所以对于我来
  • Swin-Unet:Swin Transformer在医学分割上的首次尝试

    Swin Unet Swin Transformer在医学分割上的首次尝试 前言 最近小编主要在搞一些医学图像分割的工作 也跑了一下Swin Unet 之前看到也看到过这篇Swin Unet 其实五月份就看到了hhhh 决定搬运过来 实际上
  • 前端报错500

    后台代码错误无法返回值 检查后台代码
  • log4j:WARN No appenders could be found for logger 的解决方法

    一 SSH在使用Log4j进行日志管理时常会遇到这个异常 log4j WARN No appenders could be found for logger org springframework web context ContextLo
  • STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一 SHT30温湿度传感器原理图 二 代码部分 1 SHT30 c文件 2 SHT30 h文件 总结 前言 SHT30是一种常见的温湿度传感器 该传感器广泛应用于各种场景 小米的温湿度传感器就是使用的SHT30 本文是已硬件