#ifndef EX_SHT3X_DRIVERS_H_
#define EX_SHT3X_DRIVERS_H_
//
#ifdef __cplusplus
extern "C" {
#endif
//
#include "complier_lib.h"
#include "hw_config.h"
#include "ex_i2c_drivers.h"
//
//===定义结构体
typedef struct _ex_sht3x_i2c_def_type ex_sht3x_i2c_def_type;
//===定义结构体
typedef struct _ex_sht3x_i2c_def_type ex_sht3x_i2c_def_t;
//===定义指针结构体
typedef struct _ex_sht3x_i2c_def_type * pex_sht3x_i2c_def_type;
//===结构体定义
struct _ex_sht3x_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_sht3x_i2c_init(ex_sht3x_i2c_def_type* SHT3Xx,
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_sht3x_i2c_deinit(ex_sht3x_i2c_def_type* SHT3Xx);
uint8_t ex_sht3x_i2c_read(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length);
uint8_t ex_sht3x_i2c_send(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length);
//
#ifdef __cplusplus
}
#endif
//
#endif /* EX_SHT3X_DRIVERS_H_ */
#include "ex_sht3x_drivers.h"
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_init_hw(ex_sht3x_i2c_def_type* SHT3Xx,
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(&(SHT3Xx->msg_i2cx),
func_delay_us,
func_time_ticks,
ishw);
//---注册函数
SHT3Xx->msg_f_delay_us = func_delay_us;
SHT3Xx->msg_f_delay_ms = func_delay_ms;
SHT3Xx->msg_f_time_ticks = func_time_ticks;
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_sw_init(ex_sht3x_i2c_def_type* SHT3Xx,
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(&(SHT3Xx->msg_i2cx),
func_delay_us,
func_time_ticks, ishw);
//---注册函数
SHT3Xx->msg_f_delay_us = func_delay_us;
SHT3Xx->msg_f_delay_ms = func_delay_ms;
SHT3Xx->msg_f_time_ticks = func_time_ticks;
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_init(ex_sht3x_i2c_def_type* SHT3Xx,
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_sht3x_i2c_init_hw(SHT3Xx,
func_delay_us, func_delay_ms, func_time_ticks,ishw);
}
else
{
return ex_sht3x_i2c_sw_init(SHT3Xx,
func_delay_us, func_delay_ms, func_time_ticks, ishw);
}
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_deinit(ex_sht3x_i2c_def_type* SHT3Xx)
{
if (SHT3Xx->msg_i2cx.msg_hw != 0)
{
return ex_i2c_deinit_hw(&(SHT3Xx->msg_i2cx));
}
else
{
return ex_i2c_deinit_sw(&(SHT3Xx->msg_i2cx));
}
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_send_bits8_sw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t val)
{
uint8_t _return = OK_0;
//---检查空闲
_return = ex_i2c_master_check_busy_sw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_2;
goto GoExit;
}
//---发送启动信号
ex_i2c_master_start_sw_poll(&(SHT3Xx->msg_i2cx));
//---发送从机地址
ex_i2c_master_send_addr_sw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) & 0xFE);
//---读取应答信号
_return = ex_i2c_master_receive_ack_sw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_3;
goto GoExit;
}
//---数据发送
ex_i2c_master_send_bits8_sw_poll(&(SHT3Xx->msg_i2cx), val, 1);
//---读取ACK
_return = ex_i2c_master_receive_ack_sw_poll(&(SHT3Xx->msg_i2cx));
//---退出操作入口
GoExit:
//---发送停止信号
ex_i2c_master_stop_sw_poll(&(SHT3Xx->msg_i2cx));
return _return;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_send_bits8_hw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t val)
{
uint8_t _return = OK_0;
//---检查空闲
_return = ex_i2c_master_check_busy_hw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_2;
goto GoExit;
}
//---发送启动命令
_return = ex_i2c_master_start_addr_hw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) & 0xFE);
//---判断发送结果
if (_return != OK_0)
{
//---发送重新启动命令
_return = ex_i2c_master_restart_addr_hw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) & 0xFE);
//---校验状态
if (_return != OK_0)
{
_return = ERROR_3;
goto GoExit;
}
}
//---发送指定地址的数据
_return = ex_i2c_master_send_bits8_hw_poll(&(SHT3Xx->msg_i2cx), val, 1);
//---校验状态
if (_return != OK_0)
{
_return = ERROR_3;
goto GoExit;
}
//---退出函数入口
GoExit:
//---发送停止信号
ex_i2c_master_stop_hw_poll(&(SHT3Xx->msg_i2cx));
return _return;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_send_sw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_send_hw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_read_bits8_sw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* val)
{
uint8_t _return = OK_0;
//---检查空闲
_return = ex_i2c_master_check_busy_sw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_2;
goto GoExit;
}
//---发送启动信号
ex_i2c_master_start_sw_poll(&(SHT3Xx->msg_i2cx));
//---发送从机地址
ex_i2c_master_send_addr_sw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) | 0x01);
//---读取应答信号
_return = ex_i2c_master_receive_ack_sw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动读数据失败
_return = ERROR_3;
goto GoExit;
}
//---读取数据
(*val) = ex_i2c_master_receive_bits8_sw_poll(&(SHT3Xx->msg_i2cx));
//---发送不应答信号
_return = ex_i2c_master_send_ack_sw_poll(&(SHT3Xx->msg_i2cx), 1);
//---退出函数入口
GoExit:
//---发送停止信号
ex_i2c_master_stop_sw_poll(&(SHT3Xx->msg_i2cx));
return _return;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_read_bits8_hw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* val)
{
uint8_t _return = OK_0;
//---检查空闲
_return = ex_i2c_master_check_busy_hw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_2;
goto GoExit;
}
//---发送启动命令
_return = ex_i2c_master_start_addr_hw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) | 0x01);
//---判断发送结果
if (_return != OK_0)
{
//---发送重新启动命令
_return = ex_i2c_master_restart_addr_hw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) | 0x01);
//---校验
if (_return != OK_0)
{
_return = ERROR_3;
goto GoExit;
}
}
//---发送应答
_return = ex_i2c_master_send_ack_hw_poll(&(SHT3Xx->msg_i2cx), 1);
//---校验
if (_return != OK_0)
{
_return = ERROR_3;
goto GoExit;
}
//---数据读取
_return = ex_i2c_master_receive_bits8_hw_poll(&(SHT3Xx->msg_i2cx), val, 1, 0);
//---校验
if (_return != OK_0)
{
_return = ERROR_5;
}
//---退出函数入口
GoExit:
//---发送停止信号
ex_i2c_master_stop_hw_poll(&(SHT3Xx->msg_i2cx));
return _return;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_read_sw_poll(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
uint8_t _return = OK_0;
uint16_t index = 0;
//---检查空闲
_return = ex_i2c_master_check_busy_sw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_2;
goto GoExit;
}
//---发送启动信号
ex_i2c_master_start_sw_poll(&(SHT3Xx->msg_i2cx));
//---发送从机地址
ex_i2c_master_send_addr_sw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) | 0x01);
//---读取应答信号
_return = ex_i2c_master_receive_ack_sw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动读数据失败
_return = ERROR_3;
goto GoExit;
}
//---循环读取指定长度的数据
for (index = 0; index < length; index++)
{
//---读取数据
buffer[index] = ex_i2c_master_receive_bits8_sw_poll(&(SHT3Xx->msg_i2cx));
//---发送应答信号
ex_i2c_master_send_ack_sw_poll(&(SHT3Xx->msg_i2cx),
(index == (length - 1)) ? 1 : 0);
}
_return = OK_0;
//---退出函数入口
GoExit:
//---发送停止信号
ex_i2c_master_stop_sw_poll(&(SHT3Xx->msg_i2cx));
return _return;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_read_hw_poll(ex_sht3x_i2c_def_type* SHT3Xx,
uint8_t* buffer, uint16_t length)
{
uint8_t _return = OK_0;
uint16_t index = 0;
//---检查空闲
_return = ex_i2c_master_check_busy_hw_poll(&(SHT3Xx->msg_i2cx));
if (_return != OK_0)
{
//---启动写数据失败
_return = ERROR_2;
goto GoExit;
}
//---发送启动命令
_return = ex_i2c_master_start_addr_hw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->msg_i2cx.msg_addr_id) | 0x01);
//---判断发送结果
if (_return != OK_0)
{
//---发送重新启动命令
_return = ex_i2c_master_restart_addr_hw_poll(&(SHT3Xx->msg_i2cx),
(uint8_t)(SHT3Xx->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(&(SHT3Xx->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(&(SHT3Xx->msg_i2cx),
&buffer[index],
_return,
(index < (length - 1)) ? 1 : 0);
//---校验
if (_return != OK_0)
{
_return = ERROR_7;
break;
}
}
//---退出函数入口
GoExit:
//---发送停止信号
ex_i2c_master_stop_hw_poll(&(SHT3Xx->msg_i2cx));
return _return;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_read(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
if (SHT3Xx->msg_i2cx.msg_hw != 0)
{
if (length > 1)
{
return ex_sht3x_i2c_read_hw_poll(SHT3Xx, buffer, length);
}
else
{
return ex_sht3x_i2c_read_bits8_hw_poll(SHT3Xx, buffer);
}
}
else
{
if (length > 1)
{
return ex_sht3x_i2c_read_sw_poll(SHT3Xx, buffer, length);
}
else
{
return ex_sht3x_i2c_read_bits8_sw_poll(SHT3Xx, buffer);
}
}
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t ex_sht3x_i2c_send(ex_sht3x_i2c_def_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
if (SHT3Xx->msg_i2cx.msg_hw != 0)
{
if (length > 1)
{
return ex_sht3x_i2c_send_hw_poll(SHT3Xx, buffer, length);
}
else
{
return ex_sht3x_i2c_send_bits8_hw_poll(SHT3Xx, *buffer);
}
}
else
{
if (length > 1)
{
return ex_sht3x_i2c_send_sw_poll(SHT3Xx, buffer, length);
}
else
{
return ex_sht3x_i2c_send_bits8_sw_poll(SHT3Xx, *buffer);
}
}
}
#ifndef SHT3X_CFG_H_
#define SHT3X_CFG_H_
//
#ifdef __cplusplus
extern "C" {
#endif
//
#include "ex_sht3x_drivers.h"
#include "crc_task.h"
#include "gpio_task.h"
//
//===定义使用多路复用
#define SHT3X_MULTIPLEX
#define SHT3X_CMD_SINGLE_HIGH_STRERCH_ENABLE 0x2C06
#define SHT3X_CMD_SINGLE_MEDIUM_STRERCH_ENABLE 0x2C0D
#define SHT3X_CMD_SINGLE_LOW_STRERCH_ENABLE 0x2C10
#define SHT3X_CMD_SINGLE_HIGH_STRERCH_DISABLE 0x2400
#define SHT3X_CMD_SINGLE_MEDIUM_STRERCH_DISABLE 0x240B
#define SHT3X_CMD_SINGLE_LOW_STRERCH_DISABLE 0x2416
#define SHT3X_CMD_PERIOD_HIGH_MPS_P5 0x2032
#define SHT3X_CMD_PERIOD_MEDIUM_MPS_P5 0x2024
#define SHT3X_CMD_PERIOD_LOW_MPS_P5 0x202F
#define SHT3X_CMD_PERIOD_HIGH_MPS_1P 0x2130
#define SHT3X_CMD_PERIOD_MEDIUM_MPS_1P 0x2126
#define SHT3X_CMD_PERIOD_LOW_MPS_1P 0x212D
#define SHT3X_CMD_PERIOD_HIGH_MPS_2P 0x2236
#define SHT3X_CMD_PERIOD_MEDIUM_MPS_2P 0x2220
#define SHT3X_CMD_PERIOD_LOW_MPS_2P 0x222B
#define SHT3X_CMD_PERIOD_HIGH_MPS_4P 0x2334
#define SHT3X_CMD_PERIOD_MEDIUM_MPS_4P 0x2322
#define SHT3X_CMD_PERIOD_LOW_MPS_4P 0x2329
#define SHT3X_CMD_PERIOD_HIGH_MPS_10P 0x2737
#define SHT3X_CMD_PERIOD_MEDIUM_MPS_10P 0x2721
#define SHT3X_CMD_PERIOD_LOW_MPS_10P 0x272A
#define SHT3X_CMD_PERIOD_ART 0x2B32
#define SHT3X_CMD_BREAK 0x3093
#define SHT3X_CMD_RESET 0x30A2
#define SHT3X_CMD_HEATER_ENABLE 0x306D
#define SHT3X_CMD_HEATER_DISABLE 0x3066
#define SHT3X_CMD_STATE_READ 0xF32D
#define SHT3X_CMD_STATE_CLEAR 0x3041
#define SHT3X_CMD_PERIOD_READ 0xE000
//===结构体定义
typedef struct _sht3x_i2c_handle_type sht3x_i2c_handle_type;
//===指针结构体定义
typedef struct _sht3x_i2c_handle_type *psht3x_i2c_handle_type;
//===内存管理控制器
struct _sht3x_i2c_handle_type
{
uint8_t msg_lock; //---锁定
uint8_t msg_state; //---状态
uint8_t msg_step; //---执行步序
uint8_t msg_err; //---错误
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_gpio_def_type msg_sht3x_rst; //---硬件复位引脚
ex_sht3x_i2c_def_type msg_sht3x_i2c; //---sht3x结构
void(*msg_f_delay_ms)(uint32_t ); //---ms延时
time_span_t(*msg_f_time_ticks)(void); //---时间节拍
};
#define SHT3X_I2C_TASK_ONE p_sht3x_i2c_one //---任务1
#define SHT3X_I2C_TASK_TWO 0 //---任务2
#define SHT3X_I2C_TASK_THREE 0
extern sht3x_i2c_handle_type g_sht3x_i2c_one;
extern psht3x_i2c_handle_type p_sht3x_i2c_one;
//===函数定义
uint8_t sht3x_i2c_init(sht3x_i2c_handle_type* SHT3Xx,
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 sht3x_i2c_exinit(sht3x_i2c_handle_type* SHT3Xx,
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 sht3x_i2c_rst(sht3x_i2c_handle_type* SHT3Xx);
uint8_t sht3x_i2c_period_set(sht3x_i2c_handle_type* SHT3Xx, uint16_t cmd);
uint8_t sht3x_i2c_period_handle(sht3x_i2c_handle_type* SHT3Xx);
float sht3x_i2c_get_temperaturec_float(sht3x_i2c_handle_type* SHT3Xx);
float sht3x_i2c_get_temperaturef_float(sht3x_i2c_handle_type* SHT3Xx);
float sht3x_i2c_get_humidity_float(sht3x_i2c_handle_type* SHT3Xx);
//
#ifdef __cplusplus
}
#endif
//
#endif /* SHT3X_CFG_H_ */
#include "sht3x_cfg.h"
//===全局变量定义
sht3x_i2c_handle_type g_sht3x_i2c_one = { 0 };
psht3x_i2c_handle_type p_sht3x_i2c_one = &g_sht3x_i2c_one;
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_init_one(sht3x_i2c_handle_type* SHT3Xx)
{
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_p_portx = SHT3X_I2C_SCL_PORT_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_bit = SHT3X_I2C_SCL_BIT_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_alternate = SHT3X_I2C_SCL_ALTERNATE_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_p_portx = SHT3X_I2C_SDA_PORT_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_bit = SHT3X_I2C_SDA_BIT_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_alternate = SHT3X_I2C_SDA_ALTERNATE_ONE;
//---使用的硬件I2C接口
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_p_i2cx = SHT3X_I2C_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_addr_id = SHT3X_ADDR_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_clock_speed = SHT3X_I2C_CLK_HZ_ONE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_pulse_width = SHT3X_PULSE_WIDTH_ONE;
//---转换周期
SHT3Xx->msg_interval_time = SHT3X_SAMPLE_PERIOD;
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_init_two(sht3x_i2c_handle_type* SHT3Xx)
{
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_p_portx = SHT3X_I2C_SCL_PORT_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_bit = SHT3X_I2C_SCL_BIT_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_alternate = SHT3X_I2C_SCL_ALTERNATE_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_p_portx = SHT3X_I2C_SDA_PORT_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_bit = SHT3X_I2C_SDA_BIT_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_alternate = SHT3X_I2C_SDA_ALTERNATE_TWO;
//---使用的硬件I2C接口
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_p_i2cx = SHT3X_I2C_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_addr_id = SHT3X_ADDR_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_clock_speed = SHT3X_I2C_CLK_HZ_TWO;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_pulse_width = SHT3X_PULSE_WIDTH_TWO;
//---转换周期
SHT3Xx->msg_interval_time = SHT3X_SAMPLE_PERIOD;
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_init_three(sht3x_i2c_handle_type* SHT3Xx)
{
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_p_portx = SHT3X_I2C_SCL_PORT_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_bit = SHT3X_I2C_SCL_BIT_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sclx.msg_alternate = SHT3X_I2C_SCL_ALTERNATE_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_p_portx = SHT3X_I2C_SDA_PORT_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_bit = SHT3X_I2C_SDA_BIT_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_gpio_sdax.msg_alternate = SHT3X_I2C_SDA_ALTERNATE_THREE;
//---使用的硬件I2C接口
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_p_i2cx = SHT3X_I2C_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_addr_id = SHT3X_ADDR_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_clock_speed = SHT3X_I2C_CLK_HZ_THREE;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_pulse_width = SHT3X_PULSE_WIDTH_THREE;
//---转换周期
SHT3Xx->msg_interval_time = SHT3X_SAMPLE_PERIOD;
return OK_0;
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_init(sht3x_i2c_handle_type* SHT3Xx,
void(*func_delay_us)(uint32_t delay),
void(*func_delay_ms)(uint32_t delay),
time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
SHT3Xx->msg_f_time_ticks = func_time_ticks;
SHT3Xx->msg_f_delay_ms = func_delay_ms;
if ((SHT3Xx != NULL) && (SHT3Xx == SHT3X_I2C_TASK_ONE))
{
sht3x_i2c_init_one(SHT3Xx);
}
else if ((SHT3Xx != NULL) && (SHT3Xx == SHT3X_I2C_TASK_TWO))
{
sht3x_i2c_init_two(SHT3Xx);
}
else if ((SHT3Xx != NULL) && (SHT3Xx == SHT3X_I2C_TASK_THREE))
{
sht3x_i2c_init_three(SHT3Xx);
}
else
{
return ERROR_2;
}
SHT3Xx->msg_time_tick = SHT3Xx->msg_f_time_ticks();
SHT3Xx->msg_interval_tick = SHT3Xx->msg_f_time_ticks();
//---初始化
ex_sht3x_i2c_init(&(SHT3Xx->msg_sht3x_i2c),
func_delay_us, func_delay_ms, func_time_ticks, ishw);
//---初始化配置
return sht3x_i2c_period_set(SHT3Xx, SHT3X_CMD_PERIOD_LOW_MPS_1P);
}
///
//函 数:
//功 能: 外部拓展定义
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_exinit(sht3x_i2c_handle_type* SHT3Xx,
void(*func_delay_us)(uint32_t delay),
void(*func_delay_ms)(uint32_t delay),
time_span_t(*func_time_ticks)(void), uint8_t ishw)
{
SHT3Xx->msg_f_time_ticks = func_time_ticks;
SHT3Xx->msg_f_delay_ms = func_delay_ms;
SHT3Xx->msg_time_tick = SHT3Xx->msg_f_time_ticks();
SHT3Xx->msg_interval_tick = SHT3Xx->msg_f_time_ticks();
//---初始化
ex_sht3x_i2c_init(&(SHT3Xx->msg_sht3x_i2c),
func_delay_us, func_delay_ms, func_time_ticks, ishw);
//---初始化配置
return OK_0;
}
///
//函 数:
//功 能: 读数据
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_read(sht3x_i2c_handle_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
return ex_sht3x_i2c_read(&(SHT3Xx->msg_sht3x_i2c), buffer, length);
}
///
//函 数:
//功 能: 写数据
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_send(sht3x_i2c_handle_type* SHT3Xx, uint8_t* buffer, uint16_t length)
{
return ex_sht3x_i2c_send(&(SHT3Xx->msg_sht3x_i2c), buffer, length);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_send_cmd(sht3x_i2c_handle_type* SHT3Xx, uint16_t cmd)
{
uint8_t tempcmd[2] = { 0x00,0x00 };
tempcmd[0] = (uint8_t)((cmd >> 8) & 0xFF);
tempcmd[1] = (uint8_t)((cmd >> 0) & 0xFF);
return sht3x_i2c_send(SHT3Xx,tempcmd,2);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_rst(sht3x_i2c_handle_type* SHT3Xx)
{
uint8_t tempcmd[2] = {0x30,0xA2};
//---校验复位模式,硬件还是软件
if (SHT3Xx->msg_sht3x_rst.msg_p_portx!=0)
{
exgpio_task_reset(SHT3Xx->msg_sht3x_rst);
SHT3Xx->msg_f_delay_ms(1);
exgpio_task_set(SHT3Xx->msg_sht3x_rst);
return OK_0;
}
else
{
#ifdef SHT3X_MULTIPLEX
tempcmd[0] = 0x06;
tempcmd[1] = SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_addr_id;
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_addr_id = 0;
tempcmd[0] = sht3x_i2c_send(SHT3Xx, &tempcmd[0], 1);
SHT3Xx->msg_sht3x_i2c.msg_i2cx.msg_addr_id= tempcmd[1];
return tempcmd[0];
#else
return sht3x_i2c_send(SHT3Xx, tempcmd, 2);
#endif
}
}
///
//函 数:
//功 能: 周期读取温湿度信息
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_read_temperature_humidity_period(sht3x_i2c_handle_type* SHT3Xx)
{
uint8_t _return = OK_0;
uint8_t tempres[6] = { 0 };
uint8_t tempcrc[2] = { 0xE0,0x00 };
double temptth = 0;
//---发送读取温度命令
_return = sht3x_i2c_send(SHT3Xx, tempcrc, 2);
//---读取采样结果
_return = sht3x_i2c_read(SHT3Xx, tempres, 6);
//---crc校验温度
tempcrc[0] = crc_task_crc8_type(CRC8_TYPE_TABLE_31H_1, tempres, 2);
//---crc校验湿度
tempcrc[1] = crc_task_crc8_type(CRC8_TYPE_TABLE_31H_1, tempres + 3, 2);
//----判断校验信息
if ((tempres[2] == tempcrc[0]) &&
(tempres[5] == tempcrc[1]) &&
(_return == OK_0))
{
//---计算摄氏温度数据
temptth = tempres[0];
temptth *= 256;
temptth += tempres[1];
temptth *= 175;
temptth /= 65535;
temptth -= 45;
SHT3Xx->msg_temperaturec_x1000 = (int32_t)(temptth * 1000);
//---计算华氏温度数据
temptth = tempres[0];
temptth *= 256;
temptth += tempres[1];
temptth *= 315;
temptth /= 65535;
temptth -= 49;
SHT3Xx->msg_temperaturef_x1000 = (int32_t)(temptth * 1000);
//---计算湿度
temptth = tempres[3];
temptth *= 256;
temptth += tempres[4];
temptth *= 100;
temptth /= 65535;
SHT3Xx->msg_humidity_x1000 = (int32_t)(temptth * 1000);
}
else
{
_return = ERROR_8;
}
return _return;
}
///
//函 数:
//功 能: 周期测量
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_period_handle(sht3x_i2c_handle_type* SHT3Xx)
{
uint8_t _return = OK_0;
//---判断采集周期是否到达
if (TIME_SPAN_T(SHT3Xx->msg_f_time_ticks(), SHT3Xx->msg_interval_tick) > SHT3Xx->msg_interval_time)
{
//---读取温湿度数据
_return = sht3x_i2c_read_temperature_humidity_period(SHT3Xx);
//---更新时间节点
SHT3Xx->msg_interval_tick = SHT3Xx->msg_f_time_ticks();
}
return _return;
}
///
//函 数:
//功 能: 设置测量周期
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t sht3x_i2c_period_set(sht3x_i2c_handle_type* SHT3Xx,uint16_t cmd)
{
uint8_t tempcmd[2] = { 0x00,0x00 };
tempcmd[0] = (uint8_t)((cmd >> 8) & 0xFF);
tempcmd[1] = (uint8_t)((cmd >> 0) & 0xFF);
//---根据命令配置采样周期事假
switch (tempcmd[0])
{
case 0x21:
{
SHT3Xx->msg_interval_time = 1000;
break;
}
case 0x22:
{
SHT3Xx->msg_interval_time = 500;
break;
}
case 0x23:
{
SHT3Xx->msg_interval_time = 250;
break;
}
case 0x27:
{
SHT3Xx->msg_interval_time = 100;
break;
}
case 0x20:
default:
{
SHT3Xx->msg_interval_time = 2000;
break;
}
}
//---更新时间节点
SHT3Xx->msg_interval_tick = SHT3Xx->msg_f_time_ticks();
return sht3x_i2c_send(SHT3Xx, tempcmd, 2);
}
///
//函 数:
//功 能: 摄氏度
//输入参 数:
//输出参 数:
//说 明:
//
float sht3x_i2c_get_temperaturec_float(sht3x_i2c_handle_type* SHT3Xx)
{
float _return = SHT3Xx->msg_temperaturec_x1000;
return (_return / 1000.0f);
}
///
//函 数:
//功 能: 华氏度
//输入参 数:
//输出参 数:
//说 明:
//
float sht3x_i2c_get_temperaturef_float(sht3x_i2c_handle_type* SHT3Xx)
{
float _return = SHT3Xx->msg_temperaturef_x1000;
return (_return / 1000.0f);
}
///
//函 数:
//功 能: 湿度
//输入参 数:
//输出参 数:
//说 明:
//
float sht3x_i2c_get_humidity_float(sht3x_i2c_handle_type* SHT3Xx)
{
float _return = SHT3Xx->msg_humidity_x1000;
return (_return / 1000.0f);
}