控制/MCU
在上一篇中,我们介绍了IIC驱动OLED显示屏。这一篇是IIC驱动BH1750FVI光强度传感器。其实在之前的树莓派系列中也写过BH1750FVI光强度传感器的文章。
这里是一个IIC总线上面挂载了两个IIC从设备。
产品介绍
BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。(1lx-65535lx)
产品特点
产品应用
移动电话,液晶电视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,汽车定位系统,液晶显示器。
芯片框图
描述:
・PD 接近人眼反应的光敏二极管。(Photo diode with approximately human eye response.)
・AMP 集成运算放大器:将 PD 电流转换为 PD 电压。
・ADC 模数转换获取 16 位数字数据。
・Logic + IC Interface(逻辑+ IC 界面)光强度计算和 I2C 总线接口,包括下列寄存器:数据寄存器→光强度数据寄存。初始值是:“0000_0000_0000_0000”。测量时间寄存器→时间测量数据寄存。初始值是:“0100_0101”。
・OSC 内部振荡器(时钟频率典型值:320kHz)。该时钟为内部逻辑时钟。
从这个框图也可以看出这个芯片的内部模块比较简单,实际使用也不复杂。
测量程序步骤
指令集合结构
从“写指示”到“读出测量结果”的测量时序实例
#define IIC_SCL P10 // 时钟
#define IIC_SDA P11 // 数据
这个是IIC和单片机IO口的连接。
驱动代码
#include "bh1750fvi.h"
#include "iic.h"
#define BH1750FVI_SlaveAddress 0x46 // 设备地址
#define BH1750FVI_DOWN 0x00 // 断电指令
#define BH1750FVI_ON 0x01 // 通电指令
#define BH1750FVI_RESEET 0x07 // 复位
#define BH1750FVI_CON_H 0x10 // 连续分辨率模式, 1lx, 120ms
#define BH1750FVI_CON_H2 0x11 // 连续分辨率模式, 0.5lx, 120ms
#define BH1750FVI_CON_L 0x13 // 连续低分辨率模式,4lx, 16ms
#define BH1750FVI_ONE_H 0x20 // 一次高分辨率模式,1lx, 120ms
#define BH1750FVI_ONE_H2 0x21 // 一次高分辨率模式,0.5lx, 120ms
#define BH1750FVI_ONE_L 0x23 // 一次低分辨率模式,4lx, 16ms
// 往BH1750FVI写数据
void BH1750FVI_Write_Reg(u8 reg)
{
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress);
IIC_Write_Byte(reg);
IIC_Stop();
}
// 读取1字节数据
u8 BH1750FVI_Read_Reg(u8 reg)
{
u8 dat;
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress);
IIC_Write_Byte(reg);
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress + 1);
dat = IIC_Read_Byte();
IIC_Stop();
return dat;
}
u16 BH1750FVI_Read_all()
{
u8 i;
u8 BUF[8];
u16 dat;
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress + 1);
for(i = 0; i < 2; i++)
{
BUF[i] = IIC_Read_Byte();
if(i == 2){
IIC_Send_Ack(1);
}else{
IIC_Send_Ack(0);
}
}
IIC_Stop();
dat = BUF[0]< < 8 + BUF[1];
return dat;
}
u16 BH1750FVI_Measure()
{
BH1750FVI_Write_Reg(BH1750FVI_ON);
BH1750FVI_Write_Reg(BH1750FVI_CON_H);
return BH1750FVI_Read_all();
}
void BH1750FVI_Init()
{
BH1750FVI_Write_Reg(BH1750FVI_DOWN);
BH1750FVI_Write_Reg(BH1750FVI_ON);
}