STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo
原创
©著作权归作者所有:来自51CTO博客作者qq63a17a25c2b1c的原创作品,请联系作者获取转载授权,否则将追究法律责任
STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo:STM32CudeMx+MDK-ARM
- 产品介绍
- 产品特点
- 测量程序步骤
- 指令集合结构
- 从“写指示”到“读出测量结果”的测量时序实例
- 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 地址。
测量程序步骤
指令集合结构
从“写指示”到“读出测量结果”的测量时序实例
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;
}
测试结果
完成工程下载下载地址