
使用了沁恒微自带的lib库。bh1750.h#ifndef__BH1750_H#define__BH1750_H#includedebug.h// BH1750地址ADDR引脚接地时为0x46接VCC时为0xB8#defineBH1750_ADDR_WRITE0x46#defineBH1750_ADDR_READ0x47#defineBH1750_ADDR0x23// 测量模式#defineBH1750_CONTINUOUS_HIGH_RES_MODE0x10// 连续高分辨率模式#defineBH1750_CONTINUOUS_HIGH_RES_MODE20x11// 连续高分辨率模式2#defineBH1750_CONTINUOUS_LOW_RES_MODE0x13// 连续低分辨率模式#defineBH1750_ONE_TIME_HIGH_RES_MODE0x20// 单次高分辨率模式#defineBH1750_ONE_TIME_HIGH_RES_MODE20x21// 单次高分辨率模式2#defineBH1750_ONE_TIME_LOW_RES_MODE0x23// 单次低分辨率模式// 指令#defineBH1750_POWER_DOWN0x00#defineBH1750_POWER_ON0x01#defineBH1750_RESET0x07voidBH1750_Init(void);intBH1750_ReadLightIntensity(void);#endifbh1750.c#includebh1750.h#includestdio.h#includestring.h// 发送单字节指令staticvoidBH1750_SendCommand(uint8_tcmd){while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!RESET);I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1,BH1750_ADDR_WRITE,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));I2C_SendData(I2C1,cmd);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1,ENABLE);}// 初始化BH1750voidBH1750_Init(void){u32 bound40000;u16 addressBH1750_ADDR_WRITE;GPIO_InitTypeDef GPIO_InitStructure{0};I2C_InitTypeDef I2C_InitTSturcture{0};RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOB,ENABLE);RCC_PB1PeriphClockCmd(RCC_PB1Periph_I2C1,ENABLE);GPIO_InitStructure.GPIO_PinGPIO_Pin_6;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_7;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);I2C_InitTSturcture.I2C_ClockSpeedbound;I2C_InitTSturcture.I2C_ModeI2C_Mode_I2C;I2C_InitTSturcture.I2C_DutyCycleI2C_DutyCycle_2;I2C_InitTSturcture.I2C_OwnAddress1address;I2C_InitTSturcture.I2C_AckI2C_Ack_Enable;I2C_InitTSturcture.I2C_AcknowledgedAddressI2C_AcknowledgedAddress_7bit;I2C_Init(I2C1,I2C_InitTSturcture);I2C_Cmd(I2C1,ENABLE);Delay_Ms(10);printf(BH1750_Init finish\n);}// 读取光照强度单位luxintBH1750_ReadLightIntensity(void){uint8_tdata[2]{0};floatlux0.0;u8 i0;BH1750_Init();printf(ready to read lux\n);// 上电BH1750_SendCommand(BH1750_POWER_ON);Delay_Ms(10);// 选择连续高分辨率模式测量时间约120msBH1750_SendCommand(BH1750_CONTINUOUS_HIGH_RES_MODE);Delay_Ms(130);// 等待首次测量完成while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!RESET);I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1,BH1750_ADDR_READ,I2C_Direction_Receiver);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));Delay_Ms(1);for(i0;i2;){if(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE)!RESET){data[i]I2C_ReceiveData(I2C1);}i;if(i1){I2C_AcknowledgeConfig(I2C1,DISABLE);}}I2C_GenerateSTOP(I2C1,ENABLE);// 合成 16 位数据uint16_traw_value(data[0]8)|data[1];printf(BH1750_ReadLightIntensity-3:%d,%d,raw:%d\n,data[0],data[1],raw_value);// 计算照度分辨率1 lux/计数luxraw_value/1.2;printf(lux %d\n,(int)lux);BH1750_SendCommand(BH1750_POWER_DOWN);I2C_Cmd(I2C1,DISABLE);return(int)lux;}目前还有个问题没有解决就是每次间隔读取数据的时候都要重新做一次IIC初始化否则读出来的值都是0.但是连续读取数据是没有问题的怀疑是芯片配置有地方没有配置对。