#include<stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#define noACK 0 //用于判断是否结束SHT10通讯
#define ACK 1 //结束数据传输
#define STATUS_REG_W 0x06 // 0 写状态寄存器
#define STATUS_REG_R 0x07 // 1 读状态寄存器
#define MEASURE_TEMP 0x03 // 1 温度测量
#define MEASURE_HUMI 0x05 // 1 湿度测量
#define RESET 0x1E // 0 复位
#define SCLL GPIOB->ODR&=~(1<<11)//时钟线输出低电平..........................
#define SCLH GPIOB->ODR|=1<<11//时钟线输出低电平
#define SDAL GPIOB->ODR&=~(1<<12)//数据线输出低电平
#define SDAH GPIOB->ODR|=1<<12//数据线输出高电平
#define ReadState() {GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00008000; GPIOB->ODR&=~(1<<11);}//数据线改为读
#define WriteState() {GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00003000;}//数据线改为写
#define DATA() (GPIOB->IDR>>11)&1//读出数据线数据
//enum{TEMP,HUMI};//温度和湿度
unsigned int Temperature,Humidity;
u8 t[2];//读取的两个字节,用于保存温度或湿度
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
//启动传输
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
void TransStart()
{
SDAH;
SCLL;
delay_us(1);
SCLH;
delay_us(1);
SDAL;
delay_us(1);
SCLL;
delay_us(1);
SCLH;
delay_us(1);
SDAH;
delay_us(1);
SCLL;
delay_us(1);
}
// 通讯复位: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
void ConnectionReset()
{
unsigned char i;
SDAH;
SCLL;
delay_us(1);
for(i=0;i<9;i++)
{
SCLH;
delay_us(1);
SCLL;
delay_us(1);
}
TransStart();
}
char ReadByte(unsigned char ack)//读取温度或湿度
{
unsigned char i,val=0;
SDAH;
ReadState();
for(i=0x80;0<i;i/=2)//先读取的是高位
{
SCLH;
delay_us(1);
if(DATA())
val=(val|i);
delay_us(1);
SCLL;
delay_us(1);
}
WriteState();
if(ack==1)//发送确认
SDAL;
else//不确认
SDAH;
delay_us(1);
SCLH;
delay_us(1);