SHT3x-DIS驱动及应用详解(附源码和手册)

本文详细介绍了SHT3x-DIS传感器的电路组成、通讯指令,包括单次和周期获取数据、加快响应时间、停止周期读取、复位等操作,并提供了相关代码和芯片手册下载链接。
摘要由CSDN通过智能技术生成


SHT3x-DIS手册链接
SHT3x-DIS是Sensirion新一代的温湿度传感器,精度为±2%RH和±0.3℃,输入电压范围从2.4V到5.5V,采用IIC总线接口,速率可达1MHz。测量温湿度范围分别为是-40℃ ~ 125℃和0 ~ 100%。

先贴源码以及芯片文档下载链接

一、电路组成

从下图可以看到SHT3x内部集成了湿度传感器和温度传感器,通过ADC采样输入到数据处理和线性化单元,同时带有校正储存器,处理环境对器件测量的影响。通过数字接口IIC读取数据。带警报引脚,可通过修改寄存器的值设定阈值,当测量的温湿度超过阈值时它会被置位。
在这里插入图片描述

引脚分布如下,1和4号脚是IIC总线接口;2号脚是决定地址的引脚,当ADDR接VSS时芯片地址为0x44,接VCC时芯片地址为0x45;3号脚警报引脚(当不使用时浮空),当温湿度超过设定的阈值则该脚会被置位;5号和8号脚是电源引脚;6号引脚是复位引脚(当不使用时接VDD),低电平有效;7号脚是为了封装而保留的引脚。
在这里插入图片描述

下图是设备地址分配情况。
在这里插入图片描述

典型电路如下,由于SCL和SDA为开漏输出,驱动能力不足,需要接上拉电阻。VDD和VSS之间接一个小电容滤除高频杂波,另外nRESET和ALERT根据情况进行选择,若不需要使用,nRESET接高电平,ALERT浮空。Die Pad接地即可。

在这里插入图片描述

二、通讯指令说明

写好IIC驱动程序后,便可以开始和SHT3x进行通讯了,下面是SHT3x的所有指令说明。

(一)、单次获取数据指令

单次获取数据指令(Measurement Commands for Single Shot Data Acquisition Mode)的详细数据格式如下图。首先从表格最上面开始,Repeatability指的是重复性(重复性越高精度越高,可参考手册的Sensor Performance部分),Clock Stretching指的是时钟延伸,它们的作用下面再讲述。数据流动过程如下。

  • 发送起始信号以及由高7位的器件地址和最低位的写信号(WR=0) 组成的一字节地址,等待应答信号。(注意地址位于高7位,所以传址的时候需要将地址左移一位并加上读1/写0信号,如ADDR<<1 | WR)
  • 发送指令的高字节(Most Significant Byte,MSB)并等待应答信号。
  • 发送指令的低字节(Least Significant Byte,LSB)并等待应答信号,之后发送停止信号。
  • 等待一段时间(测量正在进行)
  • 发送起始信号以及由高7位的器件地址和最低位的读信号(RD=1) 组成的一字节地址,然后根据选择的Clock Stretching从两个方向选择。假如失能了时钟延长功能,则等待非应答信号,发送停止信号,延迟一段时间(这步很重要!!延迟时间大约为50ms左右)等待转换结束,然后发送八位的应答信号并等待应答信号,之后便是逐字节分别读取温度和湿度的高字节、低字节以及CRC校验字节,每字节接收完都要发送应答信号,最后发送停止信号即可。而如果使能了是时钟延长功能,则总线的SCL由SHT3x控制,我们只需要通过while(SCL==0)阻塞程序,等待其释放总线然后MCU读取数据即可。

在这里插入图片描述

(二)、周期获取数据指令

周期获取数据指令(Measurement Commands for Periodic Data Acquisition Mode)的详细数据格式如下图。周期获取数据需要先配置读取模式然后再进行读取。

1、配置模式

周期读取数据的配置主要是配置重复性和每秒测量次数。数据发送的方式同上。
在这里插入图片描述

2、读取数据

读取的步骤和上述单次读取数据指令的流程类似,下面大概说一下。

  • 发送起始信号,发送写地址,等待应答信号,注意如果传感器没有测量完,它只会返回非应答信号。
  • 发送16位命令0xE000。
  • 读取初始数据

在这里插入图片描述

(三)、加快响应时间指令

加快响应时间指令(accelerated response time,ART),用于周期读取数据指令,开启后传感器开始采集频率为4Hz的数据。它的使用方法跟上述配置模式相同,在读取之前配置好就可以了。

  • 发送起始信号,发送写地址,等待应答信号
  • 发送16位命令0x2B32,等待应答信号
  • 接着继续配置或者读取数据

在这里插入图片描述

(四)、停止周期读取数据指令

停止周期读取数据指令(Break command / Stop Periodic Data Acquisition Mode),有时为了实现低功耗或暂时不需要传感器测量数据,可以通过该指令进行关闭。

  • 发送起始信号,发送写地址,等待应答信号
  • 发送16位命令0x3093,等待应答信号,发送停止信号

在这里插入图片描述

(五)、复位

复位(RESET)的方式有很多种。

1、IIC接口复位

当通讯设备丢失时,在接下来的信号序列将会复位串口接口,此序列仅重置接口。状态寄存器保留其内容。可以通过下面步骤实现。

  • SDA线置位,翻转SCL线的电平9次以上
  • 接下来必须在下一个命令之前执行传输开始序列。
2、软复位/重新初始化

软复位/重新初始化(Soft Reset / Re-Initialization)的指令格式如下。

  • 发送起始信号,发送写地址,等待应答信号
  • 发送16位命令0x30A2,等待应答信号,发送停止信号

在这里插入图片描述

3、一般呼叫复位指令

一般呼叫复位指令(Reset through General Call)的指令格式如下。

  • 发送起始信号,发送通用呼叫地址0x00,等待应答信号
  • 发送第二个字节0x06,等待应答信号

在这里插入图片描述

4、通过nRESET引脚复位

拉低nRESET引脚的电平(至少350ns)将会产生硬复位信号重置传感器。

5、硬复位

重新上电。

(六)、加热器开启/关闭指令

该指令的用法同上,至于该加热器的作用是什么我也不清楚,明明是测温用的还要加热?!大概是想在温度很低的环境但想要它还能正常工作所以才设置这功能吧。

在这里插入图片描述

(七)、读取状态寄存器

状态寄存器包含有关加热器运行状态、警报模式以及最后一个命令的执行状态和最后一个写序列的信息。

  • 发送起始信号,发送写地址,发送16位命令
  • 发送起始信号,发送读地址,依次接收状态寄存器的高字节、低字节和CRC校验,每次接收都需要发送应答信号,直到接收的最后一个字节发送非应答信号,发送停止信号。

在这里插入图片描述

状态寄存器每一位代表的含义如下所示。

在这里插入图片描述

我们试一下读取状态寄存器看返回什么。可以发现二进制数1000 0000 0001 0000 1110 0001都为上面表格的默认值,至于CRC校验要根据给定公式对前两字节进行计算和比较。下面来讲CRC校验。

在这里插入图片描述

(八)、CRC校验

循环冗余校验(CRC)其实就是一种异或计算(模2运算)。获取的CRC校验码就是模2运算后的余数。
在这里插入图片描述

CRC校验计算的代码如下。

static u8 CRC_Check(u8 *check_data, u8 num, u8 check_crc)
{
   
    uint8_t bit;        // bit mask
    uint8_t crc = 0xFF; // calculated checksum
    uint8_t byteCtr;    // byte counter
    
 // calculates 8-Bit checksum with given polynomial x8+x5+x4+1
    for(byteCtr = 0; byteCtr < num; byteCtr++)
    {
   
        crc ^= (*(check_data+byteCtr));
        //crc校验,最高位是1就^0x31
        for(bit = 8; bit > 0; --bit)
        {
   
            if(crc & 0x80)
                crc = (crc << 1) ^ 0x31;
            else
                crc = (crc << 1);
        }
    }
    if(crc==check_crc)
        return 1;
    else 
        return 0;
}

(九)、转换温湿度数据

由于从传感器获取到的数据不是最终的温湿度,所以我们需要根据公式进行转换,转换公式如下,在计算之前我们要对温湿度数据进行整合。

在这里插入图片描述

    tem = ((buff[0]<<8) | buff[1]);//温度拼接
    hum = ((buff[3]<<8) | buff[4]);//湿度拼接

    Temperature= (175.0*(float)tem/65535.0-45.0) ;  // T = -45 + 175 * tem / (2^16-1)
    Humidity= (100.0*(float)hum/65535.0);           // RH = hum*100 / (2^16-1)

三、代码

(一)、IIC程序

1、iic.c
#include "iic.h"

/*
*********************************************************************************************************
*	函 数 名: i2c_Delay
*	功能说明: I2C总线延迟,最快400KHz
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{
   
    __NOP();__NOP();__NOP();__NOP();    __NOP();__NOP();__NOP();__NOP();

}

/*
*********************************************************************************************************
*	函 数 名: i2c_Start
*	功能说明: CPU发起I2C总线启动信号
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
   
    /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
    I2C_SDA_1();
    I2C_SCL_1();
    
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值