zoukankan      html  css  js  c++  java
  • STM32------SHT30温湿传感器

    SHT30是盛世瑞出品的低端低价温湿度传感器,利用I2C进行数据传输,具有两个可选地址,宽电源电压从2.4V到5.5V。

    SHT30芯片有八个引脚:

    Pin Name Comments
    1 SDA 数据引脚,输入/输出
    2 ADDR 地址引脚,输入
    3 ALENT 报警引脚,输出;不使用时悬空
    4 SCL 时钟引脚,输入/输出
    5 VDD 电源引脚,输入
    6 nRESET 复位引脚,低电平有效,输入
    7 R 无用引脚,接地
    8 VSS 接地引脚

     

     

     

     

     

     

     

     

     

    重复性影响SHT30的测量时间,因此就是影响传感器的能量消耗。

    通过改变选择ADDR引脚的电压,实现传感器的地址改变。默认地址是ADDR连接VSS时( 0X44),可以修改成0X45。(关于引脚,详情请看数据手册)。

    SHT30有两中工作模式

      1.单次数据采集模式

      通过不同命令,在重复性(高,中,低)和时钟延伸(禁止,使能)方面不同,每个数据包含一个16位温度和一个16位湿度值(按此顺序)组成。

      传输如下所示(具体传输过程以数据手册为准):

      (1)STM32发出START,并发出I2C的地址(7位)+读(1)/写(0)标志位,然后等待SHT30的ACK

      (2)发出命令高8位数据,等待SHT30的ACK

      (3)发出命令低8位数据,等待SHT30的ACK

      (4)STM32发送STOP停止通信。

      (5)STM32发出START,并发出I2C的地址(7位)+读(1)/写(0)标志位,然后等待SHT30的ACK

      (6)传感器将接收读头的接收,并发送两个字节的数据(温度),接着是一个字节的CRC校验另外

      (7)传感器发送两个字节的数据(相对湿度),然后是一个字节的CRC校验和。

      每发送8位必须接受到STM32回应的ACK条件传感器才会继续发送数据。如果传感器在任何字节的数据之后没有接收到ACK,它就不会继续发送数据。I2C主机可以中止读取传输任何数据字节后,发送NACK状态,如果不能在随后的数据感兴趣,例如CRC字节或第二测量结果,可以了节省时间。

      有时钟延伸:

      如果没有数据发送,传感器会发出一个ACK,并随后拉下SCL线。SCL线被拖到测量完成为止。一旦测量完成,传感器释放SCL线并发送测量结果。

      无时钟延伸:

      没有数据存在,传感器响发出一个NACK。

      2.周期性数据采集模式

       通过不同命令,在重复性(高,中,低)和数据采集频率((0.5, 1, 2, 4 & 10 mps )方面不同,每个数据包含一个16位温度和一个16位湿度值(按此顺序)组成。

       测量数据的传输可以通过获取数据命令来启动。如果没有测量数据是I2C读取头报以一个NACK。在读出命令获取数据之后,数据存储器被清除,即没有测量数据存在。

    代码如下(是我根据SHT30提供的代码修改):

    //功能:开始I2C通信,并发送I2C地址和写标志
    static etError SHT3X_StartWriteAccess(void) 
    {   
        etError error; // error code 
     
      // write a start condition   
        //I2c_StartCondition(); 
        IIC_Start();//I2C开始通信需要的条件
        
      // write the sensor I2C address with the write flag   
        IIC_Send_Byte(_i2cAddress << 1); 
        error = (etError)IIC_Wait_Ack();
    
      return error; 
    } 
     
    //----------------------------------------------------------------------------- 
    static etError SHT3X_StartReadAccess(void) 
    {   
        etError error; // error code 
     
      // write a start condition   
        //I2c_StartCondition(); 
        IIC_Start();
     
      // write the sensor I2C address with the read flag
        IIC_Send_Byte(_i2cAddress << 1 | 0x01); 
        error =(etError) IIC_Wait_Ack();
        //error = I2c_WriteByte(_i2cAddress << 1 | 0x01); 
     
      return error; 
    } 
     
    //----------------------------------------------------------------------------- 
    static void SHT3X_StopAccess(void) 
    {   // write a stop condition   
        //I2c_StopCondition(); 
        IIC_Stop();
    } 
     
    //----------------------------------------------------------------------------- 
    static etError SHT3X_WriteCommand(etCommands command) 
    {   
        etError error; // error code 
     
      // write the upper 8 bits of the command to the sensor  
        IIC_Send_Byte(command >> 8);
        error  = (etError) IIC_Wait_Ack();
     
      // write the lower 8 bits of the command to the sensor  
        IIC_Send_Byte(command & 0xFF);
        error |=  IIC_Wait_Ack();
        //error |= IIC_Send_Byte(command & 0xFF); 
     
      return error; 
    } 
     
    //----------------------------------------------------------------------------- 
    static etError SHT3X_Read2BytesAndCrc(u16t* data, etI2cAck finaleAckNack,u8t timeout)
    { 
      etError error;    // error code   
        u8t     bytes[2]; // read data array   
        u8t     checksum; // checksum byte     
        // read two data bytes and one checksum byte   
        bytes[0] = IIC_Read_Byte(ACK);   
        bytes[1] = IIC_Read_Byte(ACK);   
        checksum = IIC_Read_Byte(finaleAckNack);      
        // verify checksum  
        error = SHT3X_CheckCrc(bytes, 2, checksum);      
        // combine the two bytes to a 16-bit value   
        *data = (bytes[0] << 8) | bytes[1];      
        return error; 
    } 
     
    //----------------------------------------------------------------------------- 
    static etError SHT3X_Write2BytesAndCrc(u16t data) 
    {   
        etError error;    // error code   
        u8t     bytes[2]; // read data array   
        u8t     checksum; // checksum byte      
        bytes[0] = data >> 8;   
        bytes[1] = data & 0xFF;   
        checksum = SHT3X_CalcCrc(bytes, 2);     // write two data bytes and one checksum byte 
        IIC_Send_Byte(bytes[0]);
        error =  (etError)IIC_Wait_Ack();// write data MSB   
        if(error == NO_ERROR)
        {
            IIC_Send_Byte(bytes[1]); // write data LSB
            error = (etError)IIC_Wait_Ack();
        }           
        if(error == NO_ERROR)
        {    
            IIC_Send_Byte(checksum); // write data LSB
            error =(etError) IIC_Wait_Ack(); // write checksum      
        }
        return error; 
    } 
  • 相关阅读:
    接口的显示实现和隐式实现
    Math.Round和四舍五入
    经典SQL语句大全(转)
    简明添加log4net到项目中
    NAnt学习笔记(3) Properties, Loggers & Listeners
    (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
    Pyramid中如何配置多种URL匹配同一个View
    《IT项目管理》读书笔记(4) —— 项目范围管理
    C#语法糖
    枚举类型转换成字符串
  • 原文地址:https://www.cnblogs.com/zhangzeze/p/8834196.html
Copyright © 2011-2022 走看看