IIC实验——空气温度湿度传感器
IIC硬件电路图
IIC框图
分析si7006芯片手册
通过框图可知,分析si7006芯片手册需要做以下几个步骤:
si7006从机地址
找到采集温度湿度命令码
温湿度转换公式
si7006寄存器初始化
RCC章节分析
给GPIOF组使能
GPIO章节分析
设置为输出功能
设置推挽输出模式
设为高速模式
设为禁止上拉下拉
主要代码
iic.c
#include "iic.h"
extern void printf(const char* fmt, ...);
/*
* 函数名 : delay_us
* 函数功能:延时函数
* 函数参数:无
* 函数返回值:无
* */
void delay_us(void)
{
unsigned int i = 2000;
while(i--);
}
/*
* 函数名 : i2c_init
* 函数功能: i2C总线引脚的初始化, 通用输出,推挽输出,输出速度,
* 函数参数:无
* 函数返回值:无
* */
void i2c_init(void)
{
// 使能GPIOF端口的时钟
RCC->MP_AHB4ENSETR |= (0x1 << 5);
// 设置PF14,PF15引脚为通用的输出功能
GPIOF->MODER &= (~(0xF << 28));
GPIOF->MODER |= (0x5 << 28);
// 设置PF14, PF15引脚为推挽输出
GPIOF->OTYPER &= (~(0x3 << 14));
// 设置PF14, PF15引脚为高速输出
GPIOF->OSPEEDR |= (0xF << 28);
// 设置PF14, PF15引脚的禁止上拉和下拉
GPIOF->PUPDR &= (~(0xF << 28));
// 空闲状态SDA和SCL拉高
I2C_SCL_H;
I2C_SDA_H;
}
void i2c_start(void)
{
SET_SDA_OUT;
I2C_SCL_H;
I2C_SDA_H;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_L;
}
void i2c_stop(void)
{
SET_SDA_OUT;
I2C_SCL_L;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_H;
delay_us();
I2C_SDA_H;
}
void i2c_write_byte(unsigned char dat)
{
SET_SDA_OUT;
unsigned int i;
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us();
if(dat & 0x80)
{
I2C_SDA_H;
}else
{
I2C_SDA_L;
}
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
dat <<= 1;
}
}
unsigned char i2c_read_byte(unsigned char ack)
{
unsigned int i;
unsigned char dat;
SET_SDA_IN;
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us();
delay_us();
I2C_SCL_H;
delay_us();
dat <<=1;
if(I2C_SDA_READ)
{
dat |= 1;
}else
{
dat |= 0;
}
delay_us();
}
if(!ack)
i2c_ack();
else
i2c_nack();
return dat;
}
unsigned char i2c_wait_ack(void)
{
int ack;
I2C_SCL_L;
delay_us();
I2C_SDA_H;
SET_SDA_IN;
delay_us();
delay_us();
I2C_SCL_H;
delay_us();
if (I2C_SDA_READ)
ack = 1;
else
ack = 0;
delay_us();
I2C_SCL_L;
return ack;
}
void i2c_ack(void)
{
SET_SDA_OUT;
I2C_SCL_L;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
I2C_SCL_L;
}
void i2c_nack(void)
{
SET_SDA_OUT;
I2C_SCL_L;
delay_us();
I2C_SDA_H;
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
I2C_SCL_L;
}
main.c
#include "iic.h"
#include "si7006.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
unsigned short hum;
unsigned short temp;
si7006_init();
while(1)
{
hum = si7006_read_hum_data(SI7006_SLAVE, MEASURE_HUM_CMD);
temp = si7006_read_temp_data(SI7006_SLAVE, MEASURE_TEMP_CMD);
hum = (125 * hum / 65536 - 6) * 10;
temp = (175.72 * temp / 65536 - 46.85) * 10;
printf("hum = %d.%d\n", hum / 10, hum % 10);
printf("temp = %d.%d\n", temp / 10, temp % 10);
delay_ms(1000);
}
return 0;
}