STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo:STM32CudeMx+MDK-ARM

  • ​​BH1750 简介​​
  • ​​产品介绍​​
  • ​​产品特点​​
  • ​​测量程序步骤​​
  • ​​指令集合结构​​
  • ​​从“写指示”到“读出测量结果”的测量时序实例​​
  • ​​STM32CubeMx工程配置​​
  • ​​BH1750 基于硬件I2C的驱动程序​​
  • ​​测试结果​​
  • ​​完成工程下载[下载地址](javascript:void(0))​​

BH1750 简介

产品介绍

  BH1750FVI 是一种用于两线的数字型光照强度传感器集成电路。这种集成电路可以根据收集的光线的强度数据来调整液晶或数字键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。(1lx - 65535lx)

产品特点

  1 支持IIC BUS接口(f/f Mode Support)
  2 输出对应亮度的数字值
  3 通过降低功率功能,实现低电流化
  4 通过 50Hz/60Hz 除光噪音功能实现稳定的测定
  5 支持 1.8V 逻辑输入接口
  6 有两种可选的 IIC slave 地址。

测量程序步骤

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_#include

指令集合结构

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_嵌入式_02

从“写指示”到“读出测量结果”的测量时序实例

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_I2C_03


STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_I2C_04

STM32CubeMx工程配置

  配置HSE

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_嵌入式_05


  配置系统时钟

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_HB1750_06


  配置 USRAT1 用于信息输出

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_HB1750_07


  配置 I2C1

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_#include_08


  GENERATE CODE生成代码

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_I2C_09


  由于自动生成代码在I2C时钟使能位置有误,需要做如图所示的I2C 时钟使能,位置移动。在GPIO初始化之前就需要使能I2C的时钟。

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_I2C_10

BH1750 基于硬件I2C的驱动程序

  BH1750.h

// BH1750.h
#ifndef _BH1750_H_
#define _BH1750_H_
#include "main.h"
#include <stdio.h>
#include "i2c.h"

#define BH1750_ADDRESS 0x46

void Init_BH1750(void);
uint32_t I2C_BH1750_Opecode_Write(uint8_t* pData, uint16_t size);
uint32_t I2C_BH1750_Data_Read(uint8_t* pData, uint16_t size);
#endif

  BH1750.3

// BH1750.3
#include "BH1750.h"

void Init_BH1750(void) {
uint8_t opecode = 0x01;
if( I2C_BH1750_Opecode_Write(&opecode, 1) == HAL_OK ){
printf("Init_BH1750 Ok\n");
}else {
printf("Init_BH1750 Error\n");
}
}
uint32_t I2C_BH1750_Opecode_Write(uint8_t* pData, uint16_t size) {
HAL_StatusTypeDef status = HAL_OK;
status = HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDRESS,pData, size, 1);
return status;
}
uint32_t I2C_BH1750_Data_Read(uint8_t* pData, uint16_t size){
HAL_StatusTypeDef status = HAL_OK;
status = HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDRESS+1,pData, size, 1);
return status;
}

   printf() 重定向

#include <stdio.h>

int fputc(int ch, FILE *f){
uint8_t temp[1] = { ch };
HAL_UART_Transmit(&huart1, temp, 1, 2);
return ch;
}

  demo.c

#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"

#include <stdio.h>
#include "BH1750.h"
int dis_data = 0;
uint8_t DATA_BUF[8] = { 0 };
void SystemClock_Config(void);
int main(void)
{
float temp = 0;
uint8_t opecode;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
HAL_Delay(200);
Init_BH1750();
while (1) {
opecode = 0x01;
if ( I2C_BH1750_Opecode_Write(&opecode, 1) != HAL_OK){
printf("I2C_BH1750_Opecode_Write: %2x Error\n", opecode);
continue;
}
opecode = 0x10;
if ( I2C_BH1750_Opecode_Write(&opecode, 1) != HAL_OK){
printf("I2C_BH1750_Opecode_Write: %2x Error\n", opecode);
continue;
}
HAL_Delay(200);
if ( I2C_BH1750_Data_Read(DATA_BUF, 2) != HAL_OK){
printf("I2C_BH1750_Data_Read: Error\n");
continue;
}
dis_data =(DATA_BUF[0]);
dis_data=(dis_data<<8)+ (DATA_BUF[1]);//合成数据,即光照数据
temp=(float)dis_data/1.2;
printf("data: %f lx\r\n", temp);
}
}
int fputc(int ch, FILE *f){
uint8_t temp[1] = { ch };
HAL_UART_Transmit(&huart1, temp, 1, 2);
return ch;
}

测试结果

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_嵌入式_11


STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo_嵌入式_12

完成工程下载​​下载地址​​