#ifndef __LIGHT_H
#define __LIGHT_H
#include "system.h"
#include "delay.h"
#define SDA_IN() {IIC_SDA_GPIO_Port->CRH&=0XFFFFFF0F;IIC_SDA_GPIO_Port->CRH|=(u32)8<<4;}
#define SDA_OUT() {IIC_SDA_GPIO_Port->CRH&=0XFFFFFF0F;IIC_SDA_GPIO_Port->CRH|=(u32)3<<4;}
#define IIC_SCL PCout(8)
#define IIC_SDA PCout(9)
#define READ_SDA PCin(9)
#define ADDR 0x23
#define BHAddWrite 0x46
#define BHAddRead 0x47
#define BHPowDown 0x00
#define BHPowOn 0x01
#define BHReset 0x07
#define BHModeH1 0x10
#define BHModeH2 0x11
#define BHModeL 0x13
#define BHSigModeH 0x20
#define BHSigModeH2 0x21
#define BHSigModeL 0x23
void Single_Write_BH1750(u8 REG_Address);
void Light_Init(void);
void bh_data_send(u8 command);
u16 bh_data_read(void);
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Send_Byte(u8 txd);
u8 IIC_Read_Byte(u8 ack);
u8 IIC_Wait_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
#endif
#include "bh1750.h"
void Single_Write_BH1750(u8 REG_Address)
{
IIC_Start();
IIC_Send_Byte(BHAddWrite);
IIC_Send_Byte(REG_Address);
IIC_Stop();
}
void Light_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOD_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
Single_Write_BH1750(0x01);
bh_data_send(BHPowOn);
bh_data_send(BHReset);
bh_data_send(BHModeL);
delay_ms(180);
}
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;
delay_us(1);
IIC_SCL=1;
delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;
for(t=0; t<8; t++)
{
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0; i<8; i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
void bh_data_send(u8 command)
{
do
{
IIC_Start();
IIC_Send_Byte(BHAddWrite);
}
while(IIC_Wait_Ack());
IIC_Send_Byte(command);
IIC_Wait_Ack();
IIC_Stop();
}
u16 bh_data_read(void)
{
u16 buf;
IIC_Start();
IIC_Send_Byte(BHAddRead);
IIC_Wait_Ack();
buf=IIC_Read_Byte(1);
buf=buf<<8;
buf+=0x00ff&IIC_Read_Byte(0);
IIC_Stop();
return buf;
}