三 BH1750 光感驱动调试1

一 扫描设备

查看手册 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 框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walletiger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值