一 扫描设备
查看手册 BH1750 光感模块 寄存器地址为 0x23
官方手册 :
http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf
su 然后用 i2cdetect 扫描设备:
拨,插 对比, 探测设备挂载在 /dev/i2c-5 上, 从设备地址为 0x23
二 读取寄存器值
资料包里只有 arduino , 51单片机, stm32 的驱动, 分析代码要点如下:
1 bh1750 设备 i2c 读写没有子寄存器, 即实现读写要直接向 0x23 设备发起 (i2cset , i2cget 用不了, 这两个工具都 要先写一下设备寄存器地址, 然后再读取)
2 bh1750 设备在读取光照值 之前需要 先写入读取模式配置值 , 然后delay 180 ms , 再读取
用 C 语言实现 arm-linux 下读取 bh1750 光感值 程序如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#define BH1750_POWER_DOWN 0x00
#define BH1750_ONE_TIME_H_RES_MODE 0x20 /* auto-mode for BH1721 */
#define BH1750_CHANGE_INT_TIME_H_BIT 0x40
#define BH1750_CHANGE_INT_TIME_L_BIT 0x60
int main() {
// 打开 I2C 设备
int fd = open("/dev/i2c-5", O_RDWR);
if (fd < 0) {
printf("Failed to open I2C device\n");
return -1;
}
// 设置 I2C 设备的地址
if (ioctl(fd, I2C_SLAVE, 0x23) < 0) {
printf("Failed to set I2C slave address\n");
return -1;
}
//预先设置读取模式
char write_buf[1] = {BH1750_ONE_TIME_H_RES_MODE};
write(fd, write_buf, 1);
usleep(200 * 1000); // sleep > 180ms
// 读取 2 个字节数据
char buf[2];
int ret = read(fd, buf, 2);
if (ret < 0) {
printf("Failed to read I2C data\n");
return -1;
}
// 关闭 I2C 设备
close(fd);
// 打印数据
printf("Data: %02x %02x\n", buf[0], buf[1]);
return 0;
}
编译执行:
aarch64-linux-gnu-gcc lux2.c -o lux23
执行结果, 已成功读取环境光感值 :
三 移植 bh1750 内核驱动,提供android 固件或应用层访问
上述方法不方便 android 应用层访问, 查看了对应的内核有 bh1750 iio 驱动的支持, 加载后可以通过文件系统访问
3.1 dts文件的配置
+ // hu-add
+ light-sensor@23 {
+ compatible = "rohm,bh1750";
+ reg = <0x23>;
+ };
三 后续工作
linux 内核支持 iio 接口来读取 光感驱动, 后续根据需要可以支持 iio 框架