#include "bh1750.h"
//#include "slave.h"


#define	 SlaveAddress   0x46 //����������IIC�����еĴӵ�ַ,����ALT  ADDRESS��ַ���Ų�ͬ�޸�
unsigned char  BH_BUF[4];  //�������ݻ�����




/***************************************************************
** ���ܣ�     IIC�˿ڳ�ʼ��
** ������	  �޲���
** ����ֵ��    ��
****************************************************************/
void BH1750IO_Init(void)
{					     							 
	 	 GPIO_InitTypeDef  GPIO_InitStructure;	
	 	 RCC_APB2PeriphClockCmd(BH1750_SDA_RCC|BH1750_SCL_RCC,ENABLE);
		 GPIO_InitStructure.GPIO_Pin = BH1750_SCL_GPIO_PIN;//PB6/PB7/PB5
		 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //�������
		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO���ٶ�Ϊ50MHz
		 GPIO_Init(BH1750_SCL_GPIO_TYPE, &GPIO_InitStructure);					 //�����趨������ʼ��	
			GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;//PB6/PB7/PB5
		 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //�������
		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO���ٶ�Ϊ50MHz
		 GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure);					 //�����趨������ʼ��	
	   GPIO_SetBits(BH1750_SDA_GPIO_TYPE,BH1750_SDA_GPIO_PIN); //�����
	   GPIO_SetBits(BH1750_SCL_GPIO_TYPE,BH1750_SCL_GPIO_PIN); //�����
}

void bh1750_sdain_mode(void)//SDA��������ģʽ
{
     GPIO_InitTypeDef  GPIO_InitStructure;	
	 	 RCC_APB2PeriphClockCmd(BH1750_SDA_RCC,ENABLE);
		 GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;
		 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 //��������
		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO���ٶ�Ϊ50MHz
		 GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure);					 //�����趨������ʼ��
}
void bh1750_sdaout_mode(void)//SDA�������ģʽ
{
     GPIO_InitTypeDef  GPIO_InitStructure;	
	 	 RCC_APB2PeriphClockCmd(BH1750_SDA_RCC,ENABLE);
		 GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;
		 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //�������
		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO���ٶ�Ϊ50MHz
		 GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure);					 //�����趨������ʼ��	
	   
}


/***************************************************************
** ���ܣ�     ����IIC��ʼ�ź�
** ������	  �޲���
** ����ֵ��    ��
****************************************************************/

void BH1750_Start()
{
	SDA_OUT();     //sda�����
	SETSDA;	  	  
	SETSCL;
	delay_us(4);
	CLRSDA;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	CLRSCL;//ǯסI2C���ߣ�׼�����ͻ�������� 
}
/***************************************************************
** ���ܣ�     ����IICֹͣ�ź�
** ������	  �޲���
** ����ֵ��    ��
****************************************************************/
void BH1750_Stop()
{
	SDA_OUT();//sda�����
	CLRSDA;//STOP:when CLK is high DATA change form low to high
	SETSCL;
	delay_us(4);
	SETSDA;//����I2C���߽����ź�
	delay_us(4);
}
/***************************************************************
** ���ܣ�     ����IICӦ���ź�
** ������	  �޲���
** ����ֵ��    ��
****************************************************************/
void BH1750_SendACK(unsigned char ack)
{
	SDA_OUT();          //sda�����
	if(ack)
	{
		SETSDA;   //дӦ���ź�
	}
	else 
	{	
		CLRSDA; 
	}
	SETSCL;          //����ʱ����
	delay_us(2);        //��ʱ
	CLRSCL;          //����ʱ����
	delay_us(2);        //��ʱ
}

/***************************************************************
** ���ܣ�     ����IIC�����ź�
** ������	  �޲���
** ����ֵ��    ��
****************************************************************/
unsigned char BH1750_RecvACK()
{
	unsigned char data;
	SDA_IN();         //SDA��������
	SETSCL;        //����ʱ����
	delay_us(2);      //��ʱ
	data = READ_SDA;  //��Ӧ���ź�
	CLRSCL;        //����ʱ���� 
	delay_us(2);      //��ʱ
	return data;
}
/***************************************************************
** ���ܣ�     ��IIC���߷���һ���ֽ�����
** ������	  dat��һ�ֽ�����
** ����ֵ��    ��
****************************************************************/
void BH1750_SendByte(unsigned char dat)
{
	unsigned char i,bit;
	SDA_OUT();               //sda����� 
	for (i=0; i<8; i++)      //8�����
	{
		bit=dat&0x80;
		if(bit)
		{
			SETSDA;
		}
		else
		CLRSDA;
		dat <<= 1;           //�Ƴ����ݵ����λ	
		SETSCL;           //����ʱ����   
		delay_us(2);         //��ʱ		
		CLRSCL;           //����ʱ����
		delay_us(2);         //��ʱ
	} 
	BH1750_RecvACK();
}
/***************************************************************
** ���ܣ�     ��IIC���߽���һ���ֽ�����
** ������	  �޲���
** ����ֵ��   dat������һ�ֽ�����
****************************************************************/
unsigned char BH1750_RecvByte()
{
	unsigned char i;
	unsigned char dat = 0;
	unsigned char a;
	SDA_IN();               //SDA��������
	SETSDA;              //ʹ���ڲ�����,׼����ȡ����,
	for(i=0; i<8; i++)     //8�����
	{
		dat <<= 1;
		SETSCL;          //����ʱ����
		delay_us(2);        //��ʱ
    a=READ_SDA;//��SDA����
		if(a==1)dat+=1;      	
		CLRSCL;          //����ʱ����
		delay_us(2);        //��ʱ
	}
	return dat;
}

/***************************************************************
** ���ܣ�     ��bh1750д������
** ������	  �޲���
** ����ֵ��   ��
****************************************************************/
void Single_Write_BH1750( unsigned char REG_Address)
{
	BH1750_Start();                  //��ʼ�ź�
	BH1750_SendByte(SlaveAddress);   //�����豸��ַ+д�ź�
	BH1750_SendByte(REG_Address);    //�ڲ��Ĵ�����ַ��
	BH1750_Stop();                   //����ֹͣ�ź�
}

/***************************************************************
** ���ܣ�     ��������BH1750�ڲ����� 
** ������	  �޲���
** ����ֵ��   ��
****************************************************************/
void Multiple_Read_BH1750(void)
{   
	unsigned char i;	
	BH1750_Start();                          //��ʼ�ź�
	BH1750_SendByte(SlaveAddress+1);         //�����豸��ַ+���ź�
	for(i=0; i<3; i++)                      //������ȡ2����ַ���ݣ��洢��BH_BUF
	{
		BH_BUF[i] = BH1750_RecvByte();          //BH_BUF[0]�洢0x32��ַ�е�����
		if(i == 3)
		{
			BH1750_SendACK(1);                //���һ��������Ҫ��NOACK
		}
		else
		{		
			BH1750_SendACK(0);                //��ӦACK
		}
	}
	BH1750_Stop();                          //ֹͣ�ź�
//	delay_ms(150);
}

/***************************************************************
** ���ܣ�     ��ʼ��BH1750
** ������	  �޲���
** ����ֵ��   ��
****************************************************************/
void BH1750_Init()
{
   BH1750IO_Init();	
   Single_Write_BH1750(0x01);
   //CLRADDR; //��ADDRλ��ʼ������
}


/***************************************************************
** ���ܣ�     ��ȡ���ն�
** ������	  �޲���
** ����ֵ��   data�����ع��ն�ֵ
****************************************************************/
unsigned int Dispose(void)
{  
	static float temp_a;
	unsigned int data_a;
	int dis_data1 ;
	Single_Write_BH1750(0x01);   // power on
	Single_Write_BH1750(0x10);   // H- resolution mode
	delay_ms(200);              //��ʱ200ms
	Multiple_Read_BH1750();       //�����������ݣ��洢��BH_BUF��
	delay_ms(150);
	dis_data1=BH_BUF[0];
	dis_data1=(dis_data1<<8)+BH_BUF[1];//�ϳ����ݣ�����������
	temp_a=(float)dis_data1/1.2;
	data_a=(int)temp_a;
	return data_a;        
}