#include "iic.h"
#define write 0
#define read 1
float F_value=0;
//char display_String[20]={0};//显示运行数据用的字符串4位整数显示
float Humiture[4];
u8 Humiture_buff1[20];
//u8 humiture_buff2[20];
//u8 Temperature_L=15;
//u8 Humidity_L=50;
//u8 Temperature_H=30;
//u8 Humidity_H=80;
/****************************************************************************
* Function Name : IIC_Config
* Description : 初始化GPIO.
* Input : None
* Output : None
* Return : None
****************************************************************************/
void I2C_INIT()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//GPIO_InitStructure.GPIO_Pin=I2C_SCL|I2C_SDA;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=I2C_SCL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
I2C_SCL_H;
I2C_SDA_H;
/*1.开时钟*/
// RCC->APB2ENR |= 1<<2;
/*2.设置GPIO模式*/
//GPIOA->CRL &= 0x0000FFFF;
//GPIOA->CRL |= 0x33330000;
/*3.设置GPIO空闲电平*/
//GPIOA->ODR |= 0xF<<4;
// printf("SHT30_Init OK!\n");
}
/*******************************************************************************
* 函 数 名 : I2C_SDA_OUT
* 函数功能 : SDA输出配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void I2C_SDA_OUT()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名 : I2C_SDA_IN
* 函数功能 : SDA输入配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void I2C_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void I2C_SDA_in(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
//产生起始信号
void I2C_StarT(void)
{
I2C_SDA_OUT();
I2C_SDA_H;
I2C_SCL_H;
delay_us(5);
I2C_SDA_L;
delay_us(6);
I2C_SCL_L;
}
//产生停止信号
void I2C_StoP(void)
{
I2C_SDA_OUT();
I2C_SCL_L;
I2C_SDA_L;
I2C_SCL_H;
delay_us(6);
I2C_SDA_H;
delay_us(6);
}
//主机产生应答信号ACK
void I2C_Ack(void)
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_L;
delay_us(2);
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
}
//主机不产生应答信号NACK
void I2C_NAck(void)
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_H;
delay_us(2);
I2C_SCL_H;
delay_us(5);
I2C_SCL_L;
}
//等待从机应答信号
//返回值:1 接收应答失败
// 0 接收应答成功
u8 I2C_Wait_Ack(void)
{
u8 tempTime=0;
//I2C_SDA_H;
//delay_us(1);
//I2C_SCL_H;
//delay_us(1);
I2C_SDA_IN();
//I2C_SCL_H;
I2C_SDA_H;
delay_us(1);
I2C_SCL_H;
delay_us(1);
while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
{
tempTime++;
delay_us(1);
if(tempTime>250)
{
I2C_StoP();
return 1;
}
}
//I2C_SDA_OUT();
//I2C_SDA_L;
//I2C_SCL_H;
//delay_us(1);
I2C_SCL_L;
delay_us(1);
return 0;
}
//I2C 发送一个字节
void I2C_Send_Byte(u8 txd)
{
u8 i=0;
I2C_SDA_OUT();
I2C_SCL_L;//拉低时钟开始数据传输
for(i=0;i<8;i++)
{
if((txd&0x80)>0) //0x80 1000 0000
I2C_SDA_H;
else
I2C_SDA_L;
txd<<=1;
delay_us(1);
I2C_SCL_H;
delay_us(2); //发送数据
I2C_SCL_L;
delay_us(2);
}
}
//I2C 读取一个字节
u8 I2C_Read_Byte(u8 ack)
{
u8 i=0,receive=0;
I2C_SDA_in();
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us(2);
I2C_SCL_H;
while(!GPIO_ReadInputDataBit(GPIO_I2C,I2C_SCL));
receive<<=1;
if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
receive++;
delay_us(1);
}
if(ack==0)
I2C_NAck();
else
I2C_Ack();
return receive;
}
void GXHT30_read_result(u8 addr)
{
u16 tem,hum;
//u16 tem1[8];
u16 buff[6];
float Temperature1[129]={0};
float Temperature2=0;
float Temperature=0;
float Humidity=0;
I2C_StarT();
I2C_Send_Byte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位
I2C_Wait_Ack();
I2C_Send_Byte(0x2C);
I2C_Wait_Ack();
I2C_Send_Byte(0x10);
I2C_Wait_Ack();
I2C_StoP();
delay_us(50);
I2C_StarT();
I2C_Send_Byte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位
if(I2C_Wait_Ack()==0)
{
I2C_SDA_in();
//IIC_INPUT_MODE_SET();
buff[0]=I2C_Read_Byte(1);
//I2C_Ack();
buff[1]=I2C_Read_Byte(1);
//I2C_Ack();
buff[2]=I2C_Read_Byte(1);
//I2C_Ack();
buff[3]=I2C_Read_Byte(1);
//I2C_Ack();
buff[4]=I2C_Read_Byte(1);
//I2C_Ack();
buff[5]=I2C_Read_Byte(0);
//I2C_NAck();
I2C_StoP();
tem = ((buff[0]<<8) | buff[1]);//温度拼接
hum = ((buff[3]<<8) | buff[4]);//湿度拼接
/*转换实际温度*/
Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)
}
if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//过滤错误数据
{
Humiture[0]=Temperature;
Humiture[2]=Humidity;
sprintf(Humiture_buff1,"%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%(保留2位小数)
//sprintf(Humiture_buff1,"%6.2f",Temperature);
}
OLED_ShowCN(22+0*16,0,0);//测试显示中文
OLED_ShowCN(22+1*16,0,1);//测试显示中文
OLED_ShowCN(22+2*16,0,2);//测试显示中文
OLED_ShowCN(22+3*16,0,3);//测试显示中文
OLED_ShowCN(22+4*16,0,4);//测试显示中文
OLED_ShowCN(2,5,5);//测试显示温
OLED_ShowCN(18,5,6);//测试显示度
OLED_ShowStr(41,5,":",2);//测试6*8字符
OLED_ShowStr(45,5,&Humidity,2);
OLED_ShowCN(100,5,7);//测试显示℃
// OLED_ShowStr(70,6,"'C",2); //测试8*16字符
printf("温湿度:%s\n\t\t",Humiture_buff1);
hum=0;
tem=0;
}
评论0