//*******************************************************
//BH1750FVI光照强度
//时间: 2020.4
//*******************************************************
#include "myiic.h"
#include "delay.h"
#include "bh1750.h"
#include "common.h"
void Cmd_Send_BH1750(u8 cmd)
{
IIC_Start();
IIC_Send_Byte(BH1750_Addr_Write); //发送设备地址+写信号
while(IIC_Wait_Ack())
{;};
IIC_Send_Byte(cmd); //写数据到内部寄存器地址
while(IIC_Wait_Ack())
{;};
IIC_Stop();
}
void BH1750_Start(void)
{
Cmd_Send_BH1750(BH1750_ON);
Cmd_Send_BH1750(BH1750_RSET);
Cmd_Send_BH1750(BH1750_OFF);
}
u8 BH1750_RecvByte(void)
{
u8 i;
u8 dat = 0;
SDA_IN();
//使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
IIC_SCL = 1; //拉高时钟线
delay_us(5); //延时
dat |= READ_SDA; //读数据
IIC_SCL = 0; //拉低时钟线
delay_us(5); //延时
}
return dat;
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(u8 ack)
{
SDA_OUT();
IIC_SDA = ACK; //写应答信号
IIC_SCL = 1; //拉高时钟线
delay_us(5); //延时
IIC_SCL = 0; //拉低时钟线
delay_us(5); //延时
}
int BH1750_Read(void)
{
u8 BUF[3]={0};
u16 result=0;
u8 i=0;
//BH1750_Start();
IIC_Start();
IIC_Send_Byte(BH1750_Addr_Write); //发送设备地址+写信号
while(IIC_Wait_Ack())
{;};
IIC_Send_Byte(BH1750_CON_1);
while(IIC_Wait_Ack())
{;};
IIC_Stop();
delay_ms(180);
IIC_Start();
IIC_Send_Byte(BH1750_Addr_Read); //发送设备地址+读信号
while(IIC_Wait_Ack())
{;};
for (i=0; i<2; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 2)
{
BH1750_SendACK(1); //最后一个数据需要回NOACK
IIC_Stop();
}
else
{
BH1750_SendACK(0); //回应ACK
}
}
delay_ms(5);
result = BUF[0];
light_intensity = ((result<<8)+BUF[1])/1.2;
light_intensity = light_intensity - (light_intensity%1);
return light_intensity;
}