SHT2x

#ifndef EX_SHT2X_DRIVERS_H_
#define EX_SHT2X_DRIVERS_H_
//
#ifdef __cplusplus
extern "C" {
#endif
    //
    #include "complier_lib.h"
    #include "hw_config.h"
    #include "ex_i2c_drivers.h"
    //
    //===定义结构体    
    typedef struct _ex_sht2x_i2c_def_type            ex_sht2x_i2c_def_type;
    //===定义结构体    
    typedef struct _ex_sht2x_i2c_def_type            ex_sht2x_i2c_def_t;
    //===定义指针结构体
    typedef struct _ex_sht2x_i2c_def_type            * pex_sht2x_i2c_def_type;
    //===结构体定义
    struct _ex_sht2x_i2c_def_type
    {
        ex_i2c_def_type msg_i2cx;
        void(*msg_f_delay_us)(uint32_t );    //---毫秒延时函数,编程结束后需要等待5ms
        void(*msg_f_delay_ms)(uint32_t );    //---ms延时
        time_span_t(*msg_f_time_ticks)(void);        //---时间节拍
    };

    //===函数定义
    uint8_t ex_sht2x_i2c_init(ex_sht2x_i2c_def_type* SHT2Xx,
        void(*func_delay_us)(uint32_t delay),
        void(*func_delay_ms)(uint32_t delay),
        time_span_t(*func_time_ticks)(void), uint8_t ishw);
    uint8_t ex_sht2x_i2c_deinit(ex_sht2x_i2c_def_type* SHT2Xx);
    uint8_t ex_sht2x_i2c_rst(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd);
    uint8_t ex_sht2x_i2c_read_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t* val);
    uint8_t ex_sht2x_i2c_send_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t  val);

    uint8_t ex_sht2x_i2c_poll_cmd(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd);
    uint8_t ex_sht2x_i2c_poll_data(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t* dat);

    //
#ifdef __cplusplus
}
#endif
//
#endif /* EX_SHT2X_DRIVERS_H_ */

#include "ex_sht2x_drivers.h"


///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_init_hw(ex_sht2x_i2c_def_type* SHT2Xx,
    void(*func_delay_us)(uint32_t delay),
    void(*func_delay_ms)(uint32_t delay),
    time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
    ex_i2c_master_init_hw(&(SHT2Xx->msg_i2cx),
        func_delay_us, 
        func_time_ticks,
        ishw);
    //---注册函数
    SHT2Xx->msg_f_delay_us = func_delay_us;
    SHT2Xx->msg_f_delay_ms = func_delay_ms;
    SHT2Xx->msg_f_time_ticks = func_time_ticks;
    return OK_0;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_sw_init(ex_sht2x_i2c_def_type* SHT2Xx,
    void(*func_delay_us)(uint32_t delay),
    void(*func_delay_ms)(uint32_t delay),
    time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
    ex_i2c_master_init_sw(&(SHT2Xx->msg_i2cx),
        func_delay_us,
        func_time_ticks, ishw);

    //---注册函数
    SHT2Xx->msg_f_delay_us = func_delay_us;
    SHT2Xx->msg_f_delay_ms = func_delay_ms;
    SHT2Xx->msg_f_time_ticks = func_time_ticks;

    return OK_0;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_init(ex_sht2x_i2c_def_type* SHT2Xx,
    void(*func_delay_us)(uint32_t delay),
    void(*func_delay_ms)(uint32_t delay),
    time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
    //---校验初始化硬件模式还是软件模式
    if (ishw != 0)
    {
        return ex_sht2x_i2c_init_hw(SHT2Xx,
            func_delay_us, func_delay_ms, func_time_ticks,ishw);
    }
    else
    {
        return ex_sht2x_i2c_sw_init(SHT2Xx,
            func_delay_us, func_delay_ms, func_time_ticks, ishw);
    }
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_deinit(ex_sht2x_i2c_def_type* SHT2Xx)
{
    if (SHT2Xx->msg_i2cx.msg_hw != 0)
    {
        return ex_i2c_deinit_hw(&(SHT2Xx->msg_i2cx));
    }
    else
    {
        return ex_i2c_deinit_sw(&(SHT2Xx->msg_i2cx));
    }
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_hw_rst(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_hw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动命令
    _return = ex_i2c_master_start_addr_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---判断发送结果
    if (_return != OK_0)
    {
        //---发送重新启动命令
        _return = ex_i2c_master_restart_addr_hw_poll(&(SHT2Xx->msg_i2cx),
            (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
        //---校验状态
        if (_return != OK_0)
        {
            _return = ERROR_3;
            goto GoExit;
        }
    }
    //---发送指定地址的数据
    _return = ex_i2c_master_send_bits8_hw_poll(&(SHT2Xx->msg_i2cx), cmd, 1);
    //---校验状态
    if (_return != OK_0)
    {
        _return = ERROR_2;
        goto GoExit;
    }
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_hw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_sw_rst(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动信号
    ex_i2c_master_start_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送从机地址
    ex_i2c_master_send_addr_sw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---读取应答信号
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_3;
        goto GoExit;
    }
    //---数据发送
    ex_i2c_master_send_bits8_sw_poll(&(SHT2Xx->msg_i2cx), cmd, 1);
    //---读取ACK
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    //---退出操作入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_sw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_rst(ex_sht2x_i2c_def_type* SHT2Xx,uint8_t cmd)
{
    if (SHT2Xx->msg_i2cx.msg_hw != 0)
    {
        return ex_sht2x_i2c_hw_rst(SHT2Xx, cmd);
    }
    else
    {
        return ex_sht2x_i2c_sw_rst(SHT2Xx, cmd);
    }
}


///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_hw_read_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t* val)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_hw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动命令
    _return = ex_i2c_master_start_addr_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---判断发送结果
    if (_return != OK_0)
    {
        //---发送重新启动命令
        _return = ex_i2c_master_restart_addr_hw_poll(&(SHT2Xx->msg_i2cx),
            (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
        //---校验状态
        if (_return != OK_0)
        {
            _return = ERROR_3;
            goto GoExit;
        }
    }
    //---发送寄存器地址,低地址
    _return = ex_i2c_master_send_bits8_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(cmd & 0xFF), 0);
    //---校验
    if (_return != OK_0)
    {
        _return = ERROR_4;
        goto GoExit;
    }
    //---发送重新启动命令
    ex_i2c_master_restart_hw_poll(&(SHT2Xx->msg_i2cx));
    //---发送i2c设备地址,读地址
    _return = ex_i2c_master_send_addr_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) | 0x01);
    //---校验
    if (_return != OK_0)
    {
        _return = ERROR_5;
        goto GoExit;
    }
    //---发送应答
    _return = ex_i2c_master_send_ack_hw_poll(&(SHT2Xx->msg_i2cx), 1);
    //---校验
    if (_return != OK_0)
    {
        _return = ERROR_6;
        goto GoExit;
    }
    //---数据读取
    _return = ex_i2c_master_receive_bits8_hw_poll(&(SHT2Xx->msg_i2cx), val, 1, 0);
    //---校验
    if (_return != OK_0)
    {
        _return = ERROR_7;
    }
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_hw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_sw_read_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd,uint8_t *val)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动信号
    ex_i2c_master_start_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送从机地址
    ex_i2c_master_send_addr_sw_poll(&(SHT2Xx->msg_i2cx), 
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---读取应答信号
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_3;
        goto GoExit;
    }
    //---发送寄存器地址,低位地址
    ex_i2c_master_send_bits8_sw_poll(&(SHT2Xx->msg_i2cx), (uint8_t)(cmd & 0xFF), 0);
    //---读取ACK
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---发送数据失败
        _return = ERROR_4;
        goto GoExit;
    }
    //---发送启动信号
    ex_i2c_master_start_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送从机地址
    ex_i2c_master_send_addr_sw_poll(&(SHT2Xx->msg_i2cx), 
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) | 0x01);
    //---读取应答信号
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动读数据失败
        _return = ERROR_5;
        goto GoExit;
    }
    //---读取数据
    (*val) = ex_i2c_master_receive_bits8_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送不应答信号
    _return = ex_i2c_master_send_ack_sw_poll(&(SHT2Xx->msg_i2cx), 1);
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_sw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 读取寄存器
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_read_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t* val)
{
    if (SHT2Xx->msg_i2cx.msg_hw != 0)
    {
        return ex_sht2x_i2c_hw_read_reg(SHT2Xx, cmd,val);
    }
    else
    {
        return ex_sht2x_i2c_sw_read_reg(SHT2Xx, cmd,val);
    }
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_hw_send_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t  val)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_hw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动命令
    ex_i2c_master_start_hw_poll(&(SHT2Xx->msg_i2cx));
    //---发送i2c设备地址
    _return = ex_i2c_master_send_addr_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---校验状态
    if (_return != OK_0)
    {
        _return = ERROR_3;
        goto GoExit;
    }
    //---发送寄存器地址,低地址
    _return = ex_i2c_master_send_bits8_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(cmd & 0xFF), 0);
    //---校验状态
    if (_return != OK_0)
    {
        _return = ERROR_4;
        goto GoExit;
    }
    //---读取指定地址的数据
    _return = ex_i2c_master_send_bits8_hw_poll(&(SHT2Xx->msg_i2cx), val, 0);
    //---校验状态
    if (_return != OK_0)
    {
        _return = ERROR_5;
        goto GoExit;
    }
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_hw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_send_sw_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t  val)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动信号
    ex_i2c_master_start_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送从机地址
    ex_i2c_master_send_addr_sw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---读取应答信号
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_3;
        goto GoExit;
    }
    //---发送寄存器地址
    ex_i2c_master_send_bits8_sw_poll(&(SHT2Xx->msg_i2cx), (uint8_t)(cmd & 0xFF), 0);
    //---读取ACK
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---发送数据失败
        _return = ERROR_4;
        goto GoExit;
    }
    //---数据发送
    ex_i2c_master_send_bits8_sw_poll(&(SHT2Xx->msg_i2cx), val, 0);
    //---读取ACK
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    //---退出操作入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_sw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_send_reg(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd, uint8_t  val)
{
    if (SHT2Xx->msg_i2cx.msg_hw != 0)
    {
        return ex_sht2x_i2c_hw_send_reg(SHT2Xx, cmd, val);
    }
    else
    {
        return ex_sht2x_i2c_send_sw_reg(SHT2Xx, cmd, val);
    }
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_hw_poll_cmd(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_hw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动命令
    _return = ex_i2c_master_start_addr_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---判断发送结果
    if (_return != OK_0)
    {
        //---发送重新启动命令
        _return = ex_i2c_master_restart_addr_hw_poll(&(SHT2Xx->msg_i2cx),
            (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
        //---校验状态
        if (_return != OK_0)
        {
            _return = ERROR_3;
            goto GoExit;
        }
    }
    //---发送指定地址的数据
    _return = ex_i2c_master_send_bits8_hw_poll(&(SHT2Xx->msg_i2cx), cmd, 1);
    //---校验状态
    if (_return != OK_0)
    {
        _return = ERROR_2;
        goto GoExit;
    }
    //---延时等待20us
    SHT2Xx->msg_f_delay_us(22);
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_hw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_sw_poll_cmd(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd)
{
    uint8_t _return = OK_0;
    //---检查空闲
    _return = ex_i2c_master_check_busy_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动信号
    ex_i2c_master_start_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送从机地址
    ex_i2c_master_send_addr_sw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) & 0xFE);
    //---读取应答信号
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_3;
        goto GoExit;
    }
    //---数据发送
    ex_i2c_master_send_bits8_sw_poll(&(SHT2Xx->msg_i2cx), cmd, 1);
    //---读取ACK
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    //---延时等待20us
    SHT2Xx->msg_f_delay_us(22);
    //---退出操作入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_sw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_poll_cmd(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t cmd)
{
    if (SHT2Xx->msg_i2cx.msg_hw != 0)
    {
        return ex_sht2x_i2c_hw_poll_cmd(SHT2Xx, cmd);
    }
    else
    {
        return ex_sht2x_i2c_sw_poll_cmd(SHT2Xx, cmd);
    }
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_hw_poll_data(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t *dat)
{
    uint8_t _return = OK_0;
    uint16_t index = 0,length=3;
    //---检查空闲
    _return = ex_i2c_master_check_busy_hw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动命令
    _return = ex_i2c_master_start_addr_hw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) | 0x01);
    //---判断发送结果
    if (_return != OK_0)
    {
        //---发送重新启动命令
        _return = ex_i2c_master_restart_addr_hw_poll(&(SHT2Xx->msg_i2cx),
            (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) | 0x01);
        //---校验
        if (_return != OK_0)
        {
            _return = ERROR_5;
            goto GoExit;
        }
    }
    //---发送应答
    _return = ((length > 1) ? 0 : 1);
    //---发送应答
    _return = ex_i2c_master_send_ack_hw_poll(&(SHT2Xx->msg_i2cx), _return);
    //---校验
    if (_return != OK_0)
    {
        _return = ERROR_6;
        goto GoExit;
    }
    for (index = 0; index < length; index++)
    {
        //---校验发送NACK
        if (((length > 1) && (index == (length - 2))) ||
            (index == (length - 1)))
        {
            _return = 1;
        }
        else
        {
            _return = 0;
        }
        //---数据读取
        _return = ex_i2c_master_receive_bits8_hw_poll(&(SHT2Xx->msg_i2cx),
            &dat[index],
            _return,
            (index < (length - 1)) ? 1 : 0);
        //---校验
        if (_return != OK_0)
        {
            _return = ERROR_7;
            break;
        }
    }
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_hw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_sw_poll_data(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t* dat)
{
    uint8_t _return = OK_0;
    uint16_t index = 0,length = 3;
    //---检查空闲
    _return = ex_i2c_master_check_busy_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动写数据失败
        _return = ERROR_2;
        goto GoExit;
    }
    //---发送启动信号
    ex_i2c_master_start_sw_poll(&(SHT2Xx->msg_i2cx));
    //---发送从机地址
    ex_i2c_master_send_addr_sw_poll(&(SHT2Xx->msg_i2cx),
        (uint8_t)(SHT2Xx->msg_i2cx.msg_addr_id) | 0x01);
    //---读取应答信号
    _return = ex_i2c_master_receive_ack_sw_poll(&(SHT2Xx->msg_i2cx));
    if (_return != OK_0)
    {
        //---启动读数据失败
        _return = ERROR_3;
        goto GoExit;
    }
    //---循环读取指定长度的数据
    for (index = 0; index < length; index++)
    {
        //---读取数据
        dat[index] = ex_i2c_master_receive_bits8_sw_poll(&(SHT2Xx->msg_i2cx));
        //---发送应答信号
        ex_i2c_master_send_ack_sw_poll(&(SHT2Xx->msg_i2cx),
            (index == (length - 1)) ? 1 : 0);
    }
    _return = OK_0;
    //---退出函数入口
GoExit:
    //---发送停止信号
    ex_i2c_master_stop_sw_poll(&(SHT2Xx->msg_i2cx));
    return _return;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t ex_sht2x_i2c_poll_data(ex_sht2x_i2c_def_type* SHT2Xx, uint8_t* dat)
{
    if (SHT2Xx->msg_i2cx.msg_hw != 0)
    {
        return ex_sht2x_i2c_hw_poll_data(SHT2Xx, dat);
    }
    else
    {
        return ex_sht2x_i2c_sw_poll_data(SHT2Xx, dat);
    }
}



#ifndef SHT2X_CFG_H_
#define SHT2X_CFG_H_
//
#ifdef __cplusplus
extern "C" {
#endif
    //
    #include "ex_sht2x_drivers.h"
    #include "crc_task.h"
    //

    #define SHT2X_CMD_HOLD_T        0xE3
    #define SHT2X_CMD_HOLD_TH        0xE5

    #define SHT2X_CMD_POLL_T        0xF3
    #define SHT2X_CMD_POLL_TH        0xF5

    #define SHT2X_CMD_REG_READ        0xE7
    #define SHT2X_CMD_REG_SEND        0xE6

    #define SHT2X_CMD_RST            0xFE

    #define SHT2X_RH12BIT_T14BIT    0x00
    #define SHT2X_RH8BIT_T12BIT        0x01
    #define SHT2X_RH10BIT_T13BIT    0x80
    #define SHT2X_RH11BIT_T11BIT    0x81
    #define SHT2X_RHBIT_TBIT_MASK    0x81

    #define SHT2X_HEATER_ON            0x04
    #define SHT2X_HEATER_OFF        0x00
    #define SHT2X_HEATER_MASK        0x04

    #define SHT2X_EOB_ON            0x40
    #define SHT2X_EOB_MASK            0x40

    //===结构体定义
    typedef struct _sht2x_i2c_handle_type            sht2x_i2c_handle_type;
    //===指针结构体定义
    typedef struct _sht2x_i2c_handle_type            *psht2x_i2c_handle_type;
    //===内存管理控制器
    struct _sht2x_i2c_handle_type
    {
        uint8_t msg_lock;                            //---锁定
        uint8_t msg_state;                            //---状态
        uint8_t msg_step;                            //---执行步序
        uint8_t msg_err;                            //---错误

        uint8_t    msg_reg;                            //---配置寄存器
        uint8_t    msg_reserve[3];                        //---保留

        int32_t    msg_temperaturec_x1000;                //---摄氏度温度
        int32_t    msg_temperaturef_x1000;                //---华氏度温度
        int32_t    msg_humidity_x1000;                    //---湿度

        uint32_t msg_interval_time;                    //---轮询时间间隔,单位是ms
        time_span_t msg_interval_tick;
        time_span_t msg_time_tick;

        ex_sht2x_i2c_def_type msg_sht2x_i2c;        //---sht2x结构
        void(*msg_f_delay_ms)(uint32_t );        //---ms延时
        time_span_t(*msg_f_time_ticks)(void);            //---时间节拍
    };

    #define SHT2X_I2C_TASK_ONE                p_sht2x_i2c_one    //---任务1
    #define SHT2X_I2C_TASK_TWO                0                //---任务2
    #define SHT2X_I2C_TASK_THREE            0

    extern sht2x_i2c_handle_type            g_sht2x_i2c_one;
    extern psht2x_i2c_handle_type            p_sht2x_i2c_one;

    //===函数定义
    uint8_t sht2x_i2c_init(sht2x_i2c_handle_type* SHT2Xx,
        void(*func_delay_us)(uint32_t delay),
        void(*func_delay_ms)(uint32_t delay),
        time_span_t(*func_time_ticks)(void), uint8_t ishw);
    uint8_t sht2x_i2c_exinit(sht2x_i2c_handle_type* SHT2Xx,
        void(*func_delay_us)(uint32_t delay),
        void(*func_delay_ms)(uint32_t delay),
        time_span_t(*func_time_ticks)(void), uint8_t ishw);
    uint8_t sht2x_i2c_rst(sht2x_i2c_handle_type* SHT2Xx);
    uint8_t sht2x_i2c_poll_handle(sht2x_i2c_handle_type* SHT2Xx);
    float sht2x_i2c_get_temperaturec_float(sht2x_i2c_handle_type* SHT2Xx);
    float sht2x_i2c_get_temperaturef_float(sht2x_i2c_handle_type* SHT2Xx);
    float sht2x_i2c_get_humidity_float(sht2x_i2c_handle_type* SHT2Xx);

//
#ifdef __cplusplus
}
#endif
//
#endif /* SHT2X_CFG_H_ */

#include "sht2x_cfg.h"


//===全局变量定义
sht2x_i2c_handle_type            g_sht2x_i2c_one = { 0 };
psht2x_i2c_handle_type            p_sht2x_i2c_one = &g_sht2x_i2c_one;

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_init_one(sht2x_i2c_handle_type* SHT2Xx)
{
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_p_portx = SHT2X_I2C_SCL_PORT_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_bit = SHT2X_I2C_SCL_BIT_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_alternate = SHT2X_I2C_SCL_ALTERNATE_ONE;

    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_p_portx = SHT2X_I2C_SDA_PORT_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_bit = SHT2X_I2C_SDA_BIT_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_alternate = SHT2X_I2C_SDA_ALTERNATE_ONE;

    //---使用的硬件I2C接口
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_p_i2cx = SHT2X_I2C_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_addr_id = SHT2X_ADDR_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_clock_speed = SHT2X_I2C_CLK_HZ_ONE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_pulse_width = SHT2X_PULSE_WIDTH_ONE;

    //---转换周期
    SHT2Xx->msg_interval_time = 100;
    //---寄存器默认值
    SHT2Xx->msg_reg = 0x02;

    return OK_0;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_init_two(sht2x_i2c_handle_type* SHT2Xx)
{
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_p_portx = SHT2X_I2C_SCL_PORT_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_bit = SHT2X_I2C_SCL_BIT_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_alternate = SHT2X_I2C_SCL_ALTERNATE_TWO;

    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_p_portx = SHT2X_I2C_SDA_PORT_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_bit = SHT2X_I2C_SDA_BIT_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_alternate = SHT2X_I2C_SDA_ALTERNATE_TWO;

    //---使用的硬件I2C接口
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_p_i2cx = SHT2X_I2C_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_addr_id = SHT2X_ADDR_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_clock_speed = SHT2X_I2C_CLK_HZ_TWO;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_pulse_width = SHT2X_PULSE_WIDTH_TWO;

    //---转换周期
    SHT2Xx->msg_interval_time = 100;
    //---寄存器默认值
    SHT2Xx->msg_reg = 0x02;
    return OK_0;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_init_three(sht2x_i2c_handle_type* SHT2Xx)
{
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_p_portx = SHT2X_I2C_SCL_PORT_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_bit = SHT2X_I2C_SCL_BIT_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sclx.msg_alternate = SHT2X_I2C_SCL_ALTERNATE_THREE;

    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_p_portx = SHT2X_I2C_SDA_PORT_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_bit = SHT2X_I2C_SDA_BIT_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_gpio_sdax.msg_alternate = SHT2X_I2C_SDA_ALTERNATE_THREE;

    //---使用的硬件I2C接口
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_p_i2cx = SHT2X_I2C_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_addr_id = SHT2X_ADDR_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_clock_speed = SHT2X_I2C_CLK_HZ_THREE;
    SHT2Xx->msg_sht2x_i2c.msg_i2cx.msg_pulse_width = SHT2X_PULSE_WIDTH_THREE;

    //---转换周期
    SHT2Xx->msg_interval_time = 100;
    //---寄存器默认值
    SHT2Xx->msg_reg = 0x02;
    return OK_0;
}

///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_init(sht2x_i2c_handle_type* SHT2Xx,
    void(*func_delay_us)(uint32_t delay),
    void(*func_delay_ms)(uint32_t delay),
    time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
    SHT2Xx->msg_f_time_ticks = func_time_ticks;
    SHT2Xx->msg_f_delay_ms = func_delay_ms;

    if ((SHT2Xx != NULL) && (SHT2Xx == SHT2X_I2C_TASK_ONE))
    {
        sht2x_i2c_init_one(SHT2Xx);
    }
    else if ((SHT2Xx != NULL) && (SHT2Xx == SHT2X_I2C_TASK_TWO))
    {
        sht2x_i2c_init_two(SHT2Xx);
    }
    else if ((SHT2Xx != NULL) && (SHT2Xx == SHT2X_I2C_TASK_THREE))
    {
        sht2x_i2c_init_three(SHT2Xx);
    }
    else
    {
        return ERROR_2;
    }
    SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
    SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
    //---初始化
    ex_sht2x_i2c_init(&(SHT2Xx->msg_sht2x_i2c),
        func_delay_us, func_delay_ms, func_time_ticks, ishw);
    //---初始化配置
    SHT2Xx->msg_step = 0;
    return OK_0;
}

///
//函        数: 
//功        能: 外部拓展定义
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_exinit(sht2x_i2c_handle_type* SHT2Xx,
    void(*func_delay_us)(uint32_t delay),
    void(*func_delay_ms)(uint32_t delay),
    time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
    SHT2Xx->msg_f_time_ticks = func_time_ticks;
    SHT2Xx->msg_f_delay_ms = func_delay_ms;
    SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
    SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
    //---初始化
    ex_sht2x_i2c_init(&(SHT2Xx->msg_sht2x_i2c),
        func_delay_us, func_delay_ms, func_time_ticks, ishw);
    //---初始化配置
    SHT2Xx->msg_step = 0;
    return OK_0;
}


///
//函        数: 
//功        能: 
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_rst(sht2x_i2c_handle_type* SHT2Xx)
{
    uint8_t _return = ERROR_1;
    //---发送复位命令
    _return= ex_sht2x_i2c_rst(&(SHT2Xx->msg_sht2x_i2c), SHT2X_CMD_RST);
    //---校验指令发送结果
    if (_return==OK_0)
    {
        //---寄存器默认值
        SHT2Xx->msg_reg = 0x02;
    }
    return _return;
}

///
//函        数: 
//功        能: 设置测量时间
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_set_measure_time(sht2x_i2c_handle_type* SHT2Xx, uint8_t reg, uint8_t ishumi)
{
    switch ((reg & SHT2X_RHBIT_TBIT_MASK))
    {
        case SHT2X_RH8BIT_T12BIT:
        {
            if (ishumi != 0)
            {
                SHT2Xx->msg_interval_time = 5 / SHT2X_MIN_PULSE_WIDTH;
            }
            else
            {
                SHT2Xx->msg_interval_time = 24 / SHT2X_MIN_PULSE_WIDTH;
            }
            break;
        }
        case SHT2X_RH10BIT_T13BIT:
        {
            if (ishumi != 0)
            {
                SHT2Xx->msg_interval_time = 10 / SHT2X_MIN_PULSE_WIDTH;
            }
            else
            {
                SHT2Xx->msg_interval_time = 45 / SHT2X_MIN_PULSE_WIDTH;
            }
            break;
        }
        case SHT2X_RH11BIT_T11BIT:
        {
            if (ishumi != 0)
            {
                SHT2Xx->msg_interval_time = 15 / SHT2X_MIN_PULSE_WIDTH;
            }
            else
            {
                SHT2Xx->msg_interval_time = 12 / SHT2X_MIN_PULSE_WIDTH;
            }
            break;
        }
        case SHT2X_RH12BIT_T14BIT:
        default:
        {
            if (ishumi != 0)
            {
                SHT2Xx->msg_interval_time = 30 / SHT2X_MIN_PULSE_WIDTH;
            }
            else
            {
                SHT2Xx->msg_interval_time = 90 / SHT2X_MIN_PULSE_WIDTH;
            }
            break;
        }
    }
    return OK_0;
}


///
//函        数: 
//功        能: 读取用户寄存器
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_read_reg(sht2x_i2c_handle_type* SHT2Xx)
{
    return ex_sht2x_i2c_read_reg(&(SHT2Xx->msg_sht2x_i2c), SHT2X_CMD_REG_READ, &(SHT2Xx->msg_reg));
}

///
//函        数: 
//功        能: 写用户寄存器
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_send_reg(sht2x_i2c_handle_type* SHT2Xx, uint8_t reg)
{
    SHT2Xx->msg_reg &= ~reg;
    SHT2Xx->msg_reg |= reg;
    sht2x_i2c_set_measure_time(SHT2Xx, SHT2Xx->msg_reg, 0);
    return ex_sht2x_i2c_send_reg(&(SHT2Xx->msg_sht2x_i2c), SHT2X_CMD_REG_SEND, SHT2Xx->msg_reg);
}


///
//函        数: 
//功        能: 轮训处理
//输入参    数: 
//输出参    数: 
//说        明: 
//
uint8_t sht2x_i2c_poll_handle(sht2x_i2c_handle_type* SHT2Xx)
{
    uint8_t _return =OK_0;
    double temptth = 0;
    switch (SHT2Xx->msg_step)
    {
        //---初始化
        case 0:
        {
            SHT2Xx->msg_step += 1;
            //---更新时间节点
            SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
            break;
        }
        //---温度测试 1
        case 1:
        {
            //---发送温度测试命令
            _return = ex_sht2x_i2c_poll_cmd(&(SHT2Xx->msg_sht2x_i2c), SHT2X_CMD_POLL_T);
            //---设置轮训时间
            sht2x_i2c_set_measure_time(SHT2Xx, SHT2Xx->msg_reg, 0);
            //---下一步
            SHT2Xx->msg_step += 1;
            //---更新轮训节点
            SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
            //---更新时间节点
            SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
            break;
        }
        //---温度测试 2
        case 2:
        {
            //---检查时间间隔是否到达
            if (TIME_SPAN_T(SHT2Xx->msg_f_time_ticks(), SHT2Xx->msg_interval_tick)>
                SHT2Xx->msg_interval_time)
            {
                //---更新轮训节点
                SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
                //---读取温度数据
                _return = ex_sht2x_i2c_poll_data(&(SHT2Xx->msg_sht2x_i2c), SHT2Xx->msg_reserve);
                //---校验温度的读取结果
                if (_return==OK_0)
                {
                    //---下一步
                    SHT2Xx->msg_step += 1;
                    //---更新时间节点
                    SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
                }
                else
                {
                    if (TIME_SPAN_T(SHT2Xx->msg_f_time_ticks(), SHT2Xx->msg_time_tick) >
                        (SHT2Xx->msg_interval_time>>1))
                    {
                        //---下一步
                        SHT2Xx->msg_step += 2;
                        //---更新时间节点
                        SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
                    }
                }
            }
            break;
        }
        //---温度测试 3
        case 3:
        {
            //---计算crc
            _return = crc_task_crc8_type(CRC8_TYPE_TABLE_31H_0, SHT2Xx->msg_reserve, 2);
            //---校验crc
            if (_return== SHT2Xx->msg_reserve[2])
            {
                //---将数据装换为温度数据
                temptth = SHT2Xx->msg_reserve[0];
                temptth *= 256;
                temptth += (SHT2Xx->msg_reserve[1]&0xFC);
                temptth *= 175.72;
                temptth /= 65536.0f;
                temptth -= 46.85;
                SHT2Xx->msg_temperaturec_x1000 = (int32_t)(temptth * 1000);
                //---将摄氏度转换为华氏度
                temptth *= 1.8;
                temptth += 32;
                SHT2Xx->msg_temperaturef_x1000 = (int32_t)(temptth * 1000);
            }
            //---下一步
            SHT2Xx->msg_step += 1;
            //---更新轮训节点
            SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
            //---更新时间节点
            SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
            break;
        }
        //---湿度测试 1
        case 4:
        {
            //---发送温度测试命令
            _return = ex_sht2x_i2c_poll_cmd(&(SHT2Xx->msg_sht2x_i2c), SHT2X_CMD_POLL_TH);
            //---设置轮训时间
            sht2x_i2c_set_measure_time(SHT2Xx, SHT2Xx->msg_reg, 1);
            //---下一步
            SHT2Xx->msg_step += 1;
            //---更新轮训节点
            SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
            //---更新时间节点
            SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
            break;
        }
        //---湿度测试 2
        case 5:
        {
            //---检查时间间隔是否到达
            if (TIME_SPAN_T(SHT2Xx->msg_f_time_ticks(), SHT2Xx->msg_interval_tick) >
                SHT2Xx->msg_interval_time)
            {
                //---更新轮训节点
                SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
                //---读取温度数据
                _return = ex_sht2x_i2c_poll_data(&(SHT2Xx->msg_sht2x_i2c), SHT2Xx->msg_reserve);
                //---校验温度的读取结果
                if (_return == OK_0)
                {
                    //---下一步
                    SHT2Xx->msg_step += 1;
                    //---更新时间节点
                    SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
                }
                else
                {
                    if (TIME_SPAN_T(SHT2Xx->msg_f_time_ticks(), SHT2Xx->msg_time_tick) >
                        (SHT2Xx->msg_interval_time >> 1))
                    {
                        //---下一步
                        SHT2Xx->msg_step += 2;
                        //---更新时间节点
                        SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
                    }
                }
            }
            break;
        }
        //---湿度测试 3
        case 6:
        {
            //---计算crc
            _return = crc_task_crc8_type(CRC8_TYPE_TABLE_31H_0, SHT2Xx->msg_reserve, 2);
            //---校验crc
            if (_return == SHT2Xx->msg_reserve[2])
            {
                //---将数据装换为湿度数据
                temptth = SHT2Xx->msg_reserve[0];
                temptth *= 256;
                temptth += (SHT2Xx->msg_reserve[1] & 0xFC);
                temptth *= 125.0f;
                temptth /= 65536.0f;
                temptth -= 6.0f;
                SHT2Xx->msg_humidity_x1000 = (int32_t)(temptth * 1000);
            }
            //---下一步
            SHT2Xx->msg_step += 1;
            //---更新轮训节点
            SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
            //---更新时间节点
            SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
            break;
        }
        //---结束
        case 7:
        default:
        {
            SHT2Xx->msg_step = 0;
            //---设置轮训时间
            sht2x_i2c_set_measure_time(SHT2Xx, SHT2Xx->msg_reg, 0);
            SHT2Xx->msg_time_tick = SHT2Xx->msg_f_time_ticks();
            SHT2Xx->msg_interval_tick = SHT2Xx->msg_f_time_ticks();
            break;
        }
    }
    return _return;
}


///
//函        数: 
//功        能: 摄氏度
//输入参    数: 
//输出参    数: 
//说        明: 
//
float sht2x_i2c_get_temperaturec_float(sht2x_i2c_handle_type* SHT2Xx)
{
    float _return = SHT2Xx->msg_temperaturec_x1000;

    return (_return / 1000.0f);
}

///
//函        数: 
//功        能: 华氏度
//输入参    数: 
//输出参    数: 
//说        明: 
//
float sht2x_i2c_get_temperaturef_float(sht2x_i2c_handle_type* SHT2Xx)
{
    float _return = SHT2Xx->msg_temperaturef_x1000;

    return (_return / 1000.0f);
}

///
//函        数: 
//功        能: 湿度
//输入参    数: 
//输出参    数: 
//说        明: 
//
float sht2x_i2c_get_humidity_float(sht2x_i2c_handle_type* SHT2Xx)
{
    float _return = SHT2Xx->msg_humidity_x1000;

    return (_return / 1000.0f);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值