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


前言

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系统中不会占用特别多的资源,方便任务调度。觉得有用点个赞吧。

  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值