本文涉及IIC,需要了解IIC请转到 IIC协议(以STM32为例,软件iic,第一部分时序讲解,第二部分代码实现)
概述
B_LUX_V22 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种
集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨
率可以探测较大范围的光强度变化。
应用范围
蔬菜大棚、楼道、仓库、汽车定位系统、气象站、光照度恒光器、移动电话,液晶电
视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,液晶显示器,测试及检测设备、数据
记录器、自动控制、家电、医疗等应用领域。
产品特点
1. 支持 I2C BUS 接口(f/s Mode Support)。
2. 接近视觉灵敏度的光谱灵敏度特性(峰值灵敏度波长典型值:560nm)。
3. 输出对应亮度的数字值。
4. 对应广泛的输入光范围
5.
通过降低功率功能
,
实现低电流化。
6.
通过
50Hz/60Hz
除光噪音功能实现稳定的测定
7.
支持
1.8V
逻辑输入接口。
8.
无需其他外部件。
9.
光源依赖性弱(白炽灯,荧光灯,卤素灯,白光
LED
,日光灯)。
10.
有两种可选的
I2C slave
地址。
11.
可调的测量结果影响较大的因素为光入口大小。
12.
使用这种功能能计算
1.1 lx
到
100000 lx
马克斯
/
分钟的范围。
13.
最小误差变动在±
20%
14.
受红外线影响很小。
引脚说明
vcc:5v供电
scl sda: 标准iic接口
addr:地址线
通信时序
7位寻址地址 0x46
1.主机发送0X64,等应答
2.发送命令0x10,进入连续读模式
3,发送0x65(从机地址+1)读数据,第一次返回高8位,给应答(0),在返回第八位,给应答(1),结束。
4,进行移位操作拼成16位数据,然后除以1.2就是最终结果。
void B_LUX_WriteOneByte(u8 DataToWrite)
{
B_LUX_I2C_Start();
B_LUX_I2C_SendByte(B_LUX_V20_SlaveAddress); //发送器件地址,写数据
B_LUX_I2C_ReceiveAck();
B_LUX_I2C_SendByte(DataToWrite); //发送字节
B_LUX_I2C_ReceiveAck();
B_LUX_I2C_Stop();//产生一个停止条件
}
//发送采集命令
void B_LUX_Send_Cmd(void)
{
B_LUX_I2C_Start();
B_LUX_I2C_SendByte(B_LUX_V20_SlaveAddress); //发送器件地址,写数据
B_LUX_I2C_ReceiveAck();
B_LUX_I2C_SendByte(0x10); //发送字节
B_LUX_I2C_ReceiveAck();
B_LUX_I2C_Stop(); //产生一个停止条件
}
//收集采集的数据解析
void B_LUX_Receive_Date(u8 *pBuffer,u16 NumToRead)
{
B_LUX_I2C_Start();
B_LUX_I2C_SendByte(B_LUX_V20_SlaveAddress+1); //发送器件地址,读数据
B_LUX_I2C_ReceiveAck();
while(NumToRead--)
{
*pBuffer++=B_LUX_I2C_ReceiveByte();
if(NumToRead==0) //接收完毕,回复NACK
B_LUX_I2C_SendAck(1);
else
B_LUX_I2C_SendAck(0); //未接收完成,回复ACK
}
B_LUX_I2C_Stop();//产生一个停止条件
}
void B_Lux_Handle(void)
{
if(B_LUX_State==0)
{
B_LUX_State=1;
B_LUX_Send_Cmd();
}
else
{
B_LUX_State=0;
B_LUX_Receive_Date(B_LUX_Date,2);
B_LUX_Value=((B_LUX_Date[0]<<8)+B_LUX_Date[1])/1.2;
printf("B_LUX_Value=%.1f\r\n",B_LUX_Value);
}
}
void B_LUX_Init(void)
{
sun_light_gpio_init(); //软件iic端口初始化
B_LUX_WriteOneByte(0x01); //通电
}
补充
该模块初始化应先发送0x01给模块上电