#include "B_LUX_V20.h"
#include "delay.h"
u8 BUF_0[8]; //接收数据缓存区
u16 dis_data_0; //变量
/*---------------------------------------------------------------------
功能描述: 延时纳秒 不同的工作环境,需要调整此函数
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_delay_nms(u16 k)
{
u16 i=0;
for (i=0; i<k; i++)
{
delay_ms(2);
}
}
/*---------------------------------------------------------------------
功能描述: 延时5微秒 不同的工作环境,需要调整此函数
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Delay5us()
{
delay_us(5);
}
/*---------------------------------------------------------------------
功能描述: 延时5毫秒 不同的工作环境,需要调整此函数
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Delay5ms()
{
delay_ms(5);
}
//初始化IIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
//GPIOB8,B9初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
IIC_SCL=1;
IIC_SDA=1;
}
/*---------------------------------------------------------------------
功能描述: 起始信号
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Start()
{
SDA_OUT(); //sda线输出
IIC_SDA=1; //拉高数据线
IIC_SCL=1; //拉高时钟线
B_LUX_Delay5us(); //延时
IIC_SDA=0; //产生下降沿
B_LUX_Delay5us(); //延时
IIC_SCL=0; //拉低时钟线
}
/*---------------------------------------------------------------------
功能描述: 停止信号
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Stop()
{
SDA_OUT();//sda线输出
IIC_SDA=0; //拉低数据线
IIC_SCL=1; //拉高时钟线
B_LUX_Delay5us(); //延时
IIC_SDA=1; //产生上升沿
B_LUX_Delay5us(); //延时
IIC_SCL=0;
B_LUX_Delay5us();
}
/*---------------------------------------------------------------------
功能描述: 发送应答信号
参数说明: ack - 应答信号(0:ACK 1:NAK)
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_SendACK(u8 ack)
{
SDA_OUT();
if (ack&0x01) IIC_SDA=1; //写应答信号
else IIC_SDA=0;
IIC_SCL=1; //拉高时钟线
B_LUX_Delay5us(); //延时
IIC_SCL=0; //拉低时钟线
IIC_SDA=1;
B_LUX_Delay5us(); //延时
}
/*---------------------------------------------------------------------
功能描述: 接收应答信号
参数说明: 无
函数返回: 返回应答信号
---------------------------------------------------------------------*/
u8 B_LUX_RecvACK()
{
u8 CY = 0x00;
IIC_SDA=1;
SDA_IN(); //SDA设置为输入
IIC_SCL=1; //拉高时钟线
B_LUX_Delay5us(); //延时
CY |= READ_SDA; //读应答信号
B_LUX_Delay5us(); //延时
IIC_SCL=0; //拉低时钟线
SDA_OUT();
return CY;
}
/*---------------------------------------------------------------------
功能描述: 向IIC总线发送一个字节数据
参数说明: dat - 写字节
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_SendByte(u8 dat)
{
u8 i;
for (i=0; i<8; i++) //8位计数器
{
if (dat&0x80) IIC_SDA=1;
else IIC_SDA=0; //送数据口
B_LUX_Delay5us(); //延时
IIC_SCL=1; //拉高时钟线
B_LUX_Delay5us(); //延时
IIC_SCL=0; //拉低时钟线
B_LUX_Delay5us(); //延时
dat <<= 1; //移出数据的最高位
}
B_LUX_RecvACK();
}
/*---------------------------------------------------------------------
功能描述: 从IIC总线接收一个字节数据
参数说明: 无
函数返回: 接收字节
---------------------------------------------------------------------*/
u8 B_LUX_RecvByte()
{
u8 i;
u8 dat = 0;
SDA_IN();
IIC_SDA=1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
IIC_SCL=1; //拉高时钟线
B_LUX_Delay5us(); //延时
dat |= READ_SDA; //读数据
IIC_SCL=0; //拉低时钟线
B_LUX_Delay5us(); //延时
dat <<= 1;
}
SDA_OUT();
return dat;
}
/*---------------------------------------------------------------------
功能描述: 写BH1750
参数说明: REG_Address - 寄存器地址
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Single_Write(u8 REG_Address)
{
B_LUX_Start(); //起始信号
B_LUX_SendByte(B_LUX_SlaveAddress); //发送设备地址+写信号
B_LUX_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
B_LUX_Stop(); //发送停止信号
}
/*---------------------------------------------------------------------
功能描述: 连续读出BH1750内部数据
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Multiple_read(void)
{
u8 i;
B_LUX_Start(); //起始信号
B_LUX_SendByte(B_LUX_SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF
{
BUF_0[i] = B_LUX_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 0x02)
{
B_LUX_SendACK(1); //最后一个数据需要回NOACK
}
else
{
B_LUX_SendACK(0); //回应ACK
}
}
B_LUX_Stop(); //停止信号
B_LUX_Delay5ms();
}
/*---------------------------------------------------------------------
功能描述: 初始化光照传感器
参数说明: 无
函数返回: 无
---------------------------------------------------------------------*/
void B_LUX_Init()
{
IIC_Init();
SDA_OUT();
B_LUX_delay_nms(100); //延时100ms
B_LUX_Single_Write(0x01);
}
/*---------------------------------------------------------------------
功能描述: 光照读取函数
参数说明: 无
函数返回: 返回光照值
---------------------------------------------------------------------*/
void B_LUX_GetLux(u32 *vLux)
{
float temp;
B_LUX_Single_Write(0x01); // power on
B_LUX_Single_Write(0x10); // H- resolution mode 高解析度设置
B_LUX_delay_nms(180); //延时180ms
B_LUX_Multiple_read(); //连续读出数据,存储在BUF中
B_LUX_Single_Write(0x00); // power off
dis_data_0=BUF_0[0];
dis_data_0=(dis_data_0<<8)+BUF_0[1]; //合成数据,即光照数据
temp=(float)dis_data_0/1.2f;
*vLux = (u32)(temp*1.4f);
}