stc15w408as数据手册单片机驱动SHT40温湿度传感器程序?

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

我要回帖

更多关于 stc15w408as数据手册 的文章

 

随机推荐