光照强度BH1750 API
BH1750函数使用API
void BH1750_Init(void);
IIC和BH1750初始化float LIght_Intensity(void);
读取光照强度的值uint8_t BH1750_Byte_Write(uint8_t data);
BH1750写一个字节
返回值 成功:0 失败:非0uint16_t BH1750_Read_Measure(void);
BH1750读取测量数据
返回值 成功:返回光照强度 失败:返回0void BH1750_Power_ON(void);
BH1750s上电void BH1750_Power_OFF(void);
BH1750s断电void BH1750_RESET(void);
BH1750复位 仅在上电时有效
IIC函数API
static void I2C_BH1750_GPIOConfig(void);
配置I2C总线的GPIO,采用模拟IO的方式实现void i2c_Start(void);
CPU发起I2C总线启动信号void i2c_Stop(void);
CPU发起I2C总线停止信号void i2c_SendByte(uint8_t _ucByte);
CPU向I2C总线设备发送8bit数据uint8_t i2c_ReadByte(void);
CPU从I2C总线设备读取8bit数据uint8_t i2c_WaitAck(void);
CPU产生一个时钟,并读取器件的ACK应答信号void i2c_Ack(void);
CPU产生一个ACK信号void i2c_NAck(void);
CPU产生1个NACK信号uint8_t i2c_CheckDevice(uint8_t _Address);
检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
原文件 bh1750.c
#include "bh1750.h"
static void I2C_BH1750_GPIOConfig(void);
static void i2c_Delay(void)
{
uint8_t i;
for (i = 0; i < 10; i++);
}
void i2c_Start(void)
{
BH1750_I2C_SDA_1();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SDA_0();
i2c_Delay();
BH1750_I2C_SCL_0();
i2c_Delay();
}
void i2c_Stop(void)
{
BH1750_I2C_SDA_0();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SDA_1();
}
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
BH1750_I2C_SDA_1();
}
else
{
BH1750_I2C_SDA_0();
}
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SCL_0();
if (i == 7)
{
BH1750_I2C_SDA_1();
}
_ucByte <<= 1;
i2c_Delay();
}
}
uint8_t i2c_ReadByte(void)
{
uint8_t i;
uint8_t value;
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
BH1750_I2C_SCL_1();
i2c_Delay();
if (BH1750_I2C_SDA_READ())
{
value++;
}
BH1750_I2C_SCL_0();
i2c_Delay();
}
return value;
}
uint8_t i2c_WaitAck(void)
{
uint8_t re;
BH1750_I2C_SDA_1();
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
if (BH1750_I2C_SDA_READ())
re = 1;
else
re = 0;
BH1750_I2C_SCL_0();
i2c_Delay();
return re;
}
void i2c_Ack(void)
{
BH1750_I2C_SDA_0();
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SCL_0();
i2c_Delay();
BH1750_I2C_SDA_1();
}
void i2c_NAck(void)
{
BH1750_I2C_SDA_1();
i2c_Delay();
BH1750_I2C_SCL_1();
i2c_Delay();
BH1750_I2C_SCL_0();
i2c_Delay();
}
static void I2C_BH1750_GPIOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE);
GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);
i2c_Stop();
}
uint8_t i2c_CheckDevice(uint8_t _Address)
{
uint8_t ucAck;
i2c_Start();
i2c_SendByte(_Address | BH1750_I2C_WR);
ucAck = i2c_WaitAck();
i2c_Stop();
return ucAck;
}
uint8_t BH1750_Byte_Write(uint8_t data)
{
i2c_Start();
i2c_SendByte(BH1750_Addr|0);
if(i2c_WaitAck()==1)
return 1;
i2c_SendByte(data);
if(i2c_WaitAck()==1)
return 2;
i2c_Stop();
return 0;
}
uint16_t BH1750_Read_Measure(void)
{
uint16_t receive_data=0;
i2c_Start();
i2c_SendByte(BH1750_Addr|1);
if(i2c_WaitAck()==1)
return 0;
receive_data=i2c_ReadByte();
i2c_Ack();
receive_data=(receive_data<<8)+i2c_ReadByte();
i2c_NAck();
i2c_Stop();
return receive_data;
}
void BH1750_Power_ON(void)
{
BH1750_Byte_Write(POWER_ON);
}
void BH1750_Power_OFF(void)
{
BH1750_Byte_Write(POWER_OFF);
}
void BH1750_RESET(void)
{
BH1750_Byte_Write(MODULE_RESET);
}
void BH1750_Init(void)
{
I2C_BH1750_GPIOConfig();
BH1750_Power_ON();
BH1750_Byte_Write(Measure_Mode);
}
float LIght_Intensity(void)
{
return (float)(BH1750_Read_Measure()/1.1f*Resolurtion);
}
头文件 bh1750.h
#ifndef __BH1750_H
#define __BH1750_H
#include "sys.h"
#define BH1750_Addr 0x46
#define POWER_OFF 0x00
#define POWER_ON 0x01
#define MODULE_RESET 0x07
#define CONTINUE_H_MODE 0x10
#define CONTINUE_H_MODE2 0x11
#define CONTINUE_L_MODE 0x13
#define ONE_TIME_H_MODE 0x20
#define ONE_TIME_H_MODE2 0x21
#define ONE_TIME_L_MODE 0x23
#define Measure_Mode CONTINUE_H_MODE
#if ((Measure_Mode==CONTINUE_H_MODE2)|(Measure_Mode==ONE_TIME_H_MODE2))
#define Resolurtion 0.5
#elif ((Measure_Mode==CONTINUE_H_MODE)|(Measure_Mode==ONE_TIME_H_MODE))
#define Resolurtion 1
#elif ((Measure_Mode==CONTINUE_L_MODE)|(Measure_Mode==ONE_TIME_L_MODE))
#define Resolurtion 4
#endif
#define BH1750_I2C_WR 0
#define BH1750_I2C_RD 1
#define BH1750_GPIO_PORT_I2C GPIOB
#define BH1750_RCC_I2C_PORT RCC_APB2Periph_GPIOB
#define BH1750_I2C_SCL_PIN GPIO_Pin_10
#define BH1750_I2C_SDA_PIN GPIO_Pin_11
#if 0
#define BH1750_I2C_SCL_1() GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN)
#define BH1750_I2C_SCL_0() GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN)
#define BH1750_I2C_SDA_1() GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)
#define BH1750_I2C_SDA_0() GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)
#define BH1750_I2C_SDA_READ() GPIO_ReadInputDataBit(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)
#else
#define BH1750_I2C_SCL_1() BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SCL_PIN
#define BH1750_I2C_SCL_0() BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SCL_PIN
#define BH1750_I2C_SDA_1() BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SDA_PIN
#define BH1750_I2C_SDA_0() BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SDA_PIN
#define BH1750_I2C_SDA_READ() ((BH1750_GPIO_PORT_I2C->IDR & BH1750_I2C_SDA_PIN) != 0)
#endif
void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);
void BH1750_Init(void);
float LIght_Intensity(void);
uint8_t BH1750_Byte_Write(uint8_t data);
uint16_t BH1750_Read_Measure(void);
void BH1750_Power_ON(void);
void BH1750_Power_OFF(void);
void BH1750_RESET(void);
#endif