0

我正在尝试通过 Ubuntu-16.04 上的 I²C 接口使用BH170FVI 传感器。我的电路板是UpSquared而不是 Raspberry。

为了能够使用 i2c 接口,我安装了i2c-tools. 我之前也用这个工具控制了BMI160传感器,没有遇到问题。

当我尝试使用以下命令在终端上检测我的传感器时:

i2cdetect -r -y 5

此命令正确检测到我的传感器,如下所示:

在此处输入图像描述

看来我的设备地址是0x23.

在此之后,当我尝试通过命令读取所有寄存器映射数据时:

i2cdump -y -f 5 0x23

结果是:

在此处输入图像描述

问题是所有地图地址都为零。其中至少有一个应读取光量。我以为传感器电源可能会关闭,但我尝试使用命令i2cset打开电源,但仍然没有任何变化。

注意:我的传感器没有问题,因为我使用 Arduino 以及以下代码进行了尝试:

#!/usr/bin/python
import smbus
import time
 
# Define some constants from the datasheet
DEVICE     = 0x23 # Default device I2C address
POWER_DOWN = 0x00 # No active state
POWER_ON   = 0x01 # Power on
RESET      = 0x07 # Reset data register value
ONE_TIME_HIGH_RES_MODE = 0x20
 
bus = smbus.SMBus(1)  # Rev 2 Pi uses 1
 
def convertToNumber(data):
  # Simple function to convert 2 bytes of data
  # into a decimal number
  return ((data[1] + (256 * data[0])) / 1.2)
 
def readLight(addr=DEVICE):
  data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE)
  return convertToNumber(data)
 
def main():
 
  while True:
    print "Light Level : " + str(readLight()) + " lux"
    time.sleep(0.5)
 
if __name__=="__main__":
   main()

我的问题是为什么我不能通过 on 控制我的传感器i2c-tools

4

2 回答 2

1

我认为@0andriy是对的。您需要一个驱动程序,一个库来接口它(更多详细信息在libiio 的“官方”用户文档中),在您的情况下使用 python 绑定和一些配置。在用户空间中,您可以使用 mraa/upm,但它不在您的 Ubuntu 中,因此您需要构建它。

建议的答案是使用内核中的驱动程序,创建一个小的 ACPI 表,告诉内核在总线 5 上的地址 0x23 上找到哪个设备。然后使用python-libiiolibiioC++ 绑定来访问该设备。可以加载到内核中的 ACPI 表的示例(提示:通过 ConfigFS)在这里https://github.com/westeri/meta-acpi/tree/master/recipes-bsp/acpi-tables/samples

在您的情况下,它将类似于:

DefinitionBlock ("bh1750.aml", "SSDT", 5, "", "BH1750", 1)
{
    External (_SB_.PCI0.I2C5, DeviceObj) // Define Correct I2C controller
    Scope (\_SB.PCI0.I2C5)
    {
        Device (ALS0)
        {
            Name (_HID, "PRP0001")
            Name (_DDN, "ROHM BH1750FVI ambient light sensor")
            Name (_CRS, ResourceTemplate () {
                    I2cSerialBus (
                            0x23,                   // I2C Address
                            ControllerInitiated, 
                            400000,                 // Bus Speed
                            AddressingMode7Bit,     
                            "\\_SB.PCI0.I2C5",
                            0x00,
                            ResourceConsumer,,)
            }
            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package () {
                    Package () {"compatible", "rohm,bh1750"},
                }
            })
        }
    }
}

...假设控制器的路径是\\_SB_.PCI0.I2C5(您可以在 DSDT 中找到它)。

@0andriy在评论中给出的链接,即在 x86_64 上添加 i2c 客户端设备在 Intel Atom 板上构建 i2c 设备控制器 和spidev Linux 驱动程序有更多信息如何编译和附加上表到您的系统。

于 2020-03-06T15:16:39.997 回答
0

据我所知,使用 i2c-tools 是不可能做到这一点的。问题是您需要从 BH1750 读取测量结果的方式。见数据表:

S Adr Rd (A) (Data) A (Data) NA P

您不能使用 i2c-tools 创建这样的序列:

  • 没有寄存器地址的一个字节
  • n个字节,但您必须提供一个寄存器地址

两者都会导致 I2C 命令序列不是芯片想要的。

它在用户空间的 C 语言中为我工作。在这里查看我的问题:

读取一个字(2 字节)而不提供来自用户空间的寄存器地址

于 2021-10-17T10:38:10.427 回答