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

BH1750 简介

产品介绍

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

产品特点

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

测量程序步骤

在这里插入图片描述

指令集合结构

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

STM32CubeMx工程配置

  配置HSE
在这里插入图片描述
  配置系统时钟
在这里插入图片描述
  配置 USRAT1 用于信息输出
在这里插入图片描述
  配置 I2C1

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

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;
}

测试结果

在这里插入图片描述
在这里插入图片描述

完成工程下载下载地址

猜你喜欢

转载自blog.csdn.net/wct3344142/article/details/115028376