/**********************************************************************************
* 文件名 :sht10.h
* 描述 :sht10.c 的头文件,使用 sht10.c 相关函数时包含此头文件即可
* 作者 :DJF
* 创作日期 :2013-6-28
* 修改日期 :2013-6-28
* 修改说明 :首次编写
**********************************************************************************/
#ifndef __SHT10_H
#define __SHT10_H
/* 头文件 --------------------------------------------------------------------- */
#include "stm32f10x.h"
#include "SysTick.h"
/* 供外部调用函数声明 ------------------------------------------------------------ */
void SHT10_GPIO_Init(void);//使用 SHT10 之前 需要先调用此函数对相关引脚进行初始化
u8 SHT10_Read( float* pHumidity, float* pTemperature );//SHT10 温湿度读取函数,读取成功返回0,否则返回1;
//温湿度值通过 输入参数 的指针传递
u8 SHT10_SoftReset(void);
/* 自定义同义关键字 ---------------------------------------------------------- */
#define GPIO_DATA GPIOB // SHT10数据端口引脚所在组
#define GPIO_DATA_PIN GPIO_Pin_7 // SHT10数据端口引脚号
#define RCC_GPIO_DATA RCC_APB2Periph_GPIOB // SHT10数据引脚时钟组
#define GPIO_SCK GPIOB // SHT10时钟端口引脚所在组
#define GPIO_SCK_PIN GPIO_Pin_6 // SHT10时钟端口引脚号
#define RCC_GPIO_SCK RCC_APB2Periph_GPIOB // SHT10时钟引脚时钟组
#define SCK_TIME 1 //确定 SHT10 SCK 的频率,频率值为 ( 0.1/SCK_TIME )MHz
// SHT10 的频率取值范围是 0~10MHz(0~1MHz)对应电压 VDD>4.5V(VDD<4.5)
/* 自定义变量 ---------------------------------------------------------------- */
enum {TEMP,HUMI};
#endif
/**********************************************************************************
* 文件名 :sht10.c
* 描述 :sht10相关函数
* 作者 :DJF
* 创作日期 :2013-6-28
* 修改日期 :2013-6-28
* 修改说明 :首次编写
**********************************************************************************/
/* 头文件 --------------------------------------------------------------------- */
#include "sht10.h"
/* 自定义同义关键字 ---------------------------------------------------------- */
#define ACK 1
#define noACK 0
/* 自定义参数宏 -------------------------------------------------------------- */
/* 自定义函数宏 -------------------------------------------------------------- */
#define DATA_H() GPIO_SetBits( GPIO_DATA, GPIO_DATA_PIN )
#define DATA_L() GPIO_ResetBits( GPIO_DATA,GPIO_DATA_PIN )
#define SCK_H() GPIO_SetBits( GPIO_SCK, GPIO_SCK_PIN )
#define SCK_L() GPIO_ResetBits( GPIO_SCK, GPIO_SCK_PIN )
#define DATA_R() GPIO_ReadInputDataBit(GPIO_DATA,GPIO_DATA_PIN) //读 DATA 引脚数据
/* 自定义变量 ---------------------------------------------------------------- */
//u8 t_num[2] = {0,0};// 存放从 SHT10 所读取到的温度初始值
//u8 h_num[2] = {0,0};// 存放从 SHT10 所读取到的湿度初始值
u8 check_num[1] = {0};// 存放从 SHT10 所读取到的 CRC 校验值
/* 自定义函数声明 ------------------------------------------------------------ */
void SHT10_DATA_OUT(void);
void SHT10_DATA_IN(void);
void SHT10_Delay(void);
/********************************************************************************
* 函数名 :SHT10_Start
* 描述 :SHT10启东传输程序
* 输入参数 : 无
* 输出结果 :无
* 返回值 :无
********************************************************************************/
void SHT10_Start(void)
{
SHT10_DATA_OUT();
SCK_L();
SHT10_Delay();
SCK_H();
SHT10_Delay();
DATA_L();
SHT10_Delay();
SCK_L();
SHT10_Delay();
SCK_H();
SHT10_Delay();
DATA_H();
SHT10_Delay();
SCK_L();
}
/********************************************************************************
* 函数名 :SHT10_GPIO_Init
* 描述 :SHT10 GPIO初始化函数,由 SHT10_Init() 函数调用
* 输入参数 : 无
* 输出结果 :无
* 返回值 :无
********************************************************************************/
void SHT10_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//使能 SHT10 数据端口,时钟端口 引脚所在组时钟
RCC_APB2PeriphClockCmd(RCC_GPIO_DATA ,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_GPIO_SCK ,ENABLE);
//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_DATA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_DATA, &GPIO_InitStructure);
//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_SCK, &GPIO_InitStructure);
}
/********************************************************************************
* 函数名 :SHT10_DATA_OUT
* 描述 :SHT10 DATA引脚对应的 stm32 引脚设置为输出模式
* 输入参数 : 无
* 输出结果 :无
* 返回值 :无
********************************************************************************/
void SHT10_DATA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_DATA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_DATA, &GPIO_InitStructure);
}
/********************************************************************************
* 函数名 :SHT10_DATA_IN
* 描述 :SHT10 DATA引脚对应的 stm32 引脚设置为输入模式
* 输入参数 : 无
* 输出结果 :无
* 返回值 :无
********************************************************************************/
void SHT10_DATA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//浮空输入,使用外部上拉电阻
GPIO_InitStructure.GPIO_Pin = GPIO_DATA_PIN;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIO_DATA, &GPIO_InitStructure);
}
/********************************************************************************
* 函数名 :SHT10_ReadByte
* 描述 :从 SHT10 读取8位数据,由参数 Ack 的值判断是否结束通信。
* 读取 CRC 8位校验之前输入 Ack=0 则表示不使用 CRC
* 输入参数 : u8 型的 Ack ,作为判断是否结束通信,Ack=0 表示结束通信
* 输出结果 :无
* 返回值 :返回所读取的 8位 数据
********************************************************************************/
u8 SHT10_ReadByte( u8 Ack )
{
u8 i, val=0;
//读八个字节的数据,SCK 高电平时读出 SHT10 的数据,读完后给 SCK 一个低电平,之后读下一位
SHT10_DATA_IN();
for( i=0x80; i>0; i/=2 )
{
SHT10_Delay();
SCK_H();
SHT10_Delay();
if( DATA_R() )
val = ( val | i );
SCK_L();
}
//判断是否结束通信,并输出相应电平
SHT10_DATA_OUT();
if(Ack)
DATA_L();
else
DATA_H();
//需要重新给 SHT10 一个低电平以确保 DATA 输出有效
SHT10_Delay();
SCK_H();
SHT10_Delay();
SCK_L();
SHT10_Delay();
return val;
}
/********************************************************************************
* 函数名 :SHT10_WriteByte
* 描述 :向 SHT10 写入8位数据,参数 value 表示要写入的值
* 写入成功则返回 0 ,不成功则返回 1 。
* 输入参数 : u8 型的 value 表示要写入的值
* 输出结果 :无
* 返回值 :u8型 写入成功则返回 0 ,不成功则返回 1 。
********************************************************************************/
u8 SHT10_WriteByte( u8 value )
{
u8 i, error = 0;
SHT10_DATA_OUT();
for( i=0x80; i>0; i/=2 )
{
if( i & value )
DATA_H();
else
DATA_L();
SHT10_Delay();
SCK_H();
SHT10_Delay();
SCK_L();
SHT10_Delay();
}
SHT10_DATA_IN();
SCK_H();
SHT10_Delay();
error = DATA_R();//在第 9 个时钟上升沿读取 SHT10 的 DATA 的数据,为低电平则说明:已正确的接收到指令
SCK_L();
SHT10_Delay();
return error;
}
/********************************************************************************
* 函数名 :SHT10_ConnectionReset
* 描述 :SHT10 通讯中断时复位,状态寄存器内容任然保留
* 输入参数 : 无
* 输出结果 :无
* 返回值 :无
********************************************************************************/
void SHT10_ConnectionReset(void)
{
u8 i;
SHT10_DATA_OUT();
DATA_H();
SCK_L();
for( i=0; i<9; i++ )
{
SCK_H();
SHT10_Delay();
SCK_L();
SHT10_Delay();
}
SHT10_Start();
}
/********************************************************************************
* 函数名 :SHT10_ConnectionReset
* 描述 :SHT10 软复位程序,复位接口,清空状态寄存器为默认值
* 下一命令前至少等待11ms
* 输入参数 : 无
* 输出结果 :无
* 返回值 :复位成功则返回 0 ,不成功则返回1
********************************************************************************/
u8 SHT10_SoftReset(void)
{
u8 error = 0;
SHT10_ConnectionReset();
error = SHT10_WriteByte(0x1E);// 0x1E 为 SHT10 软复位命令 11110
return error;
}
/********************************************************************************
* 函数名 :SHT10_Measure
* 描述 :SHT10 温度或湿度初始值读取
* 输入参数 : u8* pValue 指向温度或湿度初始值
* u8* pCheckSum 指向 CRC 校验值
* u8 mode 选择需要读取温度值还是湿度值,TEMP表示温度,HUMI表示湿度
* 输出结果 :无
* 返回值 :读取成功则返回 0 ,不成功则返回1
********************************************************************************/
u8 SHT10_Measure( u16* pValue, u8* pCheckSum, u8 mode )
{
u8 i = 0;
u8 error = 0;
SHT10_Start();
switch( mode )
{
case TEMP:
error += SHT10_WriteByte(0x03);
break;
case HUMI:
error += SHT10_WriteByte(0x05);
break;
default:
break;
}
//等待测量结束。大约需要 20/80/320ms 分别对应 8/12/14bit 测量
if( error == 0 )
{
SHT10_DATA_IN();
for( i=0; i<16; i++ )
{
Delay_us(2000);
if( 0 == DATA_R() )
break;
}
if ( i >= 16 )
return 1;
*pValue = SHT10_ReadByte( ACK ) << 8;
*pValue += SHT10_ReadByte( ACK );
*pCheckSum = SHT10_ReadByte( noACK );
}
return error;
}
|