#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);
}
SHT2x
最新推荐文章于 2024-09-16 11:29:33 发布